Day23 - Shioaji X Backtesting - RSI低买高卖策略

好啦!之前介绍过了如何用Backtesting套件来实做均线的策略,
前面也介绍过了如何安装Ta-lib套件,
相信大家一定很想知道如果使用Ta-lib内的套件要如何写策略,
今天就来和大家介绍RSI低买高卖策略罗!

RSI 低买高卖策略

def rsi_buy(s1,thres):
    return s1[-1] < thres #收盘 RSI 值低於买进门槛,rsi_buy为 True

def rsi_sell(s1,thres):
    return s1[-1] > thres #收盘 RSI 值高於卖出门槛,rsi_sell为 True

class RSI_(Strategy):
    
    # 定义参数
    n1 = 14 # rsi 要算几天的 RSI 值
    n2 = 30 # rsi 低於多少买进
    n3 = 50 # rsi 高於多少卖出
    
    # 先算好技术指标价格
    def init(self):
        self.rsi = self.I(talib.RSI, self.data.Close, self.n1)
        
    # 一次推进一根 K 棒    
    def next(self):
        
        # 收盘 rsi低於 30 ,隔日开盘价买进
        if rsi_buy(self.rsi, self.n2) and not (self.position.is_long):
            self.buy()

        # 收盘 rsi高於 50 ,隔日开盘价卖出
        if rsi_sell(self.rsi, self.n3) and not (self.position.is_short):
            self.position.close()

策略搞定之後就要来用Backtest回测罗!

#输入回测条件:df(台积电的资料)跑回测,策略是 RSI_,起始资金 10000元,交易成本 0.2%。            
bt = Backtest(df, RSI_, cash=10000, commission=0.002)

#把回测完得到的数据存到stats
stats = bt.run()

#画图(如果不加 superimpose = False,会看到他把每五根日 K 棒合成一根周 K 棒 )
bt.plot(superimpose = False)
stats

回测结果:

资料:台积电2020-2021/9/22
策略:「RSI低於30做多,高於50出场」
绩效仅16%,虽然Sharpe Ratio高达2.2,但真的太早出场,超大鱼尾都没吃到!

Out:
---------------------------------------------
Start                     2020-01-02 00:00:00
End                       2021-09-22 00:00:00
Duration                    629 days 00:00:00
Exposure [%]                         7.790143
Equity Final [$]                 11590.450906
Equity Peak [$]                  11590.450906
Return [%]                          15.904509
Buy & Hold Return [%]               72.861357
Max. Drawdown [%]                  -14.482759
Avg. Drawdown [%]                   -5.409828
Max. Drawdown Duration      431 days 00:00:00
Avg. Drawdown Duration      146 days 00:00:00
# Trades                                    3
Win Rate [%]                            100.0
Best Trade [%]                       7.045936
Worst Trade [%]                      2.568966
Avg. Trade [%]                       4.993597
Max. Trade Duration          34 days 00:00:00
Avg. Trade Duration          17 days 00:00:00
Expectancy [%]                            NaN
SQN                                  3.672751
Sharpe Ratio                         2.208007
Sortino Ratio                             NaN
Calmar Ratio                         0.344796
_strategy                                RSI_

接着我们用下面这行code就能把图画出来罗!

bt.plot(superimpose = False)

太早出场好可惜,没关系,我们可以最佳化XD

#这边会将rsi买进门槛和卖出门槛的参数从10~90去跑跑看哪组参数搭配能让最後帐户总净值最高
#至於constraint那一行,是指rsi买进门槛要低於卖出门槛,这样比较合理,也可以加速最佳化。
stats = bt.optimize(n2=range(10, 90, 1),
                    n3=range(10, 90, 1),
                    maximize='Equity Final [$]',
                    constraint=lambda p: p.n2 < p.n3)
stats

来看看根据「期末帐户总净值(Equity Final [$])」最佳化後的结果吧:

Out:
---------------------------------------------
Start                     2020-01-02 00:00:00
End                       2021-09-22 00:00:00
Duration                    629 days 00:00:00
Exposure [%]                         39.26868
Equity Final [$]                 20354.235241
Equity Peak [$]                  21917.273783
Return [%]                         103.542352
Buy & Hold Return [%]               72.861357
Max. Drawdown [%]                  -25.970149
Avg. Drawdown [%]                   -4.714841
Max. Drawdown Duration      143 days 00:00:00
Avg. Drawdown Duration       29 days 00:00:00
# Trades                                    2
Win Rate [%]                            100.0
Best Trade [%]                      44.419077
Worst Trade [%]                      36.99977
Avg. Trade [%]                      40.709424
Max. Trade Duration         175 days 00:00:00
Avg. Trade Duration         124 days 00:00:00
Expectancy [%]                            NaN
SQN                                  11.32503
Sharpe Ratio                          7.75973
Sortino Ratio                             NaN
Calmar Ratio                         1.567547
_strategy                   RSI_(n2=40,n3=86)

发现买进参数改40,卖出改86,绩效竟然从16%变成103%!

Sharpe Ratio竟然可以高达7.76真是夸张!

赶快来画图看发生什麽事!

#画图(如果不加 superimpose = False,会看到他把每五根日 K 棒合成一根周 K 棒 )
bt.plot(superimpose = False)

从图中可以看到最有效率的两波上涨都吃得很乾净,这就是最佳化的魔力!

**不过这边还是要提醒读者:像这样过度最佳化後的参数并不适合实际拿来使用,
过去绩效不代表更不能保证未来走势,
所以大家还是多想想交易策略的逻辑,开发实用的策略比较实在喔!


<<:  [DAY 23]纠团通知功能(3/3)

>>:  【Day 22】Hook 05:useReducer

Thunkable学习笔记 9 - 资产盘点(二)

对thunkable的data sources还不是很清楚, 建立这个app练习并测试这个物件的特性...

Day 04 : 操作基础篇 1 — 认识 Obsidian 预设介面与基础功能

前言 从这篇文章开始,我们要进入到 Obsidian 的操作了。在正式开始教学之前,我先快速简介 O...

终於 30 天了,可以偷懒了ㄅ

终於最後一天,照惯例大家都在这里写後记吧~ 三年前第一次知道铁人赛,就是以社群身份去参加了颁奖典礼X...

Day 2 python简易语法

在开始学习机器学习之前,我们得先准备好环境,我们使用python来当我们的程序语言,稍微介绍一下py...

Day 08 - 今天的我没办法产好CODE

因为心情太低落了,掉着泪看教学,我真的很认真的在学,但为什麽要被批评得一无是处。 也许在学技能的同时...