问题描述
解决方案
在 JoinQuant 的 handle_data 函数中,最快速且代码最简洁的方法是直接使用 data 对象(即 SecurityUnitData 对象)自带的方法。此外,也可以使用 attribute_history 获取数据后通过 Pandas 进行计算。
以下是两种主要方法的详细说明和代码示例。
方法一:使用 SecurityUnitData 自带方法(推荐,最快)
handle_data(context, data) 中的 data 参数是一个字典,包含了股票的 SecurityUnitData 对象。该对象内置了 mavg(移动平均)和 stddev(标准差)方法,底层经过优化,计算速度快且代码极其简洁。
- 均值:
data[security].mavg(days, field='close') - 标准差:
data[security].stddev(days)
代码示例:
# -*- coding: utf-8 -*-
def initialize(context):
g.security = '000001.XSHE'
set_benchmark('000300.XSHG')
def handle_data(context, data):
security = g.security
# 1. 计算过去5天的收盘价均值
# field 默认为 'close',也可以是 'open', 'high', 'low' 等
ma5 = data[security].mavg(5, field='close')
# 2. 计算过去5天的收盘价标准差
std5 = data[security].stddev(5)
log.info("股票: %s, 5日均价: %.2f, 5日标准差: %.2f" % (security, ma5, std5))
注意: mavg 和 stddev 会自动跳过停牌日期。如果历史交易天数不足(例如刚上市),则返回 nan。
方法二:使用 attribute_history 配合 Pandas(通用性强)
如果你需要进行更复杂的统计计算,或者需要同时获取多个字段的数据,可以使用 attribute_history 获取 DataFrame,然后利用 Pandas 的 .mean() 和 .std() 方法。
代码示例:
# -*- coding: utf-8 -*-
def initialize(context):
g.security = '000001.XSHE'
set_benchmark('000300.XSHG')
def handle_data(context, data):
security = g.security
# 获取过去5天的收盘价数据(返回 DataFrame)
# 注意:attribute_history 获取的是不包含当前单位时间的历史数据
his_data = attribute_history(security, 5, unit='1d', fields=['close'])
# 1. 计算均值
ma5 = his_data['close'].mean()
# 2. 计算标准差
std5 = his_data['close'].std()
log.info("股票: %s, 5日均价: %.2f, 5日标准差: %.2f" % (security, ma5, std5))
总结
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| data[s].mavg/stddev | 速度快,代码最少,无需引入额外库 | 功能单一,只能算均值和标准差 | 仅需简单的均线或波动率计算 |
| attribute_history | 灵活,返回 DataFrame,可做任意复杂计算 | 代码稍多,性能略低于内置方法 | 需要复杂统计分析或多字段计算 |
Q&A
Q: data[security].mavg(5) 包含当天的数据吗?
A: 在按天回测模式下,handle_data 中的 data 对象通常包含前一个单位时间的数据。但在计算 mavg 时,它获取的是过去 5 天的数据。具体的包含情况取决于回测频率(天/分钟)和调用时间,通常用于获取历史趋势。
Q: 如果股票停牌了,mavg 会怎么计算?
A: SecurityUnitData 的 mavg 和 stddev 方法会自动跳过停牌日期,只统计实际有交易的日期。
Q: attribute_history 和 history 有什么区别?
A: attribute_history 用于获取单只股票的多个属性(如 open, close),返回 DataFrame;history 用于获取多只股票的单个属性(如所有股票的 close),返回 DataFrame 或 Dict。计算单只股票指标时,推荐使用 attribute_history。