RUMI策略小试

觉得文章有收获,欢迎关注公众号鼓励一下作者呀~
在学习的过程中,也搜集了一些量化、技术的视频及书籍资源,欢迎大家关注公众号【亚里随笔】获取
也欢迎大家通过【亚里随笔】与我交流联系~
百度网盘资源

1 策略原理

1.1 基本信号

RUMI策略采用对均线偏离度平滑处理的方式,来更好的识别趋势机会:

  • 快速均线:使用SMA(简单移动平均)计算
  • 慢速均线:使用WMA(加权移动平均)计算
  • DIFF:计算快慢均线的偏离度(两者相减)
  • RUMI:对偏离度使用SMA进行平滑处理

计算出RUMI指标后,交易信号为:

  • RUMI上穿0轴,买入做多
  • RUMI下穿0轴,卖出做空

本质上RUMI策略是对传统均线金叉死叉(即DIFF上下穿0轴)信号的一种优化,通过平滑处理的方式降低DIFF的敏感度来解决均线缠绕的问题。

本次试验中,我只研究RUMI策略的基本信号的效果,如果RUMI策略用于实盘,可以再增加一些平仓出卖的逻辑。

2 策略实现

策略实现

扩展arrayManager,计算rumi指标。

def rumi(self, n: int, fast_window: int, slow_window: int, array: bool = False):
    fast_array: np.ndarray = self.sma(fast_window, True)
    slow_array: np.ndarray = self.wma(slow_window, True)
    diff_array: np.ndarray = fast_array - slow_array
    rumi_array: np.ndarray = talib.SMA(diff_array, n)
    if array:
        return rumi_array
    return rumi_array[-1]
class RumiStrategy(CtaTemplate):
    """
    https://www.vnpy.com/forum/topic/31540-eliteliang-hua-ce-lue-shi-yan-shi-rumice-lue-1?page=1#pid59093
    """

    author = "亚里"

    fixed_size = 1
    fast_window = 3
    slow_window = 50
    rumi_window = 30

    rumi_0 = 0.0    # RUMI当前数值
    rumi_1 = 0.0    # RUMI上期数值

    parameters = ["fast_window", "slow_window", "rumi_window", "fixed_size"]
    variables = ["rumi_0", "rumi_1"]

    def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
        """"""
        super().__init__(cta_engine, strategy_name, vt_symbol, setting)
        self.hour_bg = BarGenerator(self.on_bar, window=1, on_window_bar=self.on_hour_bar, interval=Interval.HOUR)
        self.hour_am = ArrayManager(self.slow_window * 2)

    def on_init(self):
        """
        Callback when strategy is inited.
        """
        super(RumiStrategy, self).on_init()
        self.write_log("策略初始化")
        self.load_bar(10)

    def on_start(self):
        """
        Callback when strategy is started.
        """
        pass

    def on_stop(self):
        """
        Callback when strategy is stopped.
        """
        pass

    def on_tick(self, tick: TickData):
        """
        Callback of new tick data update.
        """
        self.hour_bg.update_tick(tick)

    def on_bar(self, bar: BarData):
        """
        Callback of new bar data update.
        """
        self.hour_bg.update_bar(bar)

    def on_hour_bar(self, bar: BarData):
        self.cancel_all()
        self.hour_am.update_bar(bar)
        if not self.hour_am.inited:
            return

        rumi_array: np.ndarray = self.hour_am.rumi(self.rumi_window, self.fast_window, self.slow_window, True)
        self.rumi_0 = rumi_array[-1]
        self.rumi_1 = rumi_array[-2]

        long_signal: bool = False
        short_signal: bool = False
        if self.rumi_0 > 0 > self.rumi_1:
            long_signal = True
        elif self.rumi_0 < 0 < self.rumi_1:
            short_signal = True
        if self.pos == 0:
            if long_signal:
                self.buy(bar.close_price + 5, self.fixed_size)
            elif short_signal:
                self.short(bar.close_price - 5, self.fixed_size)
        elif self.pos > 0:
            if short_signal:
                self.sell(bar.close_price - 5, abs(self.pos))
                self.short(bar.close_price - 5, self.fixed_size)
        elif self.pos < 0:
            if long_signal:
                self.cover(bar.close_price + 5, abs(self.pos))
                self.buy(bar.close_price + 5, self.fixed_size)

    def on_order(self, order: OrderData):
        """
        Callback of new order data update.
        """
        pass

    def on_trade(self, trade: TradeData):
        """
        Callback of new trade data update.
        """
        pass

    def on_stop_order(self, stop_order: StopOrder):
        """
        Callback of stop order update.
        """
        pass

3 策略效果

我们使用玻璃品种的指数合约进行测试,测试设置如下:

engine.set_parameters(
    vt_symbol="FGI.CZCE",
    interval=Interval.HOUR,
    start=datetime(2020, 1, 1),
    end=datetime.today(),
    rate=0.015 / 100,  # 手续费率为万分之一,增加0.5模拟额外消耗
    slippage=0,
    size=20,
    pricetick=1.0,
    capital=40000,
)
setting = {'fast_window': 9, 'slow_window': 97, 'rumi_window': 24}

回测数据:

2023-04-01 17:16:52.106088	首个交易日:	2020-01-16
2023-04-01 17:16:52.106095	最后交易日:	2023-03-31
2023-04-01 17:16:52.106102	总交易日:	777
2023-04-01 17:16:52.106107	盈利交易日:	398
2023-04-01 17:16:52.106112	亏损交易日:	351
2023-04-01 17:16:52.106121	起始资金:	40,000.00
2023-04-01 17:16:52.106131	结束资金:	98,158.99
2023-04-01 17:16:52.106137	总收益率:	145.40%
2023-04-01 17:16:52.106158	年化收益:	44.91%
2023-04-01 17:16:52.106164	最大回撤: 	-11,920.23
2023-04-01 17:16:52.106169	百分比最大回撤: -11.76%
2023-04-01 17:16:52.106174	最长回撤天数: 	99
2023-04-01 17:16:52.106179	总盈亏:	58,158.99
2023-04-01 17:16:52.106184	总手续费:	640.64
2023-04-01 17:16:52.106190	总滑点:	0.00
2023-04-01 17:16:52.106197	总成交金额:	4,270,932.89
2023-04-01 17:16:52.106202	总成交笔数:	111
2023-04-01 17:16:52.106207	总成交对:	55
2023-04-01 17:16:52.106214	获利交易笔数:	30
2023-04-01 17:16:52.106218	亏损交易笔数:	25
2023-04-01 17:16:52.106223	日均盈亏:	74.85
2023-04-01 17:16:52.106229	日均手续费:	0.82
2023-04-01 17:16:52.106233	日均滑点:	0.00
2023-04-01 17:16:52.106239	日均成交金额:	5,496.70
2023-04-01 17:16:52.106246	日均成交笔数:	0.14285714285714285
2023-04-01 17:16:52.106251	日均收益率:	0.12%
2023-04-01 17:16:52.106256	收益标准差:	1.06%
2023-04-01 17:16:52.106261	Sharpe Ratio:	1.69
2023-04-01 17:16:52.106266	收益回撤比:	12.36

回测曲线:
回测曲线图
回测成交情况:
回测成交图

veighna官方分享RUMI策略的公众号中,这个策略的表现相当不错。自己实现一版,回测结果也挺符合预期,获利交易笔数>亏损交易笔数,盈利交易日>亏损交易日,并且从回测的成交图上看,RUMI策略对趋势的把握也非常好,非常有潜力。

参考资料

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值