【发布时间】:2020-01-28 14:01:47
【问题描述】:
我有一个包含三列的数据框,如下所示。
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())
通过使用上面的行,我得到下面的结果。它接近正确,但 904000 的 22 日的值应该是 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
【问题讨论】:
-
您希望返回作为差异还是百分比变化?
-
请百分比变化,pct_chnage() 给出正确答案
-
@Parfait 道歉,非常正确,我现在已经定义了一个回报