问题描述
想确认下技术分析指标中MA均线的计算公式,比如计算5日均线时,是选取check_date的前5日收盘价,还是check_date前4日的收盘价再加check_date当天的收盘价进行计算的?
解决方案
在 JoinQuant(聚宽)平台的技术分析指标库(jqlib.technical_analysis)中,计算 MA(移动平均线)等指标时,是包含 check_date 当天的数据的。
具体来说,当您计算 5日均线(MA5) 并指定了 check_date 时,系统选取的计算范围是:check_date 当天的收盘价 + check_date 往前推4个交易日的收盘价,总共 5 个交易日的收盘价来计算平均值。
详细原理解析
聚宽的技术分析指标库是基于通达信、同花顺等传统行情软件的公式逻辑编写的。在传统行情软件中,您在某一天(T日)看到的 5 日均线,必然是包含了 T 日当天的收盘价的。因此,check_date 就相当于这个 T 日。
- 计算公式:
MA5 = ( C(T) + C(T-1) + C(T-2) + C(T-3) + C(T-4) ) / 5 - 其中
C(T)就是check_date当天的收盘价。
代码验证示例
如果您想在策略或研究中手动验证或计算,可以使用 get_price 或 attribute_history 函数。以下是在研究环境中手动计算包含 check_date 当天的 5 日均线的示例:
from jqdata import *
# 设定我们要查询的日期和股票
check_date = '2023-10-10'
security = '000001.XSHE'
# 获取包含 check_date 在内的过去 5 个交易日的收盘价
# 注意:get_price 的 end_date 包含当天
df = get_price(security, end_date=check_date, count=5, frequency='1d', fields=['close'])
# 计算这 5 天的平均值
ma5_value = df['close'].mean()
print(f"{check_date} 的 5日均线价格为: {ma5_value}")
策略回测中的注意事项
如果您是在回测的 handle_data 中使用 data[security].mavg(5),需要注意:
handle_data是在盘中(如 9:30 - 15:00)运行的。- 此时当天的收盘价尚未产生,因此
mavg(5)计算时,使用的是**过去5天(不含今天)**的每天收盘价的平均值。 - 如果您希望在盘中计算包含当天最新价格的动态均线,需要手动获取前4天的收盘价,再加上
data[security].price(当前最新价)来求平均。
总结:调用技术指标库并传入 check_date 时,计算包含该日期当天的数据;而在回测盘中调用历史函数时,通常只包含到昨天的收盘价(除非明确获取分钟级或当前 tick 数据)。