3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在日内量化交易中,内外盘数据是衡量多空双方即时力量对比的核心指标。外盘(Active Buy)代表主动买入盘,外盘越大说明买方意愿越强烈;内盘(Active Sell)代表主动卖出盘,内盘越大说明卖方抛压越重。
QMT平台提供了 ContextInfo.get_svol() 和 ContextInfo.get_bvol() 接口,允许开发者实时获取个股的内盘和外盘成交量。本文将指导您如何结合这两个接口,编写一个经典的日内内外盘动量突破策略。
动量指标构建:
我们定义一个外盘占比指标(BVOL_Ratio):
$$\text{BVOL_Ratio} = \frac{\text{BVOL}}{\text{BVOL} + \text{SVOL}}$$
日内过滤:
09:45 至 14:45 之间进行交易,避开开盘剧烈波动期,并在尾盘前强制平仓。以下是完整的策略代码。请注意,由于 get_svol 和 get_bvol 返回的是字符串格式,代码中进行了安全的数值转换处理。
#coding:gbk
import datetime
def init(ContextInfo):
# 设定标的与交易账号
ContextInfo.stock = '600000.SH' # 浦发银行
ContextInfo.set_universe([ContextInfo.stock])
ContextInfo.accid = '6000000248' # 请替换为您的实际资金账号
ContextInfo.set_account(ContextInfo.accid)
# 策略参数设置
ContextInfo.buy_threshold = 0.60 # 买入外盘占比阈值
ContextInfo.sell_threshold = 0.40 # 平仓外盘占比阈值
ContextInfo.trade_volume = 100 # 每次交易股数
ContextInfo.holding = 0 # 虚拟持仓记录
def handlebar(ContextInfo):
if not ContextInfo.is_last_bar():
return
stock = ContextInfo.stock
# 1. 获取当前时间
tick_time = ContextInfo.get_tick_timetag()
time_str = timetag_to_datetime(tick_time, '%H%M%S')
int_time = int(time_str)
# 2. 获取内外盘数据
svol_str = ContextInfo.get_svol(stock)
bvol_str = ContextInfo.get_bvol(stock)
try:
svol = float(svol_str) if svol_str else 0.0
bvol = float(bvol_str) if bvol_str else 0.0
except ValueError:
return # 防止数据未准备好时转换报错
total_vol = bvol + svol
if total_vol == 0:
return
# 3. 计算外盘占比
bvol_ratio = bvol / total_vol
# 4. 交易逻辑执行 (日内时间窗口:09:45 - 14:45)
if 94500 <= int_time <= 144500:
# 多头突破买入
if bvol_ratio >= ContextInfo.buy_threshold and ContextInfo.holding == 0:
print(f"[{time_str}] 外盘占比 {bvol_ratio:.2f} 突破上限,买入 {stock}")
order_shares(stock, ContextInfo.trade_volume, 'LATEST', 0, ContextInfo, ContextInfo.accid)
ContextInfo.holding += ContextInfo.trade_volume
# 空头动量平仓
elif bvol_ratio <= ContextInfo.sell_threshold and ContextInfo.holding > 0:
print(f"[{time_str}] 外盘占比 {bvol_ratio:.2f} 跌破下限,平仓 {stock}")
order_shares(stock, -ContextInfo.holding, 'LATEST', 0, ContextInfo, ContextInfo.accid)
ContextInfo.holding = 0
# 5. 尾盘强制平仓 (14:50 之后)
elif int_time >= 145000 and ContextInfo.holding > 0:
print(f"[{time_str}] 尾盘强制平仓 {stock}")
order_shares(stock, -ContextInfo.holding, 'LATEST', 0, ContextInfo, ContextInfo.accid)
ContextInfo.holding = 0
ContextInfo.get_svol(stockcode):获取指定股票的内盘成交量(主动卖出量)。ContextInfo.get_bvol(stockcode):获取指定股票的外盘成交量(主动买入量)。order_shares(stockcode, shares, style, price, ContextInfo, accId):指定股数交易函数。正数代表买入,负数代表卖出。本策略采用 'LATEST'(最新价)快速撮合。0.6 和 0.4 是固定阈值,实盘中可以根据个股过去5天的平均内外盘比例进行动态标准差(Bollinger Band 思想)计算。09:45 启动时间能有效过滤开盘噪音。