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.
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.
Smart Trade Co., Ltd.
Finanzdemokratie
Basierend auf dieser Philosophie haben wir "QuantX Factory" entwickelt, eine Plattform, auf der jeder problemlos Handelsalgorithmen entwickeln kann.
――Die Anzahl der Aktien, die an diesem Tag verkauft wurden ――Sie können die Aktivität des Kaufens und Verkaufens erfassen
** "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.
** Goldenes Kreuz: Geldsack: ** </ font> ――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: ――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 **
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 |
# 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")
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!
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