如何按组计算DataFrame中各股票的每日对数收益率?
计算每只股票的每日对数收益率
我来帮你搞定这个每日对数收益率的计算问题~首先咱们得明确核心逻辑:每日对数收益率 = 自然对数(当日收盘价 / 前一日收盘价),而且必须按每只股票单独计算,绝对不能把不同股票的价格混在一起对比。
步骤1:先还原示例中的DataFrame
先把你给出的示例数据转换成可运行的代码,方便后续复现操作:
import pandas as pd import numpy as np # 构造示例DataFrame data = { 'date': ['2018-01-01', '2018-01-02', '2018-01-03']*3, 'price': [1.323, 1.525, 1.045, 2.110, 2.150, 2.810, 5.199, 4.980, 4.990], 'ticker': ['AI']*3 + ['BOC']*3 + ['CAT']*3, 'volume': [2000, 1500, 500, 3201, 5200, 1980, 2000, 450, 3000] } df = pd.DataFrame(data) # 把date列转换成日期格式,确保时间顺序正确 df['date'] = pd.to_datetime(df['date'])
步骤2:按股票分组计算对数收益率
核心操作是用groupby('ticker')把数据按股票拆分,然后对每组的price列单独计算对数收益率:
# 添加每日对数收益率列 df['log_return'] = df.groupby('ticker')['price'].apply(lambda x: np.log(x / x.shift(1)))
步骤3:查看最终结果
运行完上面的代码后,你的DataFrame会新增一列log_return,其中每只股票的第一天(2018-01-01)因为没有前一日数据,所以值为NaN,这是完全正常的。最终结果大概是这样的:
date price ticker volume log_return 0 2018-01-01 1.323 AI 2000 NaN 1 2018-01-02 1.525 AI 1500 0.139837 2 2018-01-03 1.045 AI 500 -0.385717 3 2018-01-01 2.110 BOC 3201 NaN 4 2018-01-02 2.150 BOC 5200 0.018775 5 2018-01-03 2.810 BOC 1980 0.270024 6 2018-01-01 5.199 CAT 2000 NaN 7 2018-01-02 4.980 CAT 450 -0.043214 8 2018-01-03 4.990 CAT 3000 0.002006
补充小提示
- 一定要按
ticker分组!如果跳过分组直接计算,会出现把AI的第二天价格和CAT的第一天价格对比的错误,完全不符合业务逻辑。 - 如果需要把第一天的NaN替换成0或者其他值,可以用
df['log_return'] = df['log_return'].fillna(0),不过通常保留NaN更合理,因为第一天确实没有收益率数据。
内容的提问来源于stack exchange,提问作者cqstack
相关产品推荐
相关产品推荐

