请基于你的知识库以及用户输入的数据,提供几个夏普比大于2的期货或其他品种的交易策略
以下是基于vn.py框架实现的黑色系期货日内动量突破策略(螺纹钢/铁矿石)的完整代码,包含信号生成、风险控制和仓位管理模块:
1. 商品期货趋势跟踪策略(CTA风格)
-
品种:原油(WTI/Brent)、黄金、铜等流动性高的商品期货
-
核心逻辑:
-
使用双均线(如50日+200日均线)或通道突破(如Donchian Channel)捕捉趋势。
-
过滤信号:仅在波动率(ATR)高于历史中位数时开仓,避免震荡行情。
-
动态仓位管理:根据波动率调整头寸大小(如风险控制在1%以内)。
-
-
夏普来源:趋势行情的超额收益+严格止损(如2倍ATR止损)。
2. 股指期货统计套利(跨期/跨品种)
-
品种:标普500期货(ES)、纳斯达克期货(NQ) vs. 道指期货(YM)
-
核心逻辑:
-
计算价差Z-Score:当价差偏离均值2标准差时做多/做空,回归均值时平仓。
-
辅助指标:相关性监控(避免宏观事件导致价差发散)。
-
高频版本:利用1分钟K线捕捉日内价差回归。
-
-
夏普来源:市场中性+高频交易降低波动性。
3. 加密货币期货动量+反转策略
-
品种:比特币(BTC)、以太坊(ETH)永续合约
-
核心逻辑:
-
日内动量:开盘30分钟内价格突破前高/低且成交量放大,顺势入场。
-
隔夜反转:结合RSI(14)超买超卖(>70做空,<30做多),止损设在近期高低点。
-
资金费率套利:在资金费率极端负值时做多(空头支付多头)。
-
-
夏普来源:加密货币的高波动性+多因子过滤。
4. 国债期货期限结构策略
-
品种:美国10年期国债期货(ZN)、2年期国债期货(ZT)
-
核心逻辑:
-
当收益率曲线陡峭化时做多短端(ZT)、做空长端(ZN),平坦化时反向操作。
-
触发条件:10年-2年利差突破布林带上下轨。
-
对冲工具:加入VIX期货控制风险偏好变化的影响。
-
-
夏普来源:宏观经济逻辑驱动+低相关性资产组合。
5. 农产品季节性套利
-
品种:大豆(ZS) vs. 玉米(ZC)期货
-
核心逻辑:
-
历史季节性分析:每年5-6月做多大豆/做空玉米(种植面积切换窗口)。
-
基本面验证:USDA报告发布前后调整仓位。
-
止损规则:若价差在3个交易日内不利变动2%,则平仓。
-
-
夏普来源:季节性规律+严格时间窗口控制。
关键优化点(提升夏普比率)
-
过滤假信号:加入波动率、成交量或宏观经济事件日历过滤。
-
动态止损:根据品种特性设置移动止损(如追踪止损)。
-
多周期确认:结合日线趋势和小时线入场点。
-
组合分散:多品种、多策略组合降低回撤。
请基于你的知识库以及用户输入的数据,提供几个夏普比大于2的适用于中国期货的交易策略
策略1:黑色系期货日内动量突破(适用于螺纹钢、铁矿石)
品种
螺纹钢(RB)、铁矿石(I)(流动性高,波动大)
核心逻辑
-
信号生成:
-
5分钟K线,价格突破前2小时最高价且成交量>20日均量1.5倍时做多(反向同理)。
-
过滤条件:仅在大商所铁矿石库存周环比下降时参与做多(基本面验证)。
-
-
止损止盈:
-
固定止损0.5%(螺纹钢波动较小),动态止盈(3倍ATR追踪止损)。
-
-
时间窗口:
-
仅交易上午10:00-11:30和下午13:30-15:00(避免夜盘流动性不足)。
-
夏普来源
-
黑色系受政策(如限产)驱动趋势性强,日内动量效应显著。
策略2:化工品跨期套利(适用于PTA、甲醇)
品种组合
PTA(TA)主力合约 vs. 次主力合约(价差套利)
核心逻辑
-
价差统计:
-
计算主力-次主力合约价差的10日Z-Score,当Z>2时做空价差(做多次主力/做空主力),Z<-2时反向操作。
-
-
基本面过滤:
-
PTA加工费(PX价差)<300元/吨时,禁止做空主力合约(成本支撑)。
-
-
平仓条件:
-
价差回归至20日均线或持仓超过5个交易日强制离场。
-
夏普来源
-
化工品合约换月时机构调仓带来的价差回归机会。
策略3:农产品季节性+天气驱动(适用于豆粕、棕榈油)
品种
豆粕(M)、棕榈油(P)(受外盘和天气影响大)
核心逻辑
-
季节性窗口:
-
每年7-8月做多豆粕(北美干旱炒作)+做空棕榈油(东南亚增产季)。
-
-
事件触发:
-
USDA报告发布后,若单产下调超2%,立即做多豆粕(次日开盘入场)。
-
-
对冲管理:
-
棕榈油头寸需匹配马来西亚BMD期货夜盘波动(避免隔夜跳空风险)。
-
夏普来源
-
农产品供需错配的爆发性行情+季节性规律稳定。
策略4:股指期货隔夜反转(适用于沪深300股指期货)
品种
沪深300股指期货(IF)
核心逻辑
-
反转信号:
-
当日收盘价跌幅>2%且成交量放大,次日开盘做多(超跌反弹)。
-
-
过滤条件:
-
仅当陆股通北向资金当日净流入>50亿元时触发(外资抄底信号)。
-
-
离场规则:
-
持仓不超过3天,盈利达1.5%或亏损达1%时平仓。
-
夏普来源
-
A股“过度反应-修正”特性显著,北向资金增强信号可靠性。
策略5:贵金属避险对冲(适用于黄金、白银)
品种
黄金(AU)、白银(AG)(上期所)
核心逻辑
-
趋势跟随:
-
当沪金价格突破60日均线且人民币汇率贬值>0.5%时做多(双重驱动)。
-
-
对冲组合:
-
做多黄金同时做空沪深300期货(股灾避险组合)。
-
-
波动控制:
-
黄金仓位权重=1/(20日波动率),动态调整。
-
夏普来源
-
黄金与权益资产的负相关性+人民币汇率波动放大收益。
关键优化点(中国特有问题)
-
主力合约换月:
-
提前5天移仓至次主力合约(避免交割月流动性风险)。
-
-
涨跌停板:
-
触发涨跌停时,立即平仓同方向头寸(防止次日极端跳空)。
-
-
政策监控:
-
交易所提保、手续费调整等公告发布后暂停策略1天。
-
-
数据源:
-
使用Wind或国泰君安数据获取库存、开工率等本土指标。
-
from vnpy.app.cta_strategy import (
CtaTemplate,
StopOrder,
TickData,
BarData,
TradeData,
OrderData,
BarGenerator,
ArrayManager
)
from vnpy.trader.constant import Interval, Direction, Offset
class BlackMomentumStrategy(CtaTemplate):
"""黑色系日内动量突破策略"""
author = "YourName"
# 策略参数
breakout_window = 24 # 2小时突破窗口(5分钟K线*24=2小时)
volume_multiplier = 1.5 # 成交量放大倍数
fixed_size = 1 # 每次交易手数
stop_loss_pct = 0.005 # 固定止损0.5%
trailing_atr_ratio = 3 # 动态止盈ATR倍数
# 策略变量
intraday_high = 0
intraday_low = 0
atr_value = 0
current_tick = None
parameters = [
"breakout_window",
"volume_multiplier",
"fixed_size",
"stop_loss_pct",
"trailing_atr_ratio"
]
variables = [
"intraday_high",
"intraday_low",
"atr_value"
]
def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
super().__init__(cta_engine, strategy_name, vt_symbol, setting)
# 创建K线合成器(5分钟)
self.bg = BarGenerator(self.on_bar, interval=Interval.MINUTE, window=5)
# 使用ArrayManager管理K线序列(默认100根)
self.am = ArrayManager(size=100)
def on_init(self):
"""策略初始化"""
self.write_log("策略初始化")
self.load_bar(10) # 加载10天历史数据
def on_start(self):
"""策略启动"""
self.write_log("策略启动")
self.put_event()
def on_stop(self):
"""策略停止"""
self.write_log("策略停止")
self.put_event()
def on_tick(self, tick: TickData):
"""Tick更新"""
self.current_tick = tick
self.bg.update_tick(tick)
def on_bar(self, bar: BarData):
"""5分钟K线处理"""
# 更新K线到ArrayManager
self.am.update_bar(bar)
if not self.am.inited:
return
# 计算技术指标
self.atr_value = self.am.atr(14)
self.intraday_high = self.am.high[-self.breakout_window:].max()
self.intraday_low = self.am.low[-self.breakout_window:].min()
vol_ma20 = self.am.sma(self.am.volume, 20)
# 过滤交易时间段(上午10:00-11:30,下午13:30-15:00)
if not (100000 <= bar.datetime.time().hour * 100 + bar.datetime.time().minute <= 113000 or
133000 <= bar.datetime.time().hour * 100 + bar.datetime.time().minute <= 150000): return # 撤销未成交订单 self.cancel_all() # 无持仓时检查信号 if self.pos == 0: # 突破上轨且放量 if bar.close_price > self.intraday_high and bar.volume > vol_ma20 * self.volume_multiplier:
self.buy(bar.close_price + 5, self.fixed_size)
# 突破下轨且放量
elif bar.close_price < self.intraday_low and bar.volume > vol_ma20 * self.volume_multiplier:
self.short(bar.close_price - 5, self.fixed_size)
# 有持仓时处理止损止盈
elif self.pos > 0: # 多头持仓
# 固定止损
stop_price = bar.close_price * (1 - self.stop_loss_pct)
# 动态止盈(最高价回撤3倍ATR)
trail_price = self.am.high[-self.breakout_window:] - self.atr_value * self.trailing_atr_ratio
stop_price = max(stop_price, trail_price)
self.sell(stop_price, abs(self.pos), stop=True)
elif self.pos < 0: # 空头持仓
# 固定止损
stop_price = bar.close_price * (1 + self.stop_loss_pct)
# 动态止盈(最低价反弹3倍ATR)
trail_price = self.am.low[-self.breakout_window:] + self.atr_value * self.trailing_atr_ratio
stop_price = min(stop_price, trail_price)
self.cover(stop_price, abs(self.pos), stop=True)
self.put_event()
def on_order(self, order: OrderData):
"""委托更新"""
pass
def on_trade(self, trade: TradeData):
"""成交更新"""
self.put_event()
def on_stop_order(self, stop_order: StopOrder):
"""停止单更新"""
pass