亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從具有堆疊價格的數據框中計算股票收益

從具有堆疊價格的數據框中計算股票收益

胡說叔叔 2022-07-12 16:19:41
我有一個包含三列的數據框,如下所示。  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 日價格)- 1stock    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
查看完整描述

4 回答

?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

只是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


查看完整回答
反對 回復 2022-07-12
?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

我會這樣做:


import pandas as pd

data = {'stock':['abc','efg','xyz','abc','efg','xyz','abc','efg','xyz'],'date':['2020-01-20','2020-01-20','2020-01-20','2020-01-21','2020-01-21','2020-01-21','2020-01-22','2020-01-22','2020-01-22'],'price':[101,202,303,102,242,403,204,420,422]}

df = pd.DataFrame(data)

df['return'] = df.groupby('stock')['price'].pct_change()

df = df.dropna(how='any')

print(df)

輸出:


  stock        date  price    return

3   abc  2020-01-21    102  0.009901

4   efg  2020-01-21    242  0.198020

5   xyz  2020-01-21    403  0.330033

6   abc  2020-01-22    204  1.000000

7   efg  2020-01-22    420  0.735537

8   xyz  2020-01-22    422  0.047146


查看完整回答
反對 回復 2022-07-12
?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

假設 df_ret 沒有索引,我會取消堆疊并重新堆疊。


df_ret.set_index(['date', 'stock'], inplace=True)

df_ret = df_ret.unstack(axis=0,level='stock')

rets = df_ret.pct_change()

rets=rets.stack()

rets.reset_index(inplace=True)


查看完整回答
反對 回復 2022-07-12
?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

試試這個簡單的解決方案:

df['change_in_pct'] = (df.price - df.price.shift(1)) /df.price


查看完整回答
反對 回復 2022-07-12
  • 4 回答
  • 0 關注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號