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

如何用Python从股票价格DataFrame生成对数收益率DataFrame?

高效计算股票对数收益率并保留DataFrame格式

问题背景

你有一个包含日期(2022年9月30日至2022年11月30日,不含周末)和15只股票价格的DataFrame,希望避免逐列提取向量计算,用更高效的方式将价格替换为对数收益率,同时保留原表格结构。

示例数据

DateABCDE
30/09/22100.5151.3233.4237.238.42
01/10/22101.5148.0237.6232.238.54
02/10/22102.2147.6238.3231.439.32
03/10/22103.4145.7239.2232.239.54

高效解决方案

利用Pandas的向量化操作(基于NumPy)可以一次性处理所有股票列,无需逐列循环,效率远高于手动提取向量计算。

步骤1:确保日期列格式正确

先将Date列转换为datetime类型(如果尚未转换):

import pandas as pd
import numpy as np

# 假设你的DataFrame名为df
df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%y')

步骤2:批量计算对数收益率

对数收益率公式为:$r_t = \ln(P_t) - \ln(P_{t-1}) = \ln(P_t / P_{t-1})$,直接对所有股票列执行向量化运算:

# 筛选出所有股票列(排除Date列)
stock_columns = df.columns.drop('Date')

# 批量替换为对数收益率
df[stock_columns] = np.log(df[stock_columns]) - np.log(df[stock_columns].shift(1))

# 等价的简洁写法
# df[stock_columns] = np.log(df[stock_columns].div(df[stock_columns].shift(1)))

步骤3:处理首行NaN值

由于第一行没有前一日数据,计算后会生成NaN,可根据需求选择处理方式:

# 方式1:删除首行(无有效收益率数据)
df = df.dropna()

# 方式2:用0填充首行NaN(适合需要保留完整日期序列的场景)
df[stock_columns] = df[stock_columns].fillna(0)

说明

  • 向量化操作避免了Python循环的性能损耗,处理15只股票甚至更多时效率优势明显
  • 计算后完全保留原DataFrame的结构,仅替换价格数据为对数收益率

内容的提问来源于stack exchange,提问作者Guillem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:35:21