问题描述
大 mqt,调用模型:call_formula 去用 MA 指标, 显示错误:name 'call_formula' is not defined
请教下是什么原因导致的? 谢谢
解决方案
报错原因分析
在 QMT(大智慧/国信等券商定制版)量化平台中,出现 name 'call_formula' is not defined 错误的原因是:QMT 的官方 Python API 中并没有内置 call_formula 这个函数。
call_formula 通常是其他量化平台(如 PTrade)中用来直接调用公式指标的函数。在 QMT 中,获取技术指标(如 MA 移动平均线)的逻辑与此不同。QMT 鼓励用户通过获取基础的 K 线数据(如收盘价),然后利用 Python 强大的第三方数据分析库(如 pandas 或 TA-Lib)来自行计算指标。
QMT 中正确计算 MA(移动平均线)的方法
根据 QMT 官方文档,平台已经内置了 pandas 和 TA_Lib 等第三方库。你可以通过 ContextInfo.get_market_data_ex 或 ContextInfo.get_history_data 获取历史收盘价,然后计算 MA。
方法一:使用内置的 TA-Lib 库计算 MA(推荐)
TA-Lib 是专门用于技术分析的库,计算速度快,QMT 默认已内置。
#coding:gbk
import talib
import numpy as np
def init(ContextInfo):
# 设置股票池,例如平安银行
ContextInfo.set_universe(['000001.SZ'])
def handlebar(ContextInfo):
# 获取当前股票池的收盘价数据,获取过去20根日线
# 注意:get_market_data 返回的是 pandas.DataFrame 或 pandas.Series
df = ContextInfo.get_market_data(['close'], stock_code=ContextInfo.get_universe(), period='1d', count=20)
if df.empty:
return
# 提取收盘价序列
close_prices = df['close'].values
# 确保数据长度足够计算 MA5
if len(close_prices) >= 5:
# 使用 talib 计算简单移动平均线 (SMA 即 MA)
ma5 = talib.SMA(close_prices, timeperiod=5)
# 打印最新的一根 MA5 的值
print("最新 MA5 值为:", ma5[-1])
方法二:使用 pandas 计算 MA
如果你更习惯使用 pandas 的滚动窗口函数,也可以直接计算:
#coding:gbk
import pandas as pd
def init(ContextInfo):
ContextInfo.set_universe(['000001.SZ'])
def handlebar(ContextInfo):
# 获取历史收盘价
df = ContextInfo.get_market_data(['close'], stock_code=ContextInfo.get_universe(), period='1d', count=20)
if df.empty:
return
# 使用 pandas 的 rolling 函数计算 MA5
# df['close'] 是一个 Series
ma5_series = df['close'].rolling(window=5).mean()
# 获取最新的 MA5 值
latest_ma5 = ma5_series.iloc[-1]
print("最新 MA5 值为:", latest_ma5)
总结
在 QMT 中编写策略时,请摒弃其他平台“直接调用指标公式”的思维。QMT 的核心逻辑是:取数据 -> 用 Python 库算指标 -> 产生信号 -> 下单。熟练掌握 pandas 和 TA-Lib 将极大提升你在 QMT 平台上的策略开发效率。