[PYTHON] Créez des algorithmes de base avec Smart Trade

Qu'est-ce que le commerce intelligent

Qu'est-ce que Smart Trade? Le nom du service de plate-forme de développement d'algorithmes d'investissement en actions fourni par Smart Trade Co., Ltd. ~~ Actuellement, la version bêta, mais la version officielle sera bientôt publiée ~~ (Ajouté le 25/11/2017: Version officielle publiée le 20/11/2017, le nom du service est également "QuantX")

Les algorithmes de trading peuvent être écrits en utilisant Python et le backtesting peut être effectué facilement.

Les éléments suivants peuvent utiliser le service HP https://smarttrade.co.jp

Lien référencé

Créez un algorithme en vous référant au post Qiita ci-dessous HP dispose également d'un exemple d'algorithme, vous pouvez donc vous y référer également. Nous attendons la mise en valeur du tutoriel

Essayez de développer un algorithme d'investissement avec Python 1 http://qiita.com/hiroshimoda/items/e89444729fe7d25c0275

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

Comment écrire un algorithme

Didacticiel

Ci-dessous un tutoriel simple https://beta.smarttrade.co.jp/handbook/ja/

Configuration de l'algorithme

Les algorithmes sur Smart Trade sont à peu près divisés en trois. Chacun a les fonctions suivantes

Initialisation

Lors de l'initialisation, définissez le marché (action japonaise, action chinoise) à utiliser dans l'algorithme, l'action à échanger et le prix à utiliser (cours de clôture, cours élevé, etc.)

initialize.py


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

Définition du signal

Décrivez l'algorithme qui génère un signal d'achat / vente dans la section de définition du signal. Cette fois, en utilisant MACD, l'histogramme MACD est ・ Convertir de moins en plus: acheter ・ Conversion de plus en moins: Vendre Créer un algorithme simple

algorism.py


def _TALIB_CALL(data):
    #Définissez la valeur à utiliser
      hp = data["high_price_adj"].fillna(method="ffill")
      lp = data["low_price_adj"].fillna(method="ffill")
      cp = data["close_price_adj"].fillna(method="ffill")

    #Définir des variables
      result_macd = {}
      result_macdsignal = {}
      result_macdhist = {}
      result = pd.DataFrame(data=0,columns=cp.columns, index=cp.index)

      for (sym,val) in cp.items():#MACD pour chaque marque,Signal MACD,Calculer l'histogramme MACD
        
        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)

        #Jugement croisé
        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]
      
      
      #Définir les signaux d'achat et de vente
      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,
      }
    #Enregistrement du signal
    ctx.regist_signal("TALIB_CALL", _TALIB_CALL)

Acheter et vendre

Dans la section achat et vente, décrivez la quantité à acheter et à vendre, la rentabilité et les critères de réduction des pertes en fonction de l'algorithme décrit dans la définition du signal.

handle_signals.py


def handle_signals(ctx, date, current):
    
    #Traitement lorsqu'un signal d'achat est émis
    buy = current["buy:sig"].dropna()
    for (sym, val) in buy.items():

        sec = ctx.getSecurity(sym)
        sec.order(sec.unit()*1, comment="Acheter signal(%f)" % val)
        pass
      
   #Traitement lorsqu'un signal de vente est émis
    sell = current["sell:sig"].dropna()
    for (sym, val) in sell.items():

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

    pass

Algorithme complet

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)

    #Réglage
    ctx.configure(
        target="jp.stock.daily",
        channels={          #Canal utilisé
            "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",        #le dernier prix
            "close_price_adj",    #le dernier prix(Après ajustement pour le fractionnement d'actions) 
            "volume_adj",         #Le volume
      ]
      }
      }
    )
    
    # 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,
      }

    
    #Enregistrement du signal
    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="Acheter signal(%f)" % val)
        pass
      
    sell = current["sell:sig"].dropna()
    for (sym, val) in sell.items():

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

    pass

résultat

La sortie suivante apparaît pour le résultat global スクリーンショット 2017-08-27 14.13.25.png

Il est possible de vérifier visuellement les résultats de négociation pour des actions individuelles. Le cercle rouge est le signal d'achat, le cercle bleu est le signal de vente スクリーンショット 2017-08-27 14.15.05.png

Lorsque l'histogramme MACD seul est émis, la sortie sera la suivante. スクリーンショット 2017-08-27 14.15.26.png

En le superposant sur le graphique des prix de l'action, vous pouvez confirmer que vous pouvez acheter et vendre correctement au point où l'histogramme MACD croise 0. Cependant, certaines pièces ne sont ni achetées ni vendues même si elles dépassent 0, et on peut en déduire qu'elles n'ont pas pu être achetées ou vendues en raison du solde avec la position globale à ce moment-là, mais une confirmation est requise. スクリーンショット 2017-08-27 14.15.47.png

Comment cela se fera à l'avenir

Je souhaite apprendre la méthode d'analyse des données en séries chronologiques et créer un algorithme capable de capturer ce que l'on appelle le «double fond» et la «divergence baissière et haussière».

Recommended Posts

Créez des algorithmes de base avec Smart Trade
Créez des jeux avec Pygame
Créer un filtre avec scipy
Créer un environnement avec virtualenv
Créez Cloud TPU avec tf-nightly
Créer une API avec Django
Authentification BASIC avec bouteille Python
Créer / rechercher / créer une table avec PynamoDB
Créer un gif 3D avec python3
tracé Créer un graphique avec un bouton
[Python] Utilisation d'OpenCV avec Python (basique)
Créer une page d'accueil avec django
Créer une visionneuse d'images avec Tkinter
Créez des règles personnalisées avec ElastAlert
Créez une carte des brevets avec Streamlit
[Python] [SQLite3] Exploiter SQLite avec Python (basique)
Créer un répertoire avec python
Créer un fichier xlsx avec XlsxWriter
Je voulais créer une présentation intelligente avec Jupyter Notebook + nb present