问题描述
量化新手,想问问各路大神如何在notebook计算对数收益率?没有在聚宽找到相关的计算教程,新手教程里的收益率计算最后得到的是指数平均移动曲线,也没有涉及到对数收益率的计算
解决方案
你好!欢迎来到量化交易的世界。在JoinQuant(聚宽)的Notebook(研究环境)中计算对数收益率其实非常简单,主要借助Python强大的数据处理库Pandas和数学计算库Numpy来实现。
为什么使用对数收益率?
在量化金融中,对数收益率(Log Return)比普通收益率(简单收益率)更常用,主要原因包括:
- 时间可加性:多期的对数收益率可以直接相加,而简单收益率需要相乘。
- 统计特性:对数收益率通常更接近正态分布,便于进行统计建模。
计算公式
对数收益率的公式为:
R_t = ln(P_t / P_{t-1}) = ln(P_t) - ln(P_{t-1})
其中,P_t 是当期价格,P_{t-1} 是上一期价格。
Notebook 实现步骤与代码
以下是一段可以直接在聚宽 Notebook 中运行的完整代码示例:
# 1. 导入必要的库
import jqdata
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 2. 设置参数
security = '000001.XSHE' # 以平安银行为例
start_date = '2023-01-01'
end_date = '2023-12-31'
# 3. 获取历史收盘价数据
# 使用 get_price 函数获取前复权收盘价
df = get_price(security, start_date=start_date, end_date=end_date, frequency='daily', fields=['close'])
# 4. 计算对数收益率
# 方法一:使用 np.log 和 shift
# df['log_return'] = np.log(df['close'] / df['close'].shift(1))
# 方法二:使用 np.log 和 diff (更简洁)
df['log_return'] = np.log(df['close']).diff()
# 去除第一行的 NaN 值
df = df.dropna()
# 5. 查看结果
print("前5行数据展示:")
print(df.head())
# 6. 可视化对数收益率
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['log_return'], label='Log Return', color='blue')
plt.title(f'{security} 每日对数收益率')
plt.xlabel('Date')
plt.ylabel('Log Return')
plt.legend()
plt.grid(True)
plt.show()
代码原理解析:
get_price:这是聚宽获取历史行情的API。我们获取了平安银行在指定时间段内的每日收盘价(默认前复权,适合计算收益率)。np.log(df['close']):利用 Numpy 对收盘价序列取自然对数。.diff():Pandas 的diff()函数用于计算当前行与上一行的差值。结合上一步,这就实现了ln(P_t) - ln(P_{t-1})的计算。.dropna():因为第一天没有前一天的价格来计算收益率,所以计算结果会是NaN(空值),我们用dropna()将其剔除。
你可以直接将这段代码复制到聚宽的 Notebook 单元格中运行。掌握了这个基础后,你就可以进一步计算波动率、夏普比率等更高级的量化指标了!