3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
VWAP(Volume-Weighted Average Price,成交量加权平均价)是日内交易中非常重要的基准指标。基于 VWAP 构建的动态上下轨(类似布林带),可以有效捕捉日内强弱趋势的突破行情。
#coding:gbk
import numpy as np
import pandas as pd
def init(ContextInfo):
# 设置标的与资金
ContextInfo.stock = '600000.SH'
ContextInfo.set_universe([ContextInfo.stock])
ContextInfo.set_account('10000001')
# 策略参数
ContextInfo.std_dev_multiplier = 1.5 # 标准差倍数
ContextInfo.hold_stock = False # 持仓状态
print("VWAP 区间突破策略初始化完成。")
def handlebar(ContextInfo):
# 仅在最后一根 Bar 或盘中实时运行
if not ContextInfo.is_last_bar():
return
# 获取当前 K 线索引及时间
bar_idx = ContextInfo.barpos
timetag = ContextInfo.get_bar_timetag(bar_idx)
# 获取当日分钟分钟行情数据
data = ContextInfo.get_market_data_ex(
fields=['close', 'volume', 'amount'],
stock_code=[ContextInfo.stock],
period='1m',
count=240
)
if ContextInfo.stock not in data or data[ContextInfo.stock].empty:
return
df = data[ContextInfo.stock]
# 计算日内累积 VWAP
cum_volume = df['volume'].cumsum()
cum_amount = df['amount'].cumsum()
# 避免除以零
cum_volume = cum_volume.replace(0, np.nan)
df['vwap'] = cum_amount / cum_volume
# 计算偏离标准差
std = (df['close'] - df['vwap']).std()
df['upper_band'] = df['vwap'] + ContextInfo.std_dev_multiplier * std
df['lower_band'] = df['vwap'] - ContextInfo.std_dev_multiplier * std
latest_close = df['close'].iloc[-1]
latest_vwap = df['vwap'].iloc[-1]
latest_upper = df['upper_band'].iloc[-1]
# 获取交易时间 (HHMMSS)
import time
time_str = time.strftime('%H%M%S', time.localtime(timetag / 1000))
# 尾盘平仓控制 (14:55 以后平仓避险)
if time_str >= '145500':
if ContextInfo.hold_stock:
passorder(24, 1101, ContextInfo.account, ContextInfo.stock, 5, -1, 100, ContextInfo)
ContextInfo.hold_stock = False
print(f"[{time_str}] 尾盘平仓离场")
return
# 交易信号判定
if not ContextInfo.hold_stock and latest_close > latest_upper:
# 向上突破上轨,买入开仓 100 股
passorder(23, 1101, ContextInfo.account, ContextInfo.stock, 5, -1, 100, ContextInfo)
ContextInfo.hold_stock = True
print(f"[{time_str}] 突破 VWAP 上轨,触发买入信号。最新价: {latest_close}, 上轨: {latest_upper:.2f}")
elif ContextInfo.hold_stock and latest_close < latest_vwap:
# 跌破 VWAP 中轨,止盈/止损平仓
passorder(24, 1101, ContextInfo.account, ContextInfo.stock, 5, -1, 100, ContextInfo)
ContextInfo.hold_stock = False
print(f"[{time_str}] 跌破 VWAP 中轨,触发卖出信号。最新价: {latest_close}, VWAP: {latest_vwap:.2f}")
get_market_data_ex 获取 1 分钟周期行情,确保日内成交量与成交额的精度。get_market_data_ex 订阅 l2quoteaux)对突破信号进行二次确认,降低假突破率。