[PYTHON] Ich habe versucht, mit Quantx eine Linie mit gleitendem Durchschnitt des Volumens zu implementieren

Vorstellen

Mein Name ist Masukawa (https://www.facebook.com/ryozodesert) und ich bin Praktikant bei Smart Trade Co., Ltd., einem Studenten im zweiten Jahr an der Fakultät für Wissenschaft und Technologie einer bestimmten M-Universität. .. Ich bin noch ein Anfänger, daher bin ich mir sicher, dass es viele Dinge gibt, bei denen ich mir nicht sicher bin, aber ich hoffe, dass Sie bis zum Ende bei mir bleiben.

Was ist in diesem Artikel zu tun?

Da es die dritte Woche unseres Praktikums ist, möchte ich den in Quantx Factory implementierten Algorithmus vorstellen. Dieses Mal werden wir einen Aktienhandelsalgorithmus unter Verwendung des ** gleitenden Durchschnittsvolumens ** implementieren, der einer der bekanntesten technischen Indikatoren ist.

Was ist QuantX Factory?

Smart Trade Co., Ltd.

Finanzdemokratie

Basierend auf dieser Philosophie haben wir "QuantX Factory" entwickelt, eine Plattform, auf der jeder problemlos Handelsalgorithmen entwickeln kann.

Stärken

Hauptthema

Verstehen Sie, wie die Linie mit dem gleitenden Durchschnitt des Volumens funktioniert

Was ist Volumen

――Die Anzahl der Aktien, die an diesem Tag verkauft wurden ――Sie können die Aktivität des Kaufens und Verkaufens erfassen

  • Das Histogramm unten im Bild unten

alt

** "Volumen geht Aktienkurs voraus" **

Es wird gesagt, dass sich das Handelsvolumen vor der Bewegung der Aktienkurse ändert. Mit anderen Worten, wenn Sie gleitenden Durchschnitt des Volumens </ font> verwenden, finden Sie Kauf- und Verkaufszeichen möglicherweise schneller.

Was ist eine gleitende Durchschnittslinie?

alt

  • Ein gestricheltes Diagramm, das den Durchschnittswert darstellt, der durch Summieren der Schlusskurse für mehrere Tage und Teilen durch die Anzahl der Tage erhalten wird. ――Bei der Beobachtung der beiden Linien "Kurzzeitlinie" und "Langzeitlinie" werden Anzeichen für Kauf und Verkauf festgestellt
  • Kurzfristige Linie: Gleitende durchschnittliche Linie mit kurzen Referenztagen (in der Regel 5 Tage)
  • Langfristige Linie: Gleitende durchschnittliche Linie mit langen Referenztagen (in der Regel 25 Tage)
  • Kaufen Sie bei Golden Cross </ font> und geben Sie ein Verkaufssignal bei Dead Cross </ font>
  • Einzelheiten finden Sie unter hier.

Was sind Goldenes Kreuz und Totes Kreuz?

  • ** Goldenes Kreuz: Geldsack: ** </ font> alt ――Es ist der Moment, in dem die kurzfristige Linie die langfristige Linie überschreitet, was darauf hinweist, dass sich der Abwärtstrend in einen Aufwärtstrend verwandelt.

  • ** Als Kaufschild verwendet **

  • ** Totes Kreuz ** </ font>: Schädel: alt ――Der Moment, in dem die kurzfristige Linie unter die langfristige Linie fällt, zeigt an, dass sich der Aufwärtstrend in einen Abwärtstrend verwandelt.

  • ** Als Verkaufsschild verwendet **

Was ist die gleitende Durchschnittslinie?

  • Anstelle des Schlusskurses für mehrere Tage wird der gleitende Durchschnitt des Volumens </ font> für mehrere Tage ermittelt.
  • Die Art und Weise, Kauf- und Verkaufssignale auszugeben, entspricht der gleitenden Durchschnittslinie.
Kurz- und Langzeitleitungsstatus Richtlinie für die Beurteilung
Goldenes Kreuz tritt auf Signal kaufen
Kurzfristige Leitung>Langzeitlinie Aufwärtstrend
Kurzfristige Leitung<Langzeitlinie Abwärtstrend
Totes Kreuz tritt auf Schild verkaufen

Code


# Sample Algorithm
#Bibliotheksimport
#Erforderliche Bibliothek
import maron
import maron.signalfunc as sf
import maron.execfunc as ef
#Zusätzliche Bibliothek
#In den Hinweisen auf dem rechten Bildschirm finden Sie die Bibliotheken, die verwendet werden können ①
import pandas as pd
import talib as ta
import numpy as np

#Bestellmethode(Bitte kommentieren Sie nur eine der beiden folgenden entsprechend der gewünschten Bestellmethode aus)
#Die Bestellmethode finden Sie im Hinweis auf dem rechten Bildschirm ②
#ot = maron.OrderType.MARKET_CLOSE #Bestellung zum Zeitpunkt des Schlusskurses am Tag nach Signalausgabe
ot = maron.OrderType.MARKET_OPEN   #Bestellung zum Zeitpunkt des Eröffnungskurses am Tag nach Signalausgabe
#ot = maron.OrderType.LIMIT        #Bestellung begrenzen

#Erwerb von Aktien und Spalten
#Die Bezeichnung der Marke ③ entnehmen Sie bitte dem Hinweis auf dem rechten Bildschirm
#Bitte beachten Sie den Hinweis auf dem rechten Bildschirm, um Spalten zu erhalten ④
def initialize(ctx):
  #Aufbau
  ctx.logger.debug("initialize() called")
  ctx.high_term = 10
  ctx.holding_days = 5
  ctx.configure(
    channels={               #Kanal verwendet
      "jp.stock": {
        "symbols": [
            "jp.stock.2914", #JT(Japanische Tabakindustrie)
            "jp.stock.8766", #Tokio Marine Holdings
            "jp.stock.8031", #Mitsui Bussan
            "jp.stock.8316", #Sumitomo Mitsui Financial Group
            "jp.stock.8411", #Mizuho Financial Group
            "jp.stock.9437", #NTT Docomo
            "jp.stock.4502", #Takeda Pharmazeutische Industrie
            "jp.stock.8058", #Mitsubishi Corporation
            "jp.stock.9433", #KDDI
            "jp.stock.9432", #Nippon Telecom Telefon
            "jp.stock.7267", #Honda (Honda Giken Kogyo)
            "jp.stock.8306", #Mitsubishi UFJ Financial Group
            "jp.stock.4503", #Astellas Pharmaceutical
            "jp.stock.4063", #Shinetsu Chemische Industrie
            "jp.stock.7974", #Nintendo
            "jp.stock.6981", #Murata Seisakusho
            "jp.stock.3382", #Seven & i Holdings
            "jp.stock.9020", #East Japan Passagierbahn
            "jp.stock.8802", #Mitsubishi Estate
            "jp.stock.9022", #Tokai Passagierbahn
            "jp.stock.9984", #Softbank Group
            "jp.stock.6861", #Keyence
            "jp.stock.6501", #Hitachi, Ltd.
            "jp.stock.6752", #Panasonic
            "jp.stock.6758", #Sony
            "jp.stock.6954", #Fanac
            "jp.stock.7203", #Toyota Motor
            "jp.stock.7751", #Kanon
            "jp.stock.4452", #Kao
            "jp.stock.6098", #Rekrutieren Sie Beteiligungen
        ],
        "columns": [
          "close_price",     #Schlusskurs
          "close_price_adj", #Schlusskurs(Nach Bereinigung um Aktiensplit)
          "volume_adj",     #Volumen
          #"txn_volume",     #Handelspreis
        ]
      }
    }
  )
  
  #Signaldefinition
  def _my_signal(data):
    #Abrufen von Volumendaten
    vol = data["volume_adj"].fillna(method = "ffill")
    

    syms = data.minor_axis   #Bestandsliste erstellen
    dates = data.major_axis  #Datumsliste erstellen
   
  
    #Volumen gleitender Durchschnitt
    mav5 = vol.rolling(window = 5, center = False).mean()
    mav25 = vol.rolling(window = 25, center = False).mean()
    
    ratio = mav5 / mav25
       
    #Goldenes Kreuz, totes Kreuz der gleitenden Durchschnittslinie
    vol_golden = (ratio >= 1.04) & (ratio.shift(1) < 1.0) #(mav5 > mav25) & (mav5.shift(1) < mav25.shift(1))
    vol_dead = (ratio <= 0.97)  & (ratio.shift(1) > 1.0)  #(mav5 < mav25) & (mav5.shift(1) > mav25.shift(1))
    #Die Verschiebungsmethode verschiebt die im DataFrame enthaltenen Daten um eins und vergleicht sie mit dem Verhältnis vom Vortag, um das goldene Kreuz und das tote Kreuz zu bestimmen.
    
    #Kauf und Verkauf von Signalerzeugungsteilen
    
    buy_sig = vol_golden
    sell_sig =  vol_dead 

    #market_Erstellen Sie einen Datenrahmen namens sig, der alle Nullen enthält
    market_sig = pd.DataFrame(data=0.0, columns=syms, index=dates)
    
    #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
    # ctx.logger.debug(market_sig)

    return {
      "mav5:g2": mav5,
      "mav25:g2": mav25,
      "market:sig": market_sig,
    }

  #Signalregistrierung
  ctx.regist_signal("my_signal", _my_signal)

def handle_signals(ctx, date, current):  #Täglicher Verarbeitungsteil
  '''
  current: pd.DataFrame
  '''
  #initialisieren_my_Vermarkten Sie das durch das Signal erzeugte Signal_In Sig
  market_sig = current["market:sig"]
  done_syms = set([])  #Legen Sie den Typ fest, in dem Aktien gespeichert werden, für die eine Gewinnabrechnung und eine Verlustkürzung durchgeführt wurden
  none_syms = set([])  # portfolio.Legen Sie den Typ fest, in dem Marken gespeichert werden, die an Positionen nicht vorhanden sind
  # portfolio.positions(Marken, die Sie besitzen)Zielaktien(sym)Überprüfen Sie, ob es gibt
  for (sym, val) in market_sig.items():
    if sym not in ctx.portfolio.positions:
      none_syms.add(sym)
  # portfolio.positions(Marken, die Sie besitzen)Jede Marke von(sym)Überprüfen Sie, ob die Anzahl der von gehaltenen Aktien
  for (sym, val) in ctx.portfolio.positions.items():
    if val["amount"] == 0:
      none_syms.add(sym)
  #Verlustkürzung, Gewinnabrechnung(Rentabilität)Einstellungen von
  #Iterativer Prozess, um die Aktien, die Sie besitzen, einzeln zu überprüfen
  for (sym, val) in ctx.portfolio.positions.items():
    #Erwerb des Gewinn-Verlust-Verhältnisses
    returns = val["returns"]
    if returns < -0.03:  #Gewinn-Verlust-Verhältnis-3%Weniger als(Absolutwert 3%Größerer Verlust)Im Falle von
      #Verkaufsauftrag zur Verlustreduzierung
      sec = ctx.getSecurity(sym)
      sec.order(-val["amount"], comment="Verlustschnitt(%f)" % returns)
      #Das Problem, das sym zugewiesen wurde, wurde dem festgelegten Typ hinzugefügt, in dem das Problem gespeichert ist, für das eine Gewinnabrechnung und eine Verlustkürzung durchgeführt wurden.
      done_syms.add(sym)
    elif returns > 0.05:  #Gewinn-Verlust-Verhältnis+5%Wenn größer als
      #Gewinnmitnahme(Rentabilität)Bestellung verkaufen für
      sec = ctx.getSecurity(sym)
      sec.order(-val["amount"], comment="Gewinnmitnahmeverkauf(%f)" % returns)
      #Das Problem, das sym zugewiesen wurde, wurde dem festgelegten Typ hinzugefügt, in dem das Problem gespeichert ist, für das eine Gewinnabrechnung und eine Verlustkürzung durchgeführt wurden.
      done_syms.add(sym)
  buy = market_sig[market_sig > 0.0]  #Signal kaufen
  for (sym, val) in buy.items():  #Verarbeiten Sie Aktien mit Kaufsignalen nacheinander
    # done_syms oder keine_Wenn syms sym hat
    if sym in done_syms:
      continue  #Verarbeitung überspringen
    #Bestellung kaufen
    sec = ctx.getSecurity(sym)
    sec.order(sec.unit() * 1, orderType=ot, comment="SIGNAL BUY")
    #Wenn Sie das unten stehende Kaufauftragsprotokoll ausgeben möchten, kommentieren Sie dies bitte unten aus(Langfristige Vorsicht)
    #ctx.logger.debug("BUY: %s,  %f" % (sec.code(), val))
  sell = market_sig[market_sig < 0.0]  #Signal verkaufen
  for (sym, val) in sell.items():  #Verarbeiten Sie Aktien mit Verkaufssignalen nacheinander
    # done_syms oder keine_Wenn syms sym hat
    if (sym in done_syms) | (sym in none_syms):
      continue  #Verarbeitung überspringen
    #Bestellung verkaufen
    sec = ctx.getSecurity(sym)
    sec.order(sec.unit() * -1,orderType=ot, comment="SIGNAL SELL")
  • Der vollständige Code lautet hier.
  • Die Details des Algorithmus sind in den Kommentaren in jeder Zeile beschrieben.

Ergebnis

alt

Bewertung / Überlegung

  • Das Sharp Ratio (Investitionseffizienz) ist recht gut ――Die Gewinn- und Verlustquote für ein Jahr ist mit 18% ebenfalls ausgezeichnet. ――Wenn Sie sich einzelne Marken ansehen, sind Sie möglicherweise anfällig für einen starken Rückgang oder einen starken Anstieg.
  • Beispiel: Preisbewegung der Takeda Pharmaceutical Industry vom 18. Februar 2019 bis 18. Februar 2020 alt

Am Ende

In den letzten drei Wochen habe ich viel darüber gelernt, wie man mit QuantX Factory grundlegende Algorithmen entwickelt! In Zukunft möchte ich die Qualität des Algorithmus weiter verbessern, indem ich die Linie des gleitenden Durchschnitts des Volumens mit anderen technischen Indikatoren kombiniere und maschinelles Lernen einbeziehe. Damit ist dieser Artikel abgeschlossen. Vielen Dank, dass Sie den schlechten Text bis zum Ende gelesen haben!

Vorsichtsmaßnahmen zum Haftungsausschluss

Bitte beachten Sie, dass wir nicht für Gewinne oder Verluste verantwortlich sind, die durch tatsächliche Transaktionen mit diesem Code / Wissen verursacht werden.

materials https://qiita.com/Miku_F/items/49c20fcbbbfae59cb9a6

https://www.kabutore.biz/idoheikinsen.html

https://ib-college.com/idou-heikin

Recommended Posts