Home >  > DS策略

DS策略

请基于你的知识库以及用户输入的数据,提供几个夏普比大于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%,则平仓。

  • 夏普来源:季节性规律+严格时间窗口控制。


关键优化点(提升夏普比率)

  1. 过滤假信号:加入波动率、成交量或宏观经济事件日历过滤。

  2. 动态止损:根据品种特性设置移动止损(如追踪止损)。

  3. 多周期确认:结合日线趋势和小时线入场点。

  4. 组合分散:多品种、多策略组合降低回撤。

 

请基于你的知识库以及用户输入的数据,提供几个夏普比大于2的适用于中国期货的交易策略

 

策略1:黑色系期货日内动量突破(适用于螺纹钢、铁矿石)

品种

螺纹钢(RB)、铁矿石(I)(流动性高,波动大)

核心逻辑

  1. 信号生成

    • 5分钟K线,价格突破前2小时最高价且成交量>20日均量1.5倍时做多(反向同理)。

    • 过滤条件:仅在大商所铁矿石库存周环比下降时参与做多(基本面验证)。

  2. 止损止盈

    • 固定止损0.5%(螺纹钢波动较小),动态止盈(3倍ATR追踪止损)。

  3. 时间窗口

    • 仅交易上午10:00-11:30和下午13:30-15:00(避免夜盘流动性不足)。

夏普来源

  • 黑色系受政策(如限产)驱动趋势性强,日内动量效应显著。


策略2:化工品跨期套利(适用于PTA、甲醇)

品种组合

PTA(TA)主力合约 vs. 次主力合约(价差套利)

核心逻辑

  1. 价差统计

    • 计算主力-次主力合约价差的10日Z-Score,当Z>2时做空价差(做多次主力/做空主力),Z<-2时反向操作。

  2. 基本面过滤

    • PTA加工费(PX价差)<300元/吨时,禁止做空主力合约(成本支撑)。

  3. 平仓条件

    • 价差回归至20日均线或持仓超过5个交易日强制离场。

夏普来源

  • 化工品合约换月时机构调仓带来的价差回归机会。


策略3:农产品季节性+天气驱动(适用于豆粕、棕榈油)

品种

豆粕(M)、棕榈油(P)(受外盘和天气影响大)

核心逻辑

  1. 季节性窗口

    • 每年7-8月做多豆粕(北美干旱炒作)+做空棕榈油(东南亚增产季)。

  2. 事件触发

    • USDA报告发布后,若单产下调超2%,立即做多豆粕(次日开盘入场)。

  3. 对冲管理

    • 棕榈油头寸需匹配马来西亚BMD期货夜盘波动(避免隔夜跳空风险)。

夏普来源

  • 农产品供需错配的爆发性行情+季节性规律稳定。


策略4:股指期货隔夜反转(适用于沪深300股指期货)

品种

沪深300股指期货(IF)

核心逻辑

  1. 反转信号

    • 当日收盘价跌幅>2%且成交量放大,次日开盘做多(超跌反弹)。

  2. 过滤条件

    • 仅当陆股通北向资金当日净流入>50亿元时触发(外资抄底信号)。

  3. 离场规则

    • 持仓不超过3天,盈利达1.5%或亏损达1%时平仓。

夏普来源

  • A股“过度反应-修正”特性显著,北向资金增强信号可靠性。


策略5:贵金属避险对冲(适用于黄金、白银)

品种

黄金(AU)、白银(AG)(上期所)

核心逻辑

  1. 趋势跟随

    • 当沪金价格突破60日均线且人民币汇率贬值>0.5%时做多(双重驱动)。

  2. 对冲组合

    • 做多黄金同时做空沪深300期货(股灾避险组合)。

  3. 波动控制

    • 黄金仓位权重=1/(20日波动率),动态调整。

夏普来源

  • 黄金与权益资产的负相关性+人民币汇率波动放大收益。


关键优化点(中国特有问题)

  1. 主力合约换月

    • 提前5天移仓至次主力合约(避免交割月流动性风险)。

  2. 涨跌停板

    • 触发涨跌停时,立即平仓同方向头寸(防止次日极端跳空)。

  3. 政策监控

    • 交易所提保、手续费调整等公告发布后暂停策略1天。

  4. 数据源

    • 使用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

暧昧帖

本文暂无标签