🚀 AI 一键生成 joinquant 策略代码

JoinQuant 数据处理:使用 mavg 和 stddev 计算滚动均值与标准差

joinquant | 发布时间: 2025/12/19
以下内容由 EasyQuant 生成。

问题描述

在 handle_data 中如何快速计算过去几天的收盘价均值和标准差?

解决方案

在 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))

注意: mavgstddev 会自动跳过停牌日期。如果历史交易天数不足(例如刚上市),则返回 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: SecurityUnitDatamavgstddev 方法会自动跳过停牌日期,只统计实际有交易的日期。

Q: attribute_historyhistory 有什么区别?
A: attribute_history 用于获取单只股票的多个属性(如 open, close),返回 DataFrame;history 用于获取多只股票的单个属性(如所有股票的 close),返回 DataFrame 或 Dict。计算单只股票指标时,推荐使用 attribute_history