[PYTHON] Erstellen Sie mit Smart Trade grundlegende Algorithmen

Was ist Smart Trade?

Was ist Smart Trade? Der Name des von Smart Trade Co., Ltd. bereitgestellten Entwicklungsplattformdienstes für Aktieninvestitionsalgorithmen. ~~ Derzeit die Beta-Version, aber die offizielle Version wird bald veröffentlicht ~~ (Hinzugefügt am 25.11.2017: Offizielle Version veröffentlicht am 20.11.2017, Dienstname ist auch "QuantX")

Handelsalgorithmen können mit Python geschrieben werden, und Backtesting kann einfach durchgeführt werden.

Im Folgenden können Sie den Dienst von HP verwenden https://smarttrade.co.jp

Referenzierter Link

Erstellen Sie einen Algorithmus, indem Sie auf den folgenden Qiita-Beitrag verweisen HP hat auch einen Beispielalgorithmus, auf den Sie auch verweisen können. Wir warten auf die Erweiterung des Tutorials

Versuchen Sie, mit Python 1 einen Investitionsalgorithmus zu entwickeln http://qiita.com/hiroshimoda/items/e89444729fe7d25c0275

Building Algorithmic Strategies on SmartTrade http://qiita.com/vinyip918/items/8623c5e902b113becd38

Wie schreibe ich einen Algorithmus?

Lernprogramm

Unten finden Sie ein einfaches Tutorial https://beta.smarttrade.co.jp/handbook/ja/

Algorithmuskonfiguration

Die Algorithmen für Smart Trade sind grob in drei Bereiche unterteilt. Jeder hat die folgenden Funktionen

Initialisieren

Legen Sie bei der Initialisierung den Markt (japanische Aktie, chinesische Aktie) fest, der im Algorithmus verwendet werden soll, die zu handelnde Aktie und den zu verwendenden Preis (Schlusskurs, hoher Preis usw.).

initialize.py


def initialize(ctx):
 ctx.configure(
  target="jp.stock.daily",
  channels={#Kanal verwendet
            "jp.stock": {"symbols": ["jp.stock.7203"],
                         "columns": [ "high_price_adj",       
                                      "low_price_adj","close_price",
                                      "close_price_adj","volume_adj",]
                        }})

Signaldefinition

Beschreiben Sie den Algorithmus, der ein Kauf- / Verkaufssignal ausgibt, im Abschnitt zur Signaldefinition. Dieses Mal lautet das MACD-Histogramm unter Verwendung von MACD ・ Konvertieren Sie von Minus nach Plus: Kaufen ・ Umrechnung von Plus nach Minus: Verkaufen Erstellen Sie einen einfachen Algorithmus

algorism.py


def _TALIB_CALL(data):
    #Definieren Sie den zu verwendenden Wert
      hp = data["high_price_adj"].fillna(method="ffill")
      lp = data["low_price_adj"].fillna(method="ffill")
      cp = data["close_price_adj"].fillna(method="ffill")

    #Variablen definieren
      result_macd = {}
      result_macdsignal = {}
      result_macdhist = {}
      result = pd.DataFrame(data=0,columns=cp.columns, index=cp.index)

      for (sym,val) in cp.items():#MACD für jede Marke,MACD-Signal,Berechnen Sie das MACD-Histogramm
        
        result_macd[sym], result_macdsignal[sym], result_macdhist[sym] = ta.MACD(cp[sym].values.astype(np.double),
                                     fastperiod=12, slowperiod=26, signalperiod=9)

        macd = pd.DataFrame(data=result_macd,columns=cp.columns, index=cp.index)
        macdsignal = pd.DataFrame(data=result_macdsignal,columns=cp.columns, index=cp.index)
        macdhist = pd.DataFrame(data=result_macdhist,columns=cp.columns, index=cp.index)

        #Kreuzendes Urteil
        test = np.sign( macdhist[sym].values[1:]) - np.sign(macdhist[sym].values[:-1])
        n = len(test)
        for i, row in enumerate(test):
          result[sym][i+1] = 0 if isNaN(test[i]) else test[i]
      
      
      #Definieren Sie Kauf- und Verkaufssignale
      buy_sig = result[result >= 2]
      sell_sig = result[result <= -2]
      
      return {
            "macd": macd,
            "macdsignal": macdsignal,
            "macdhist": macdhist,
            "buy:sig": buy_sig,
            "sell:sig": sell_sig,
      }
    #Signalregistrierung
    ctx.regist_signal("TALIB_CALL", _TALIB_CALL)

Kaufen und verkaufen

Beschreiben Sie im Abschnitt "Kaufen und Verkaufen" die Kriterien für Kauf- und Verkaufsmenge, Rentabilität und Verlustreduzierung basierend auf dem in der Signaldefinition beschriebenen Algorithmus.

handle_signals.py


def handle_signals(ctx, date, current):
    
    #Verarbeitung, wenn ein Kaufsignal ausgegeben wird
    buy = current["buy:sig"].dropna()
    for (sym, val) in buy.items():

        sec = ctx.getSecurity(sym)
        sec.order(sec.unit()*1, comment="Signal kaufen(%f)" % val)
        pass
      
   #Verarbeitung, wenn ein Verkaufssignal ausgegeben wird
    sell = current["sell:sig"].dropna()
    for (sym, val) in sell.items():

        sec = ctx.getSecurity(sym)
        sec.order_target_percent(0, comment="Signalverkauf(%f)" % val)
        pass

    pass

Ganzer Algorithmus

MACD.py



import pandas as pd
import talib as ta
import numpy as np
def isNaN(num):
    return num != num


def initialize(ctx):
    #pp.pprint(vars(ctx))
    # print(ctx.positions)

    #Aufbau
    ctx.configure(
        target="jp.stock.daily",
        channels={          #Kanal verwendet
            "jp.stock": {
              "symbols": [
                "jp.stock.7203",  "jp.stock.7267",
                "jp.stock.7270",  "jp.stock.7269",
                "jp.stock.7259",  "jp.stock.7202",
                "jp.stock.7203",  "jp.stock.7205",
                "jp.stock.7208",  "jp.stock.7211",
                "jp.stock.7211",  "jp.stock.7276",
                "jp.stock.7272",  "jp.stock.7240",
                "jp.stock.3116",  "jp.stock.7282",
                "jp.stock.7248",  "jp.stock.7313",
                "jp.stock.6995",  "jp.stock.7222",
                "jp.stock.7278",  "jp.stock.7242",
                "jp.stock.7287",  "jp.stock.7251",
                "jp.stock.7230",  "jp.stock.5949",
                "jp.stock.7296",  "jp.stock.7279",
                "jp.stock.7250",  "jp.stock.5970",
                "jp.stock.7220",
              ],
              "columns": [ "high_price_adj", "low_price_adj","close_price",        #Schlusskurs
            "close_price_adj",    #Schlusskurs(Nach Bereinigung um Aktiensplit) 
            "volume_adj",         #Volumen
      ]
      }
      }
    )
    
    # talib sample...
    def _TALIB_CALL(data):

      hp = data["high_price_adj"].fillna(method="ffill")
      lp = data["low_price_adj"].fillna(method="ffill")
      cp = data["close_price_adj"].fillna(method="ffill")


      result_macd = {}
      result_macdsignal = {}
      result_macdhist = {}
      result = pd.DataFrame(data=0,columns=cp.columns, index=cp.index)

      for (sym,val) in cp.items():
        
        result_macd[sym], result_macdsignal[sym], result_macdhist[sym] = ta.MACD(cp[sym].values.astype(np.double),
                                     fastperiod=12, slowperiod=26, signalperiod=9)

        macd = pd.DataFrame(data=result_macd,columns=cp.columns, index=cp.index)
        macdsignal = pd.DataFrame(data=result_macdsignal,columns=cp.columns, index=cp.index)
        macdhist = pd.DataFrame(data=result_macdhist,columns=cp.columns, index=cp.index)

      
        test = np.sign( macdhist[sym].values[1:]) - np.sign(macdhist[sym].values[:-1])
        n = len(test)
        for i, row in enumerate(test):
          result[sym][i+1] = 0 if isNaN(test[i]) else test[i]
      
      
      
      buy_sig = result[result >= 2]
      sell_sig = result[result <= -2]
      
      return {
            "macd": macd,
            "macdsignal": macdsignal,
            "macdhist": macdhist,
            "buy:sig": buy_sig,
            "sell:sig": sell_sig,
      }

    
    #Signalregistrierung
    ctx.regist_signal("TALIB_CALL", _TALIB_CALL)

def handle_signals(ctx, date, current):
    
    buy = current["buy:sig"].dropna()
    for (sym, val) in buy.items():

        sec = ctx.getSecurity(sym)
        sec.order(sec.unit()*1, comment="Signal kaufen(%f)" % val)
        pass
      
    sell = current["sell:sig"].dropna()
    for (sym, val) in sell.items():

        sec = ctx.getSecurity(sym)
        sec.order_target_percent(0, comment="Signalverkauf(%f)" % val)
        pass

    pass

Ergebnis

Die folgende Ausgabe wird für das Gesamtergebnis angezeigt スクリーンショット 2017-08-27 14.13.25.png

Es ist möglich, die Handelsergebnisse für einzelne Aktien visuell zu überprüfen. Roter Kreis ist Kaufsignal, blauer Kreis ist Verkaufssignal スクリーンショット 2017-08-27 14.15.05.png

Wenn nur das MACD-Histogramm ausgegeben wird, lautet die Ausgabe wie folgt. スクリーンショット 2017-08-27 14.15.26.png

Indem Sie es dem Aktienkurschart überlagern, können Sie bestätigen, dass Sie an dem Punkt, an dem das MACD-Histogramm 0 schneidet, ordnungsgemäß kaufen und verkaufen können. Es gibt jedoch einige Teile, die nicht gekauft oder verkauft werden, selbst wenn sie 0 überschreiten, und es kann davon ausgegangen werden, dass sie aufgrund des Gleichgewichts mit der Gesamtposition zu diesem Zeitpunkt nicht gekauft oder verkauft werden konnten. Eine Bestätigung ist jedoch erforderlich スクリーンショット 2017-08-27 14.15.47.png

Wie es in Zukunft gemacht wird

Ich möchte die Datenanalysemethode in Zeitreihen lernen und einen Algorithmus erstellen, der die sogenannte "Double Bottom" - und "Bearish and Bullish Divergenz" erfassen kann.

Recommended Posts

Erstellen Sie mit Smart Trade grundlegende Algorithmen
Erstelle Spiele mit Pygame
Erstellen Sie einen Filter mit scipy
Erstellen Sie eine Umgebung mit virtualenv
Erstellen Sie Cloud-TPU mit tf-nightly
Erstellen Sie eine API mit Django
BASIC-Authentifizierung mit Python-Flasche
Erstellen / Suchen / Erstellen einer Tabelle mit PynamoDB
Erstellen Sie ein 3D-GIF mit Python3
Plotly Erstellen Sie ein Diagramm mit einer Schaltfläche
[Python] Verwenden von OpenCV mit Python (Basic)
Erstellen Sie eine Homepage mit Django
Erstellen Sie den Image Viewer mit Tkinter
Erstellen Sie benutzerdefinierte Regeln mit ElastAlert
Erstellen Sie eine Patentkarte mit Streamlit
[Python] [SQLite3] Betreiben Sie SQLite mit Python (Basic)
Erstellen Sie ein Verzeichnis mit Python
Erstellen Sie eine Xlsx-Datei mit XlsxWriter
Ich wollte eine intelligente Präsentation mit Jupyter Notebook + nb present erstellen