添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
焦虑的针织衫  ·  Hidd functions fail ...·  4 月前    · 
失恋的牙膏  ·  spring - The bean ...·  1 年前    · 

量化交易30天
本系列文章是紀錄一位量化交易新手的學習過程,除了基礎的Python語法不說明,其他金融相關的東西都會一步步地說明,希望讓更多想學習量化交易但是沒有學過相關金融知識的朋友們,透過這系列的文章,能夠對量化交易略知一二,也歡迎量化交易的高手們多多交流。

上篇寫了常見的均線交叉策略,這篇要來練習一下怎麼使用backtrader寫通道策略,那什麼是通道策略呢?

要講通道策略,直接看圖最快,下面是維基百科裡面的圖:

從上圖可以看到,白色的線是股價走勢,上下有兩條黃色的線包覆中間的白色線,包圍的區間看起來就像是一個通道,所以叫做通道策略,上下兩條黃線則是稱為上下軌。

計算這兩條黃色線的方式有很多不同的方式,本篇介紹其中一種叫做唐奇安通道(Donchian Channel),唐奇安通道的上下軌計算方式為,上軌為過去一段時間內的最高價,下軌為過去一段時間內的最低價。

若股價超過上軌,可能表示多頭較強勢,所以產生買進訊號,若股價低於下軌,可能表示空頭較強勢,所以產生賣出訊號。至於這過去一段時間要採用多長的時間,會跟商品性質或是交易頻率比較有相關。

開始寫策略吧

寫唐奇安通道策略大概需要三個步驟:

  • 計算通道上下軌
  • 撰寫交易策略
  • 計算通道上下軌

    因為上下軌是用來買進賣出的指標,因此可以使用backtrader的 Indicators ,官網文件有非常詳細的介紹。下面程式碼是官網的範例,由於實在蠻複雜的,就一行一行來解釋:

    from datetime import datetime
    import backtrader as bt
    # 定義一個Indicator物件
    class DonchianChannels(bt.Indicator):
        # 這個物件的別名,所以後面我們可以用DCH/DonchianChannel來呼叫這個指標
        alias = ('DCH', 'DonchianChannel',)
        # 三條線分別代表唐奇安通道中的 中軌(上軌加下軌再除以2)、上軌、下軌
        lines = ('dcm', 'dch', 'dcl',)  # dc middle, dc high, dc low
        # 軌道的計算方式:用過去20天的資料來計算,所以period是20,lookback的意思是要不要將今天的資料納入計算,由於唐奇安通道是取過去20天的最高或最低,所以一定不能涵蓋今天,不然永遠不會有訊號出現,所以要填-1(從前一天開始算20天)
        params = dict(
            period=20,
            lookback=-1,  # consider current bar or not
        # 是否要將Indicators另外畫一張圖,然而通道線通常都是跟股價圖畫在同一張,才能看得出相對關係,所以這裡就填subplot=False
        plotinfo = dict(subplot=False)  # plot along with data
        # 繪圖設定,ls是line style,'--'代表虛線
        plotlines = dict(
            dcm=dict(ls='--'),  # dashed line
            dch=dict(_samecolor=True),  # use same color as prev line (dcm)
            dcl=dict(_samecolor=True),  # use same color as prev line (dch)
        def __init__(self):
            # hi與lo是指每日股價的最高與最低價格
            hi, lo = self.data.high, self.data.low
            # 視需求決定是否要從前一天開始讀資料,上面已經定義lookback存在,所以這邊會直接從前一天的資料開始跑
            if self.p.lookback:  # move backwards as needed
                hi, lo = hi(self.p.lookback), lo(self.p.lookback)
            # 定義三條線的計算方式
            self.l.dch = bt.ind.Highest(hi, period=self.p.period)
            self.l.dcl = bt.ind.Lowest(lo, period=self.p.period)
            self.l.dcm = (self.l.dch + self.l.dcl) / 2.0  # avg of the above
    

    撰寫交易策略

    寫策略的部份就相對簡單很多,第一步把指標帶入,再來就產出訊號拉。

    # 撰寫交易策略
    class MyStrategy(bt.Strategy):
        def __init__(self):
            # DCH就是上面定義的 DonchianChannels的alias
            self.myind = DCH()
        def next(self):
            if self.data[0] > self.myind.dch[0]:
                self.buy()
            elif self.data[0] < self.myind.dcl[0]:
                self.sell()
    
    cerebro = bt.Cerebro()
    cerebro.addstrategy(MyStrategy)
    cerebro.broker.setcash(1000)
    cerebro.broker.setcommission(commission=0.001)
    data = bt.feeds.YahooFinanceData(dataname='AAPL',
                                     fromdate=datetime(2019, 1, 1),
                                     todate=datetime(2019, 12, 31))
    cerebro.adddata(data)
    print('Starting Value: %.2f' % cerebro.broker.getvalue())
    cerebro.run()
    print('Ending Value: %.2f' % cerebro.broker.getvalue())
    cerebro.plot()
    

    回測2019年的結果(過去績效僅供參考,不保證未來能夠持續獲利):
    Starting Value: 1000.00
    Ending Value: 1400.97

    從上圖可以看得出來,因為2019年AAPL股價一直上漲的關係,很容易突破前20日的高點,導致綠色的三角形比紅色三角形多。

    這篇就簡單的寫了一下用Backtrader回測唐奇安通道策略,又對這個框架多瞭解一些,覺得bt的功能真的超多,好用好用!

    (PS.本策略僅為個人練習使用,無任何推介建議)

    筆者 Sean
    奈米戶投資人 / Python愛用者
    喜歡用Python玩轉金融數據,從個股基本面、技術面、籌碼面相關資料,一直到總體經濟數據,都是平常接觸到的素材;對於投資,除了研究歷史數據,也喜歡瞭解市場上大家在玩些什麼。