问题描述
call_vba 怎么调用 周线周期 上一个周的 的 cci 值呢 ?
解决方案
在 QMT 平台的 Python API 中,虽然早期或某些特定公式系统中存在类似 call_vba 的调用方式,但在目前的 Python 策略开发中,最标准、最高效的做法是直接获取周线级别的历史数据,并使用平台内置的 TA-Lib 库来计算 CCI 指标。
要获取“上一周”的 CCI 值,您只需要获取周线(1w)数据,计算出 CCI 序列后,取数组的倒数第二个值(索引为 -2)即可(因为倒数第一个值是当前正在运行的这一周的值)。
Python 实现代码示例
以下是一个完整的 QMT 策略代码示例,演示如何获取周线周期上一周的 CCI 值:
#coding:gbk
import talib
import numpy as np
def init(ContextInfo):
# 设置需要计算的股票池,例如平安银行
ContextInfo.set_universe(['000001.SZ'])
def handlebar(ContextInfo):
# 确保只在最后一根 K 线执行,避免历史回测时重复打印过多信息
if not ContextInfo.is_last_bar():
return
stock_list = ContextInfo.get_universe()
for stock in stock_list:
# 1. 获取过去 30 周的最高、最低、收盘价数据
# period='1w' 表示获取周线数据
df = ContextInfo.get_market_data(['high', 'low', 'close'], stock_code=[stock], period='1w', count=30)
if df.empty or len(df) < 15:
print(f"{stock} 数据不足,无法计算 CCI")
continue
# 提取价格数组
high = df['high'].values
low = df['low'].values
close = df['close'].values
# 2. 使用 TA-Lib 计算 CCI 指标,默认时间周期通常为 14
cci = talib.CCI(high, low, close, timeperiod=14)
# 3. 获取上一周的 CCI 值
# cci[-1] 是本周(可能尚未走完)的 CCI
# cci[-2] 是上一周(已确定)的 CCI
if len(cci) >= 2 and not np.isnan(cci[-2]):
last_week_cci = cci[-2]
print(f"{stock} 上一周的 CCI 值为: {last_week_cci:.4f}")
else:
print(f"{stock} CCI 计算结果无效")
代码原理解析:
ContextInfo.get_market_data:通过设置period='1w',直接向 QMT 底层请求周线级别的数据。count=30保证了有足够的数据点供TA-Lib计算(CCI 周期为 14 时,至少需要 14 个数据点才能产出第一个有效值)。talib.CCI:QMT 平台内置了TA-Lib库,这是量化界最权威的技术指标库。传入最高价、最低价、收盘价即可快速计算出 CCI 序列。- 索引
-2:在量化数据序列中,最新的数据(本周)在最后一位(索引-1)。由于本周可能还在交易中,K 线未走完,其 CCI 值是动态变化的。因此,上一周的固定 CCI 值对应的索引是-2。
这种方法比传统的 call_vba 更加灵活,且计算速度极快,非常适合在 QMT 的 Python 环境中使用。