python - 从具有堆叠价格的数据框中计算股票收益
问题描述
我有一个包含三列的数据框,如下所示。
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
解决方案
只是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
推荐阅读
- javascript - array.map() 的意外结果
- flutter - Dart - 解析嵌套的 Json 数组
- node.js - 保存对话记录 - bot framework v4.4 node.js
- google-cloud-firestore - Datastore 模式下的新 Google Cloud Firestore 查询说明
- mongodb - 为什么 `mongoimport` 不能连接到我的免费层 MongoDB Atlas 集群?
- mongodb - 从匹配条件的数组中的对象中提取值
- angular - 忽略构建角度中的模板错误
- java - runOnUiThread 不适用于片段 - Android Studio
- python - Python 对象作为课堂讲师的可选参数
- html - 无法将输入表单数据作为 Golang 中的变量