[Day 15] backtesting 使用说明

策略(Strategy)

自定义策略

class SmaCrossCons(ConsStrategy):
    # Class variable for parameters tuning
    fast_days = 5
    slow_days = 15

    def init(self):
        super().init()

        self.fast_line = self.I(SMA, self.data.Close, self.fast_days)
        self.slow_line = self.I(SMA, self.data.Close, self.slow_days)
        self.conservative = True

    def next(self):
        if crossover(self.fast_line, self.slow_line):
            if len(self.trades) > 0:
                self.trades[0].close()

            self.buy()
        elif crossover(self.slow_line, self.fast_line):
            if len(self.trades) > 0:
                self.trades[0].close()

            if self.conservative == False:
                self.sell()

基底类别

super().init():继承Strategy的初始化函式。
params(self):用来记录训练後参数。

class ConsStrategy(Strategy):
    def init(self):
        super().init()
        self.conservative = True

    @property
    def params(self):
        return self._params

调参

参数可藉由backtesting.optimize()进行参数优化。

# Class variable for parameters tuning
fast_days = 5
slow_days = 15

初始化

def init(self):
    super().init()

    self.fast_line = self.I(SMA, self.data.Close, self.fast_days)
    self.slow_line = self.I(SMA, self.data.Close, self.slow_days)
    self.conservative = True

进退场时机

def next(self):
    if crossover(self.fast_line, self.slow_line):
        if len(self.trades) > 0:
            self.trades[0].close()

        self.buy()
    elif crossover(self.slow_line, self.fast_line):
        if len(self.trades) > 0:
            self.trades[0].close()

        if self.conservative == False:
            self.sell()

该语法会将之前的操作清空,作用等同於exclusive_orders=True

if len(self.trades) > 0:
    self.trades[0].close()

策略为激进时self.conservative = False,允许卖空。

if self.conservative == False:
    self.sell()

回测

test = Backtest(
    data=df,
    strategy=SmaCrossCons,
    cash=10000000,
    commission=0.004,
    exclusive_orders=True,
    hedging = True,
    trade_on_close=True,
)
  • data:股票资料,格式参考:
    https://ithelp.ithome.com.tw/upload/images/20210920/20141586fvgZOW1Flp.png
  • strategy:回测策略。
  • cash:本金。
  • commission:交易手续费。
  • hedging:若为True时,优先对之前操作进行抵销。
    • Sell(1100)Buy(1000) -> 卖空100
    • Sell(1000)Buy(1100) -> 买空100
    • Sell(1000)Sell(1100) -> 卖空2100
  • exclusive_orders:若为True时,每次操作前自动关闭(close)上次操作。
    • Buy(500)Buy(1000) -> 最後持股1000
    • Buy(500)Sell(500) -> 卖空500
  • trade_on_close:於收盘时交易,否则预设於开盘交易。

调参

对参数进行优化,寻找该策略下的最佳参数,
参数必须为Strategy的Class variable。

constraint:限定组合必须符合特定条件

result = test.optimize(
    fast_days=[5,10,15],
    slow_days=[10,15,20],
    constraint=lambda p: p.fast_days < p.slow_days,
)

最後的测试组合为:(5,10), (5,15), (5,20), (10,15), (10,20), (15,20)。

尾声

backtesting你的文档可以写得再烂点没关系。


<<:  Day20 Laravel - test

>>:  唤醒与生俱来的数学力 (3) 抽象化 & 模型化

DAY24: 作用域

既然提及了模块化,就来探讨一下作用域,在研读这段的时候, 原本觉得这没什麽,应该很好理解, 但我错了...

[火锅吃到饱-12] 温野菜日本涮涮锅专门店 Taiwan On-Yasai @秀泰-台中站前店

我在这一区出生的(小时候也住在这里),拍这集的时候,不自觉的会想要多介绍一些周遭的环境。 阿公家在这...

以Postgresql为主,再聊聊资料库 width_bucket() 的介绍

前天的趣味SQL, 经过大家热烈的响应,有提到 width_bucket() https://ith...

Day11 主动情蒐-建立练习环境 metasploitable3

因为我们之後练习需要透过 metasploitable 3 当作靶机,所以要先安装 metaspl...

[Day20] 在 Codecademy 学 React ~ 如何宣告 Component 及使用 Component 的好处

前言 今天来到第 20 天! 然後仍然是 Codecademy 学 React 系列, 今天进度是 ...