Was ist Smart Trade? Der Name des von Smart Trade Co., Ltd. bereitgestellten Entwicklungsplattformdienstes für Aktieninvestitionsalgorithmen. ~~ Derzeit die Beta-Version, aber die offizielle Version wird bald veröffentlicht ~~ (Hinzugefügt am 25.11.2017: Offizielle Version veröffentlicht am 20.11.2017, Dienstname ist auch "QuantX")
Handelsalgorithmen können mit Python geschrieben werden, und Backtesting kann einfach durchgeführt werden.
Im Folgenden können Sie den Dienst von HP verwenden https://smarttrade.co.jp
Erstellen Sie einen Algorithmus, indem Sie auf den folgenden Qiita-Beitrag verweisen HP hat auch einen Beispielalgorithmus, auf den Sie auch verweisen können. Wir warten auf die Erweiterung des Tutorials
Versuchen Sie, mit Python 1 einen Investitionsalgorithmus zu entwickeln http://qiita.com/hiroshimoda/items/e89444729fe7d25c0275
Building Algorithmic Strategies on SmartTrade http://qiita.com/vinyip918/items/8623c5e902b113becd38
Unten finden Sie ein einfaches Tutorial https://beta.smarttrade.co.jp/handbook/ja/
Die Algorithmen für Smart Trade sind grob in drei Bereiche unterteilt. Jeder hat die folgenden Funktionen
Legen Sie bei der Initialisierung den Markt (japanische Aktie, chinesische Aktie) fest, der im Algorithmus verwendet werden soll, die zu handelnde Aktie und den zu verwendenden Preis (Schlusskurs, hoher Preis usw.).
initialize.py
def initialize(ctx):
ctx.configure(
target="jp.stock.daily",
channels={#Kanal verwendet
"jp.stock": {"symbols": ["jp.stock.7203"],
"columns": [ "high_price_adj",
"low_price_adj","close_price",
"close_price_adj","volume_adj",]
}})
Beschreiben Sie den Algorithmus, der ein Kauf- / Verkaufssignal ausgibt, im Abschnitt zur Signaldefinition. Dieses Mal lautet das MACD-Histogramm unter Verwendung von MACD ・ Konvertieren Sie von Minus nach Plus: Kaufen ・ Umrechnung von Plus nach Minus: Verkaufen Erstellen Sie einen einfachen Algorithmus
algorism.py
def _TALIB_CALL(data):
#Definieren Sie den zu verwendenden Wert
hp = data["high_price_adj"].fillna(method="ffill")
lp = data["low_price_adj"].fillna(method="ffill")
cp = data["close_price_adj"].fillna(method="ffill")
#Variablen definieren
result_macd = {}
result_macdsignal = {}
result_macdhist = {}
result = pd.DataFrame(data=0,columns=cp.columns, index=cp.index)
for (sym,val) in cp.items():#MACD für jede Marke,MACD-Signal,Berechnen Sie das MACD-Histogramm
result_macd[sym], result_macdsignal[sym], result_macdhist[sym] = ta.MACD(cp[sym].values.astype(np.double),
fastperiod=12, slowperiod=26, signalperiod=9)
macd = pd.DataFrame(data=result_macd,columns=cp.columns, index=cp.index)
macdsignal = pd.DataFrame(data=result_macdsignal,columns=cp.columns, index=cp.index)
macdhist = pd.DataFrame(data=result_macdhist,columns=cp.columns, index=cp.index)
#Kreuzendes Urteil
test = np.sign( macdhist[sym].values[1:]) - np.sign(macdhist[sym].values[:-1])
n = len(test)
for i, row in enumerate(test):
result[sym][i+1] = 0 if isNaN(test[i]) else test[i]
#Definieren Sie Kauf- und Verkaufssignale
buy_sig = result[result >= 2]
sell_sig = result[result <= -2]
return {
"macd": macd,
"macdsignal": macdsignal,
"macdhist": macdhist,
"buy:sig": buy_sig,
"sell:sig": sell_sig,
}
#Signalregistrierung
ctx.regist_signal("TALIB_CALL", _TALIB_CALL)
Beschreiben Sie im Abschnitt "Kaufen und Verkaufen" die Kriterien für Kauf- und Verkaufsmenge, Rentabilität und Verlustreduzierung basierend auf dem in der Signaldefinition beschriebenen Algorithmus.
handle_signals.py
def handle_signals(ctx, date, current):
#Verarbeitung, wenn ein Kaufsignal ausgegeben wird
buy = current["buy:sig"].dropna()
for (sym, val) in buy.items():
sec = ctx.getSecurity(sym)
sec.order(sec.unit()*1, comment="Signal kaufen(%f)" % val)
pass
#Verarbeitung, wenn ein Verkaufssignal ausgegeben wird
sell = current["sell:sig"].dropna()
for (sym, val) in sell.items():
sec = ctx.getSecurity(sym)
sec.order_target_percent(0, comment="Signalverkauf(%f)" % val)
pass
pass
MACD.py
import pandas as pd
import talib as ta
import numpy as np
def isNaN(num):
return num != num
def initialize(ctx):
#pp.pprint(vars(ctx))
# print(ctx.positions)
#Aufbau
ctx.configure(
target="jp.stock.daily",
channels={ #Kanal verwendet
"jp.stock": {
"symbols": [
"jp.stock.7203", "jp.stock.7267",
"jp.stock.7270", "jp.stock.7269",
"jp.stock.7259", "jp.stock.7202",
"jp.stock.7203", "jp.stock.7205",
"jp.stock.7208", "jp.stock.7211",
"jp.stock.7211", "jp.stock.7276",
"jp.stock.7272", "jp.stock.7240",
"jp.stock.3116", "jp.stock.7282",
"jp.stock.7248", "jp.stock.7313",
"jp.stock.6995", "jp.stock.7222",
"jp.stock.7278", "jp.stock.7242",
"jp.stock.7287", "jp.stock.7251",
"jp.stock.7230", "jp.stock.5949",
"jp.stock.7296", "jp.stock.7279",
"jp.stock.7250", "jp.stock.5970",
"jp.stock.7220",
],
"columns": [ "high_price_adj", "low_price_adj","close_price", #Schlusskurs
"close_price_adj", #Schlusskurs(Nach Bereinigung um Aktiensplit)
"volume_adj", #Volumen
]
}
}
)
# talib sample...
def _TALIB_CALL(data):
hp = data["high_price_adj"].fillna(method="ffill")
lp = data["low_price_adj"].fillna(method="ffill")
cp = data["close_price_adj"].fillna(method="ffill")
result_macd = {}
result_macdsignal = {}
result_macdhist = {}
result = pd.DataFrame(data=0,columns=cp.columns, index=cp.index)
for (sym,val) in cp.items():
result_macd[sym], result_macdsignal[sym], result_macdhist[sym] = ta.MACD(cp[sym].values.astype(np.double),
fastperiod=12, slowperiod=26, signalperiod=9)
macd = pd.DataFrame(data=result_macd,columns=cp.columns, index=cp.index)
macdsignal = pd.DataFrame(data=result_macdsignal,columns=cp.columns, index=cp.index)
macdhist = pd.DataFrame(data=result_macdhist,columns=cp.columns, index=cp.index)
test = np.sign( macdhist[sym].values[1:]) - np.sign(macdhist[sym].values[:-1])
n = len(test)
for i, row in enumerate(test):
result[sym][i+1] = 0 if isNaN(test[i]) else test[i]
buy_sig = result[result >= 2]
sell_sig = result[result <= -2]
return {
"macd": macd,
"macdsignal": macdsignal,
"macdhist": macdhist,
"buy:sig": buy_sig,
"sell:sig": sell_sig,
}
#Signalregistrierung
ctx.regist_signal("TALIB_CALL", _TALIB_CALL)
def handle_signals(ctx, date, current):
buy = current["buy:sig"].dropna()
for (sym, val) in buy.items():
sec = ctx.getSecurity(sym)
sec.order(sec.unit()*1, comment="Signal kaufen(%f)" % val)
pass
sell = current["sell:sig"].dropna()
for (sym, val) in sell.items():
sec = ctx.getSecurity(sym)
sec.order_target_percent(0, comment="Signalverkauf(%f)" % val)
pass
pass
Die folgende Ausgabe wird für das Gesamtergebnis angezeigt
Es ist möglich, die Handelsergebnisse für einzelne Aktien visuell zu überprüfen. Roter Kreis ist Kaufsignal, blauer Kreis ist Verkaufssignal
Wenn nur das MACD-Histogramm ausgegeben wird, lautet die Ausgabe wie folgt.
Indem Sie es dem Aktienkurschart überlagern, können Sie bestätigen, dass Sie an dem Punkt, an dem das MACD-Histogramm 0 schneidet, ordnungsgemäß kaufen und verkaufen können. Es gibt jedoch einige Teile, die nicht gekauft oder verkauft werden, selbst wenn sie 0 überschreiten, und es kann davon ausgegangen werden, dass sie aufgrund des Gleichgewichts mit der Gesamtposition zu diesem Zeitpunkt nicht gekauft oder verkauft werden konnten. Eine Bestätigung ist jedoch erforderlich
Ich möchte die Datenanalysemethode in Zeitreihen lernen und einen Algorithmus erstellen, der die sogenannte "Double Bottom" - und "Bearish and Bullish Divergenz" erfassen kann.
Recommended Posts