Dieses Mal habe ich versucht, einen Breakout-Methodenalgorithmus bei Quantx Factory zu erstellen, der von Smart Trade Co., Ltd. bereitgestellt wird.
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.
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.
In einem starken Markt können Sie unverzüglich Gewinne erzielen. (Stark gegen Trends)
Wenn Sie nicht brechen, weil Sie eine Position in der hohen Preisspanne einnehmen (Täuschung), ist die Verlustkürzung tendenziell groß.
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.)
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.
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
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
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)
・ 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
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