【问题标题】:python pandas portfolio returnpython pandas 投资组合回报
【发布时间】:2018-01-26 05:22:35
【问题描述】:

我有一个包含市场数据的数据框和一个专门用于每日回报的列。 我很难创建一个价值为 100,000.00 美元的投资组合,并在数据系列的整个生命周期内计算其累积回报。

理想情况下,我想使用 pandas 计算“投资组合”列,但这样做时遇到了麻烦。请参阅下面的目标输出。谢谢。

index    date      index  return  portfolio
0        19900101  2000   Nan     100000.00
1        19900102  2002   0.001   100100.00
2        19900103  2020   0.00899 100999.90 
3        19900104  2001  -0.00941 100049.49

【问题讨论】:

  • 不应该简单总结一下return栏目吗?
  • @WillemVanOnsem 你不能对回报求和(假设简单回报而不是对数),它们需要复合。

标签: python pandas finance


【解决方案1】:

通过使用cumprod

df['P']=df['return'].add(1).fillna(1).cumprod()*100000
df
Out[843]: 
   index      date  index.1   return  portfolio             P
0      0  19900101     2000      NaN  100000.00  100000.00000
1      1  19900102     2002  0.00100  100100.00  100100.00000
2      2  19900103     2020  0.00899  100999.90  100999.89900
3      3  19900104     2001 -0.00941  100049.49  100049.48995

一些调整:

df=df.replace('Nan',np.nan)
df['return']=pd.to_numeric(df['return'])

【讨论】:

  • 是否有一个很好的资源来可视化这个公式中发生的事情?具体来说,由于某种原因将我们的起始值相乘会导致在整个过程中看到累积值相乘时出现心理障碍......而不是那个常数...... ty!
  • @antonio_zeus 你提到了 return ,return 是相对于先前值的百分比变化(不是初始值)
【解决方案2】:
starting_value = 100000
df = df.assign(portfolio=(1 + df['return'].fillna(0)).cumprod().mul(starting_value))
>>> df
   index      date  index.1   return     portfolio
0      0  19900101     2000      NaN  100000.00000
1      1  19900102     2002  0.00100  100100.00000
2      2  19900103     2020  0.00899  100999.89900
3      3  19900104     2001 -0.00941  100049.48995

为了可视化正在发生的事情,cumprod 正在计算复合回报,例如cum_r3 = (1 + r1) * (1 + r2) * (1 + r3).

>>> (1 + df['return'].fillna(0)).cumprod()
0    1.000000
1    1.001000
2    1.009999
3    1.000495
Name: return, dtype: float64

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-27
    • 2018-02-19
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 2019-09-30
    相关资源
    最近更新 更多