Dieses Mal habe ich einen Algorithmus mit dem HL-Band (HighLow) erstellt. Weitere Informationen zum HL-Band finden Sie im folgenden Artikel.
Lesen und Verwenden von HL-Bändern [Technische Indikatoren / Trends]
Kurz gesagt, im HL-Band die Linie, die den Maximalwert des hohen Preises für einen bestimmten Zeitraum verbindet (hohes Band), die Linie, die den minimalen Wert des niedrigen Preises verbindet (niedriges Band), und die durchschnittliche Linie der beiden Linien (mittleres Band) Ich benutze es.
Kommen wir nun zum Hauptthema.
Kaufsignal: Wenn der Schlusskurs (cp) das mittlere Band durchbricht Verkaufssignal: Wenn der Schlusskurs (cp) unter das mittlere Band fällt oder wenn der Schlusskurs das hohe Band durchbricht
Ich habe auf hier verwiesen, um das Signal zu bestimmen.
Der Code für diese Zeit lautet hier.
#HL-Band
import maron
import maron.signalfunc as sf
import maron.execfunc as ef
import pandas as pd
import talib as ta
import numpy as np
#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
def initialize(ctx):
#Aufbau
ctx.logger.debug("initialize() called")
ctx.configure(
channels={ #Kanal verwendet
"jp.stock": {
"symbols": [
"jp.stock.2914",
"jp.stock.3382",
"jp.stock.4063",
"jp.stock.4452",
"jp.stock.4502",
"jp.stock.4503",
"jp.stock.4568",
"jp.stock.6094",
"jp.stock.6501",
"jp.stock.6758",
"jp.stock.6861",
"jp.stock.6954",
"jp.stock.6981",
"jp.stock.7203",
"jp.stock.7267",
"jp.stock.7751",
"jp.stock.7974",
"jp.stock.8031",
"jp.stock.8058",
"jp.stock.8306",
"jp.stock.8316",
"jp.stock.8411",
"jp.stock.8766",
"jp.stock.8802",
"jp.stock.9020",
"jp.stock.9022",
"jp.stock.9432",
"jp.stock.9433",
"jp.stock.9437",
"jp.stock.9984",
],
"columns": [
"close_price", #Schlusskurs
"close_price_adj", #Schlusskurs(Nach Bereinigung um Aktiensplit)
"high_price_adj", #Hoher Preis(Nach Bereinigung um Aktiensplit)
"low_price_adj", #Niedriger Preis(Nach Bereinigung um Aktiensplit)
"volume_adj", #Volumen
"txn_volume", #Handelspreis
]
}
}
)
#Signaldefinition
def _my_signal(data):
cp = data["close_price_adj"].fillna(method='ffill') #Schlusskurs erhalten
hp = data["high_price_adj"].fillna(method='ffill') #Werde hoch
lp = data["low_price_adj"].fillna(method='ffill') #Holen Sie sich niedrigen Preis
hband = hp.rolling(20).max() #Hohe Bandeinstellung
lband = lp.rolling(20).min() #Niedrige Bandeinstellung
mband = (hband - lband)/2 + lband #Mittelbandeinstellung
market_sig = pd.DataFrame(data=0.0, columns=cp.columns, index=cp.index)
buy_sig = ((mband.shift(1) > cp.shift(1)) & (mband < cp))
sell_sig = ((mband > cp) | (cp > hband))
# 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 {
# "hband:g2": hband,
# "lband:g2": lband,
# "mband:g2": mband,
"hband": hband,
"lband": lband,
"mband": mband,
"market:sig": market_sig,
}
#Signalregistrierung
ctx.regist_signal("my_signal", _my_signal)
def handle_signals(ctx, date, current):
'''
current: pd.DataFrame
'''
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.02:
sec = ctx.getSecurity(sym)
sec.order(-val["amount"], comment="Verlustschnitt(%f)" % returns)
done_syms.add(sym)
elif returns > 0.04:
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, 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, orderType=ot, comment="SIGNAL SELL")
#ctx.logger.debug("SELL: %s, %f" % (sec.code(), val))
pass
Eine Erläuterung des Basiscodes finden Sie unter hier, da sich das für die Lernsitzung erstellte Material unter dem folgenden Link befindet.
Ich werde diesmal die wichtigen Punkte erklären.
** Zeilen 69-71 **
hband = hp.rolling(20).max() #Hohe Bandeinstellung
lband = lp.rolling(20).min() #Niedrige Bandeinstellung
mband = (hband - lband)/2 + lband #Mittelbandeinstellung
Hier wird jedes Band eingestellt. Hband ist der Maximalwert des hohen Preises (cp) in den letzten 20 Tagen, lband ist der Minimalwert des niedrigen Preises (lp) in den letzten 20 Tagen und mband ist der Durchschnitt von hband und lband. Masu.
Weitere Informationen zum Rollen hier
** Zeilen 74-75 **
buy_sig = ((mband.shift(1) > cp.shift(1)) & (mband < cp))
sell_sig = ((mband > cp) | (cp > hband))
Kaufsignal: Wenn der Schlusskurs (cp) mband durchbricht Verkaufssignal: Wenn der Schlusskurs (cp) unter mband fällt oder wenn der Schlusskurs hband durchbricht
Die Gewinn / Verlust-Quote beträgt 17% in 3 Jahren.
Es ist nicht sehr profitabel.
Betrachtet man die Werte von MaxDrawdown, SharpRatio und α, so scheint es erheblichen Verbesserungsbedarf zu geben.
Im Allgemeinen wird das HL-Band häufig bei der Breakout-Methode verwendet und verlangsamt sich, es sei denn, es handelt sich um einen großen Markt (ein Markt, auf dem der gesamte Aktienmarkt im Vergleich zum Normalen boomt und ansteigt und das Handelsvolumen ebenfalls stark erweitert wird). Die Ergebnisse zeigen auch, dass die Verwendung des HL-Bandes nicht in allen Situationen einen sehr guten Algorithmus liefert, wie dies häufig der Fall ist.
Bitte beachten Sie, dass wir keinen Schaden garantieren können, der durch den tatsächlichen Handel mit diesem Code verursacht wurde.
Recommended Posts