觉得文章有收获,欢迎关注公众号鼓励一下作者呀~
在学习的过程中,也搜集了一些量化、技术的视频及书籍资源,欢迎大家关注公众号【亚里随笔】获取
也欢迎大家通过【亚里随笔】与我交流联系~
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策略对趋势的把握也非常好,非常有潜力。