[PYTHON] Ich habe versucht, mit Quantx einen Ausbruch (Typ der Täuschungsvermeidung) zu implementieren

Einführung

Dieses Mal habe ich versucht, einen Breakout-Methodenalgorithmus bei Quantx Factory zu erstellen, der von Smart Trade Co., Ltd. bereitgestellt wird.

Vorstellen

Dies ist Qiitas erster Beitrag. Ich komme ursprünglich aus der Präfektur Kochi und besuche eine Universität in Yokohama. Mein Hauptfach ist Physik, Programmierung wird ein wenig in Universitätsversuchen verwendet, und ich bin ein absoluter Anfänger in Python (Schweiß) Ich habe neulich gerade ein Praktikum bei Smart Trade begonnen, daher möchte ich das, was ich von Zeit zu Zeit gelernt habe, als Ergebnis aktualisieren.

Was ist ein Ausbruch?

画像

Breakout ist das Durchbrechen der Punkte **, die vielen Marktteilnehmern bekannt sind, wie Widerstandslinien, Unterstützungslinien und höchste Preise.

Grundsätzlich besteht nach dem Ausbruch die Gewohnheit, zu einem höheren Preis (billiger) zu gehen.

Vor- und Nachteile der Breakout-Methode

·verdienen

In einem starken Markt können Sie unverzüglich Gewinne erzielen. (Stark gegen Trends)

· Fehler

Wenn Sie nicht brechen, weil Sie eine Position in der hohen Preisspanne einnehmen (Täuschung), ist die Verlustkürzung tendenziell groß.

Signal unter Berücksichtigung von Nachteilen

Nachdem Sie den hohen Preis der letzten 10 Tage gebrochen haben, wählen Sie die Stelle aus, an der Sie 50% oder mehr gegen die Preisspanne der 10 Tage gedrückt haben. Um eine Täuschung zu vermeiden, wird die Stärke des Trends anhand des technischen Index ADX beurteilt. (Für den Schlusskurs wird der für den Aktiensplit angepasste Wert verwendet.)

Zahlungsmethode

Abrechnung an dem Punkt, an dem der letzte niedrige Preis aktualisiert wurde Darüber hinaus werden wir für das Fondsmanagement entsprechend der Zu- und Abnahmerate abrechnen.

Code

Kopie ↑ Bitte teilen.

import maron
import pandas as pd
import numpy as np
import talib as ta

ot = maron.OrderType.MARKET_OPEN   #Bestellung zum Zeitpunkt des Eröffnungskurses am Tag nach Signalausgabe

def initialize(ctx):
    #Aufbau
    ctx.logger.debug("initialize() called")

    #Wie viele Tage in der Vergangenheit zu beobachten
    ctx.high_term = 10
    ctx.low_term = 10
    ctx.vol_term = 10
    #Wie viel Prozent haben Sie für Ihre Position?
    ctx.target = 0.5 
    
    ctx.configure(
      channels={          #Kanal verwendet
        "jp.stock": {
          "symbols": [
            "jp.stock.7203",
            "jp.stock.9984",
            "jp.stock.8306",
            "jp.stock.4502",
            "jp.stock.6758",
            "jp.stock.6861",
            "jp.stock.9432",
            "jp.stock.8316",
            "jp.stock.7267",
            "jp.stock.8411",
            "jp.stock.6098",
            "jp.stock.7974",
            "jp.stock.9433",
            "jp.stock.9022",
            "jp.stock.8058",
            "jp.stock.4452",
            "jp.stock.8766",
            "jp.stock.6954",
            "jp.stock.6981",
            "jp.stock.9020",
            "jp.stock.4063",
            "jp.stock.7751",
            "jp.stock.6501",
            "jp.stock.3382",
            "jp.stock.9437",
            "jp.stock.8031",
            "jp.stock.4503",
            "jp.stock.8802",
            "jp.stock.6752",
          ],
          "columns": [
            "high_price_adj",
            "low_price_adj",
            "close_price_adj"
            "volume_adj",
            ]}})  

    def _BREAK_NEW_HIGH(data):

      #Geben Sie fehlende Werte ein
      hp = data["high_price_adj"].fillna(method="ffill")
      lp = data["low_price_adj"].fillna(method="ffill")
      cp = data["close_price_adj"].fillna(method="ffill")
      vol = data["volume_adj"].fillna(method="ffill")
      #Holen Sie sich den höchsten Preis in den letzten 10 Tagen
      new_max = hp.rolling(window=ctx.high_term, center=False).max()
      new_min = lp.rolling(window=ctx.low_term, center=False).min()
      vol_max = vol.rolling(window=ctx.vol_term, center=False).max()
      #Authentizität, ob der höchste Preis der gleiche ist wie der heutige hohe Preis
      today_is_new_high = new_max == hp
      today_is_new_low = new_min == lp
      today_is_vol_max = vol_max == vol

      price_range = new_max - new_min   #Preisklasse
      
      ADX = pd.DataFrame(data=0,columns=cp.columns, index=cp.index)
      
      for (sym,val) in cp.items():
        ADX[sym] = ta.ADX(hp[sym], lp[sym], cp[sym], timeperiod=14)
      
      buy_sig1 = (new_max - lp) > price_range*0.5
      buy_sig2 = ADX > 32
      buy_sig = (buy_sig1) & (buy_sig2)
      sell_sig = lp < new_min
      
      # market_Erstellen Sie einen Datenrahmen namens sig, der alle Nullen enthält
      market_sig = pd.DataFrame(data=0.0, columns=hp.columns, index=hp.index)
  
      # buy_1, wenn sig True ist.0、sell_Wenn sig wahr ist-1.Auf 0 setzen
      market_sig[buy_sig == True] = 1.0
      market_sig[sell_sig == True] = -1.0
      market_sig[(buy_sig == True) & (sell_sig == True)] = 0.0
    
      return {
        "ADX":ADX, 
        "New High":new_max, 
        "New Low":new_min,
        "price range":price_range,
        "market:sig": market_sig,
        }

    #Signalregistrierung
    ctx.regist_signal("BREAK_NEW_HIGH", _BREAK_NEW_HIGH)
    
def handle_signals(ctx, date, current):    
   
    market_sig = current["market:sig"]

    done_syms = set([])
  
    #Verlustkürzung, Gewinnsituation
    for (sym, val) in ctx.portfolio.positions.items():
      returns = val["returns"]
      if returns < -0.025:
        sec = ctx.getSecurity(sym)
        sec.order(-val["amount"], comment="Verlustschnitt(%f)" % returns)
        done_syms.add(sym)
      elif returns > 0.07:
        sec = ctx.getSecurity(sym)
        sec.order(-val["amount"], comment="Gewinnmitnahmeverkauf(%f)" % returns)
        done_syms.add(sym)
  
    #Signal kaufen
    buy = market_sig[market_sig > 0.0]
    for (sym, val) in buy.items():
      if sym in done_syms:
        continue
  
      sec = ctx.getSecurity(sym)
      sec.order(sec.unit() * 1.5,orderType=ot, comment="SIGNAL BUY")
      # ctx.logger.debug("BUY: %s,  %f" % (sec.code(), val))
      pass
  
    #Signal verkaufen
    sell = market_sig[market_sig < 0.0]
    for (sym, val) in sell.items():
      if sym in done_syms:
        continue
      sec = ctx.getSecurity(sym)
      sec.order(sec.unit() * -1.5,orderType=ot, comment="SIGNAL SELL")
      #ctx.logger.debug("SELL: %s,  %f" % (sec.code(), val))
      pass

Ausführungsergebnis

結果ブレイクアウト .PNG

Ich habe den Marktpreis der letzten 3 Jahre erneut getestet.

Gewinn-Verlust-Verhältnis: 77,71% Maximaler Drawdown: 10,1% Scharfes Verhältnis: 1,682 Volatilität: 0,123 α : 0.162 β : 0.525

Impressionen / Diskussion

Das Ergebnis selbst ist nicht schlecht, aber die Anzahl der Transaktionen war viel höher als ich erwartet hatte. Wahrscheinlich, weil es viel Pyramiting gibt (zusätzlicher Kauf). (Vielleicht können Sie etwas seltener handeln)

Als Verbesserungspunkt ・ Unterdrücken Sie DD etwas mehr ・ Überprüfung der Einstiegspunkte ・ Implementierung des Portfoliomanagements ・ Es kommt nicht viel auf die Marke an

Ist das der Ort ...

Wenn es verbessert werden kann, werde ich es entsprechend korrigieren. (Artikelschreibdatum 2020/2/17)

Referenzseite

・ Was ist scharfes Verhältnis, maximale DD und Volatilität? [Sehen Sie sich den Algorithmusindex so an! ]] https://blog.quantx.io/2019/03/25/yenzo-algo-erabikata/

・ Neuer Hochpreis-Update-Algorithmus #QuantX https://qiita.com/shinseitaro/items/a098d99f15e99ac3e0c3

Vorsichtsmaßnahmen zum Haftungsausschluss

Bitte beachten Sie, dass wir nicht für Gewinne oder Verluste verantwortlich sind, die bei tatsächlichen Transaktionen mit diesem Code oder Wissen entstehen.

Recommended Posts

Ich habe versucht, mit Quantx einen Ausbruch (Typ der Täuschungsvermeidung) zu implementieren
Ich habe versucht, mit Quantx eine Linie mit gleitendem Durchschnitt des Volumens zu implementieren
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe versucht, CVAE mit PyTorch zu implementieren
Ich habe versucht, das Lesen von Dataset mit PyTorch zu implementieren
Ich habe versucht, PCANet zu implementieren
Ich habe versucht, StarGAN (1) zu implementieren.
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich habe versucht, Grad-CAM mit Keras und Tensorflow zu implementieren
Ich habe versucht, SSD jetzt mit PyTorch zu implementieren (Dataset)
Ich habe versucht, Deep VQE zu implementieren
Ich habe versucht, eine kontroverse Validierung zu implementieren
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
Ich habe versucht, Harry Potters Gruppierungshut mit CNN umzusetzen
Ich habe versucht, Realness GAN zu implementieren
Ich habe versucht, SSD jetzt mit PyTorch zu implementieren (Modellversion)
Ich habe versucht, die Satzklassifizierung durch Self Attention mit PyTorch zu implementieren
Ich habe versucht, PLSA in Python zu implementieren
Ich habe versucht, Permutation in Python zu implementieren
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich habe versucht, mit Hy anzufangen
Ich habe versucht, PLSA in Python 2 zu implementieren
Ich habe versucht, ADALINE in Python zu implementieren
Ich habe versucht, PPO in Python zu implementieren
Ich habe versucht, TSP mit QAOA zu lösen
Ich habe versucht, Deep Learning zu implementieren, das nicht nur mit NumPy tiefgreifend ist
Ich habe versucht, eine Blockchain zu implementieren, die tatsächlich mit ungefähr 170 Zeilen funktioniert
Ich habe versucht, nächstes Jahr mit AI vorherzusagen
Ich habe versucht, lightGBM, xg Boost mit Boruta zu verwenden
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen
Ich habe versucht, Keras in TFv1.1 zu integrieren
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, TOPIC MODEL in Python zu implementieren
Ich habe versucht, ein Objekt mit M2Det zu erkennen!
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe versucht, das Überleben der Titanic mit PyCaret vorherzusagen
Ich habe versucht, Linux mit Discord Bot zu betreiben
Ich habe versucht, eine selektive Sortierung in Python zu implementieren
Ich habe versucht, DP mit Fibonacci-Sequenz zu studieren
Ich habe versucht, Jupyter mit allen Amazon-Lichtern zu starten
Ich habe versucht, Tundele mit Naive Bays zu beurteilen
Ich habe versucht, das Problem des Handlungsreisenden umzusetzen
Ich habe versucht, die Zusammenführungssortierung in Python mit möglichst wenigen Zeilen zu implementieren
Ich habe versucht, Cifar10 mit der SONY Deep Learning Library NNabla [Nippon Hurra] zu implementieren.
Ich habe versucht zu debuggen.
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich habe versucht, maschinelles Lernen (Objekterkennung) mit TouchDesigner zu verschieben
Ich habe versucht, ein multivariates statistisches Prozessmanagement (MSPC) zu implementieren.
Ich wollte auch Typhinweise mit numpy überprüfen
Ich habe versucht, mit VOICEROID2 2 automatisch zu lesen und zu speichern
Ich habe versucht, mit Blenders Python script_Part 01 zu beginnen
Ich habe versucht, eine CSV-Datei mit Python zu berühren