问题描述
函数history(count, unit='1d', field='avg', security_list=None, df=True, skip_paused=False, fq='pre')中的'avg'是取count天的平均值吗?如果count=50,得到的是50个50天avg值吗?如果不是,'avg'是取多少天的平均值?
解决方案
不是的,history 函数中的 'avg' 并不是指过去 N 天的移动平均值。
在 JoinQuant 的 API 中,'avg' 代表的是单个单位时间(例如1天或1分钟)内的平均成交价。
具体解释如下:
-
'avg' 的计算逻辑:
- 天级别(
unit='1d'):avg= 当天的总成交额 / 当天的总成交量。它代表的是这一天之内的平均交易价格(日内均价)。 - 分钟级别(
unit='1m'):avg= 该分钟内所有 tick 的现价乘以成交量之和 / 该分钟的总成交量。它代表的是这一分钟之内的平均交易价格。
- 天级别(
-
当
count=50时会得到什么?
如果您调用history(50, unit='1d', field='avg', ...),您得到的将是过去 50 个交易日,每一天各自的日内均价。返回的数据长度为 50,代表 50 个单日的均价,而不是 50 个“50天移动平均值”。
如果您想获取移动平均价(如 50 日均线 MA50),应该怎么做?
如果您需要计算过去 50 天的移动平均价,正确的做法是获取过去 50 天的收盘价(close),然后对其求平均值:
# 获取过去 50 天的收盘价
close_data = history(50, unit='1d', field='close', security_list=['000001.XSHE'])
# 计算这 50 天收盘价的平均值(即当前的 MA50)
ma50 = close_data['000001.XSHE'].mean()
或者,如果您在 handle_data 中使用 data 对象,可以直接调用 mavg 方法:
def handle_data(context, data):
# 获取过去 50 天收盘价的平均值
ma50 = data['000001.XSHE'].mavg(50, field='close')
总结:field='avg' 取的是单个 K 线 Bar(1天或1分钟)内部的均价,与 count 参数无关;要算多日的移动平均线,请取 close 价格后再使用 .mean() 计算。