首页 > 解决方案 > 从具有堆叠价格的数据框中计算股票收益

问题描述

我有一个包含三列的数据框,如下所示。

  stock    date         price
  abc      2020-01-20   102.3
  efg      2020-01-20   36.2
  xyz      2020-01-20   341
  abc      2020-01-21   102.3
  efg      2020-01-21   34.3
  xyz      2020-01-21   321
  abc      2020-01-22   104.1
  efg      2020-01-22   35.2
  xyz      2020-01-22   318

我想计算每只股票的每日收益,所以最终得到一个如下所示的数据框(请注意,我没有在这里计算收益,我只是放了一些随机数,显然 20 日不会有收益),

返回

股票一天的回报定义如下,

21 日股票 efg 的回报率 =(21 日价格 / 20 日价格)- 1

stock    date         return
  abc      2020-01-21   0
  efg      2020-01-21   -0.23
  xyz      2020-01-21   -1.53
  abc      2020-01-22   0.86
  efg      2020-01-22   0.15
  xyz      2020-01-22   -0.18

我试过下面的代码,

df_ret = pd.pivot_table(df_ret, values='price', index=['stock'], columns = 'date')   
df_ret = df_ret.transpose()
rets = df_ret.pct_change()
rets = rets.transpose()

rets 有正确的数据,但我需要上面第二个表格中显示的格式的数据。我不确定这样做的最佳方法是什么?

更新

df = df_ret.assign(ret = df_ret.groupby('stock')['price'].pct_change())

通过使用上面的行,我得到下面的结果。它接近正确,但 22 日 904000 的值应该是 nan。

   stock    date        price           ret
   903600   2020-01-22  11741.189956    nan
   903600   2020-01-23  11678.197357    -0.005365094955116612
   903600   2020-01-24  11683.808897    0.00048051422907646746
   903600   2020-01-27  11683.808897    0.0
   904000   2020-01-22  2017.933988    -0.8272880012169546
   904000   2020-01-23  1993.986017    -0.011867569079271667
   904000   2020-01-24  2012.609294    0.009339722967576014
   904000   2020-01-27  1975.147341   -0.01861362417021617

标签: pythonpandasdataframe

解决方案


只是groupby + pct_change工作:

final = df.assign(return_ = df.groupby('stock')['price'].pct_change())

  stock       date  price   return_
0   abc 2020-01-20  102.3       NaN
1   efg 2020-01-20   36.2       NaN
2   xyz 2020-01-20  341.0       NaN
3   abc 2020-01-21  102.3  0.000000
4   efg 2020-01-21   34.3 -0.052486
5   xyz 2020-01-21  321.0 -0.058651
6   abc 2020-01-22  104.1  0.017595
7   efg 2020-01-22   35.2  0.026239
8   xyz 2020-01-22  318.0 -0.009346

推荐阅读