VNPY-Developed by traders,for traders.TA-Libを使用してvn.trader上でCTA取引戦略を開発


TA-Lib概要
業界で広く応用されているオープンソース技術分析ライブラリ(技術指標計算やK線パターン認識などを含む)として、TA-Libは2001年に発表されて以来10年以上の歴史を持っている.TA-Libには、C/C++、Java、Perl、Pythonなど多くの言語を含むAPIが提供される約125の技術指標の計算関数が含まれている.
何の役にも立たない
簡単に言えばTA-Libは長期にわたって実践的に検証された技術指標計算関数を提供している.既存の計算関数に基づいて、新しい戦略の雛形を開発し、あるインスピレーションを迅速に検証する時間を大幅に短縮することができます.そうしないと、開発戦略ごとに自分で使用する技術指標を実現することを想像すると、時間の無駄になります.
しかし、それ以外にも、TA-Libにはいくつかの他の使い方があり、2つの例を挙げることができます.
百科事典
毎日の終値後、自分が使ったことのない指標を選んで、データを入力して、図を描いて、走って、量子化戦略を開発して、他の多くの技術は同じように熟練しています.
また、すべての技術指標が開発された場合、背後には一定の金融論理原理(行為金融学)の支えがあり、強引に運ぶのは望ましくないが、先人の経験を全く見ず、一日中自分の空想で機械学習アルゴリズムを作ってデータを振り回しているほうが時間の無駄ではないか.
Alphaライブラリ
CTAクラスのポリシーの大部分は、いくつかの単純な論理フレームワークにまとめることができ、例えば、トレンドポリシーは、通常、トレンド信号(通常、いくつかのパラメータに基づいて計算された指標値が閾値を超える)、信号フィルタリング(トレンド信号クラスと同様)、出場スキーム(固定点数/パーセントの収益停止および損失停止、移動損失停止)に分解することができる.
そのため、論理フレームワークのコードを組み立てると、機械学習アルゴリズムによって自動的な戦略開発方式を実現することができます.
  • TA-Libから2つの指標をトレンド信号と信号フィルタリングとして選択し、停止、停止方式と組み合わせて、1つの戦略を生成する.
  • ある歴史データ(株価指数の1分相場など)に基づいて、遺伝アルゴリズムによって以上のパラメータを光と最適化する.
  • の2つの指標のパラメータを合わせると通常10個を超えず、さらに止盈、止損、移動止損のパラメータを加えると、総パラメータは15個を超えず、十数万個のデータ点に達する時間系列で再測定を行い、過度にフィットする可能性は低い.
  • 今クラウドサーバーの価格も高くなくて、1つの核の多いのを借りて、アルゴリズムとデータをなくします7×24時間の走り、Alpha値が一定の基準に達した戦略が保存された.
  • は、前のステップで保存された戦略を雛形とし、研究員は、盲目的なタッチではなく、戦略開発を有的な矢に変えるために、有効性の検証とより精密化された戦略の改善を行う.

  • この戦略開発方式は従来のビジネスソフトウェア(例えばTB,MCなど)を用いてはほとんど実現できないが,Pythonのようなオープンソースソフトウェアが最良の選択となり,ユーザはほとんどのアルゴリズム(指標がどのように選択されるか,遺伝アルゴリズムがパラメータを最適化する際にどのように反復するかなど)を自分で決定することができる.
    インストール方法
    TA-Libは、SWIGパッケージベースのPython APIをオリジナルで提供しているが、性能とコンパイルが不便なため、著者らはGithub上の開発者mrjbq 7のCythonパッケージベースのバージョンを推奨している.
    インストール手順:
  • ここでTA_をダウンロードLib-0.4.9-cp 27-none-win 32.whlデスクトップ、すなわちvn.pyが推奨する実行環境Anaconda 2.732ビット
  • デスクトップでShiftを押しながら右クリックし、ここでコマンドウィンドウを開くcmd
  • を選択します.
  • wheelパッケージをインストールし、cmdで実行します.
    pip install wheel
  • TA-Libをインストールし、cmdで実行します.
    pip install TA_Lib-0.4.9-cp27-none-win32.whl
  • Pythonを開き、実行します.
    import talib
    エラーがない場合は、
  • のインストールに成功しました.
    必ず自分でコンパイルしてみるユーザーは、そのプロジェクトのWebサイトのチュートリアルに基づいてインストールできます.著者の2台のパソコンは、1台が直接インストールに成功し、もう1台がMinGWをインストールしたパソコンはGCCコンパイルエラーを報告した(実際には自分でコンパイルする意味がなく、カリフォルニア大学オーウェン校がパッケージしたwhlファイルに感謝し、多くの面倒を省いた).
    Linuxでのインストールでは、Anacondaのcondaツールを使用することを推奨します.
    conda install -c quantopian ta-lib=0.4.9
    具体的には、以下を参照してください.https://anaconda.org/Quantopian/ta-lib
    DEMO
    次の戦略DEMOはvn.traderのCTAモジュールで直接使用できます(リターン、シミュレーション取引)、実盤では使用しないでください!
    # encoding: UTF-8
    
    import talib as ta
    import numpy as np
    
    from ctaBase import *
    from ctaTemplate import CtaTemplate
    
    
    ########################################################################
    class TalibDoubleSmaDemo(CtaTemplate):
        """  Talib          Demo"""
    
        className = 'TalibDoubleSmaDemo'
        author = u'ideaplat'
    
        #     
        fastPeriod = 5      #       
        slowPeriod = 20     #       
        initDays = 5        #           
    
        #     
        bar = None
        barMinute = EMPTY_STRING
    
        closeHistory = []       #   K       
        maxHistory = 50         #       
    
        fastMa0 = EMPTY_FLOAT   #            
        fastMa1 = EMPTY_FLOAT   #           
    
        slowMa0 = EMPTY_FLOAT   #       
        slowMa1 = EMPTY_FLOAT
    
    
        #     ,        
        paramList = ['name',
                     'className',
                     'author',
                     'vtSymbol',
                     'fastPeriod',
                     'slowPeriod']
    
        #     ,        
        varList = ['inited',
                   'trading',
                   'pos',
                   'fastMa0',
                   'fastMa1',
                   'slowMa0',
                   'slowMa1']
    
        # ----------------------------------------------------------------------
        def __init__(self, ctaEngine, setting):
            """Constructor"""
            super(TalibDoubleSmaDemo, self).__init__(ctaEngine, setting)
    
        # ----------------------------------------------------------------------
        def onInit(self):
            """     (         )"""
            self.writeCtaLog(u' SMA       ')
    
            initData = self.loadBar(self.initDays)
            for bar in initData:
                self.onBar(bar)
    
            self.putEvent()
    
        # ----------------------------------------------------------------------
        def onStart(self):
            """    (         )"""
            self.writeCtaLog(u' SMA      ')
            self.putEvent()
    
        # ----------------------------------------------------------------------
        def onStop(self):
            """    (         )"""
            self.writeCtaLog(u' SMA      ')
            self.putEvent()
    
        # ----------------------------------------------------------------------
        def onTick(self, tick):
            """    TICK  (         )"""
            #   K 
            tickMinute = tick.datetime.minute
    
            if tickMinute != self.barMinute:
                if self.bar:
                    self.onBar(self.bar)
    
                bar = CtaBarData()
                bar.vtSymbol = tick.vtSymbol
                bar.symbol = tick.symbol
                bar.exchange = tick.exchange
    
                bar.open = tick.lastPrice
                bar.high = tick.lastPrice
                bar.low = tick.lastPrice
                bar.close = tick.lastPrice
    
                bar.date = tick.date
                bar.time = tick.time
                bar.datetime = tick.datetime  # K         Tick   
    
                #                ,      
                # bar.volume = tick.volume
                # bar.openInterest = tick.openInterest
    
                self.bar = bar  #             ,    
                self.barMinute = tickMinute  #        
    
            else:  #         K 
                bar = self.bar  #           
    
                bar.high = max(bar.high, tick.lastPrice)
                bar.low = min(bar.low, tick.lastPrice)
                bar.close = tick.lastPrice
    
        # ----------------------------------------------------------------------
        def onBar(self, bar):
            """  Bar  (         )"""
            #              
            self.closeHistory.append(bar.close)
    
            #       ,                
            #               ,    
            if len(self.closeHistory) > self.maxHistory:
                self.closeHistory.pop(0)
            #         ,            ,       
            else:
                return
    
            #            numpy   ,  talib   SMA   
            closeArray = np.array(self.closeHistory)
            fastSMA = ta.SMA(closeArray, self.fastPeriod)
            slowSMA = ta.SMA(closeArray, self.slowPeriod)
    
            #     K     K    ,        
            self.fastMa0 = fastSMA[-1]
            self.fastMa1 = fastSMA[-2]
            self.slowMa0 = slowSMA[-1]
            self.slowMa1 = slowSMA[-2]
    
            #     
            crossOver = self.fastMa0>self.slowMa0 and self.fastMa1self.slowMa1    #     
    
            #            
            if crossOver:
                #            ,     
                if self.pos == 0:
                    self.buy(bar.close, 1)
                #        ,    ,   
                elif self.pos < 0:
                    self.cover(bar.close, 1)
                    self.buy(bar.close, 1)
            #        
            elif crossBelow:
                if self.pos == 0:
                    self.short(bar.close, 1)
                elif self.pos > 0:
                    self.sell(bar.close, 1)
                    self.short(bar.close, 1)
    
            #         
            self.putEvent()
    
        # ----------------------------------------------------------------------
        def onOrder(self, order):
            """        (         )"""
            #                ,    onOrder
            pass
    
        # ----------------------------------------------------------------------
        def onTrade(self, trade):
            """      (         )"""
            #                ,    onOrder
            pass
    

    (コミュニティideaplatユーザーの貢献に感謝します!著者はいくつかの小さな修正をしました.)
    上のコードをtalibDemo.pyファイルに保存した後、vn.traderのctaAlgoフォルダ内のctaBacktesting.pyを参照してエコーを実行したり、ctaSettings.pyで構成した後、vn.traderでシミュレーション取引を行うことができます.
    上記のDEMOから,talibの技術的指標関数は主に1つのnumpy配列を元のデータとし,いくつかの指標アルゴリズムのパラメータを入力として受け入れ,返されるデータもnumpy配列であり,非常に便利であることがわかる.
    注意データのキャッシュにはnumpy配列ではなくPythonリストが使用されます.主な原因はnumpy配列のappendメソッドの本質は、元の配列のデータと新しいデータを組み合わせて新しい配列オブジェクトを生成することであり、リストのappendに比べてオーバーヘッドが高いためです.