Day15 - Shioaji X Backtesting -均线突破策略

Backtesting到底要怎麽用呢?这边我们会一步一步向大家介绍,
最简单的方式就是直接实做一个策略来和大家讲解里面的细节。

那我们就先从实做一条均线(季线60MA)做进出场依据的策略开始吧,把策略取名为OneMA。

from backtesting import Backtest, Strategy 
from backtesting.lib import crossover
from backtesting.test import SMA 
import talib

class OneMA(Strategy): 
    
    n1 = 60  #预设的均线参数
    
    def init(self): #初始化会用到的参数和指标,告知要如何计算
        self.sma1 = self.I(SMA, self.data.Close, self.n1) 

    def next(self): #回测的时候每一根K棒出现什麽状况要触发进出场
        #如果收盘价>sma1(也就是60ma),而且目前没有多单部位
        if (self.data.Close > self.sma1) and (not self.position.is_long) :
            self.buy()#做多
        #如果收盘价<sma1(也就是60ma)
        elif (self.data.Close < self.sma1):
            self.position.close()#部位出场
                                 #如果要做空就用self.sell()

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

#输入回测的条件,df是上一篇台积电日K资料,OneMA是写好的策略,初始资金10000,交易成本0.2%
bt = Backtest(df, OneMA, cash=10000, commission=0.002)

#将跑完回测得到的数据放到stats
stats = bt.run()
stats

从下面的回测结果可以发现:
资料:台积电2020-2021/9/22
策略:「高於季线做多,跌破出场」
绩效有超过50%,但却比买进并持有的绩效还差!
这段期间的Sharpe Ratio更是低到只有0.23!
胜率也只有不到3成的27.7%!

Out:
---------------------------------------------
Start                     2020-01-02 00:00:00
End                       2021-09-22 00:00:00
Duration                    629 days 00:00:00
Exposure [%]                        58.028617
Equity Final [$]                 15061.227055
Equity Peak [$]                  21692.629027
Return [%]                          50.612271
Buy & Hold Return [%]               72.861357
Max. Drawdown [%]                   -30.56984
Avg. Drawdown [%]                   -4.895715
Max. Drawdown Duration      244 days 00:00:00
Avg. Drawdown Duration       30 days 00:00:00
# Trades                                   18
Win Rate [%]                        27.777778
Best Trade [%]                      47.195966
Worst Trade [%]                      -3.02392
Avg. Trade [%]                       3.034155
Max. Trade Duration         162 days 00:00:00
Avg. Trade Duration          21 days 00:00:00
Expectancy [%]                       5.630253
SQN                                   0.84756
Sharpe Ratio                         0.231967
Sortino Ratio                        3.252764
Calmar Ratio                         0.099253
_strategy                               OneMA

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

bt.plot(superimpose = False)

这张图配色舒服,互动体验也很好,也可以客制化调整只秀出你想看到的数据,赶快来玩玩看吧!

从回测资料看来这个策略还有很大的改善空间,那要怎麽做策略的最佳化呢?
请期待我们下一篇的文章喔!


<<:  Day 18 - 指标不能乱指会出事

>>:  【Day 30】JavaScript Async/Await

PHP 与 资料库的连接 使用 MySQLi

使用 MySQLi MySQLi 全称 MySQL Improved extension, 算是 M...

【设计+切版30天实作】|Day11 - [设计进阶挑战] 如何把Reviews的呈现方式改成可滚动式的卡片呢?

设计大纲 在上一篇设计「Reviews」这个区块时,有提到切版时可能会有「切不出来」的情况发生,所以...

JS 31 - 一个 div 就能安心输入的表单检查提示!

大家好! 今天要实作的是表单的输入提示。 我们进入今天的主题吧! 程序码 const input =...

Day 24 实作 user_bp (2)

前言 今天要继续 user_bp,今天会把验证的部分处理掉。 /register 理论上我们现在应该...

Proxmox VE 客体机磁碟大小调整

在客体机刚建立的初期,也许我们会将磁碟的容量配置的少一些,若之後使用量增加後需要更大的磁碟空间,在...