You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按组计算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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:15:52