Qu'est-ce que Smart Trade? Le nom du service de plate-forme de développement d'algorithmes d'investissement en actions fourni par Smart Trade Co., Ltd. ~~ Actuellement, la version bêta, mais la version officielle sera bientôt publiée ~~ (Ajouté le 25/11/2017: Version officielle publiée le 20/11/2017, le nom du service est également "QuantX")
Les algorithmes de trading peuvent être écrits en utilisant Python et le backtesting peut être effectué facilement.
Les éléments suivants peuvent utiliser le service HP https://smarttrade.co.jp
Créez un algorithme en vous référant au post Qiita ci-dessous HP dispose également d'un exemple d'algorithme, vous pouvez donc vous y référer également. Nous attendons la mise en valeur du tutoriel
Essayez de développer un algorithme d'investissement avec Python 1 http://qiita.com/hiroshimoda/items/e89444729fe7d25c0275
Building Algorithmic Strategies on SmartTrade http://qiita.com/vinyip918/items/8623c5e902b113becd38
Ci-dessous un tutoriel simple https://beta.smarttrade.co.jp/handbook/ja/
Les algorithmes sur Smart Trade sont à peu près divisés en trois. Chacun a les fonctions suivantes
Lors de l'initialisation, définissez le marché (action japonaise, action chinoise) à utiliser dans l'algorithme, l'action à échanger et le prix à utiliser (cours de clôture, cours élevé, etc.)
initialize.py
def initialize(ctx):
ctx.configure(
target="jp.stock.daily",
channels={#Canal utilisé
"jp.stock": {"symbols": ["jp.stock.7203"],
"columns": [ "high_price_adj",
"low_price_adj","close_price",
"close_price_adj","volume_adj",]
}})
Décrivez l'algorithme qui génère un signal d'achat / vente dans la section de définition du signal. Cette fois, en utilisant MACD, l'histogramme MACD est ・ Convertir de moins en plus: acheter ・ Conversion de plus en moins: Vendre Créer un algorithme simple
algorism.py
def _TALIB_CALL(data):
#Définissez la valeur à utiliser
hp = data["high_price_adj"].fillna(method="ffill")
lp = data["low_price_adj"].fillna(method="ffill")
cp = data["close_price_adj"].fillna(method="ffill")
#Définir des variables
result_macd = {}
result_macdsignal = {}
result_macdhist = {}
result = pd.DataFrame(data=0,columns=cp.columns, index=cp.index)
for (sym,val) in cp.items():#MACD pour chaque marque,Signal MACD,Calculer l'histogramme MACD
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)
#Jugement croisé
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]
#Définir les signaux d'achat et de vente
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,
}
#Enregistrement du signal
ctx.regist_signal("TALIB_CALL", _TALIB_CALL)
Dans la section achat et vente, décrivez la quantité à acheter et à vendre, la rentabilité et les critères de réduction des pertes en fonction de l'algorithme décrit dans la définition du signal.
handle_signals.py
def handle_signals(ctx, date, current):
#Traitement lorsqu'un signal d'achat est émis
buy = current["buy:sig"].dropna()
for (sym, val) in buy.items():
sec = ctx.getSecurity(sym)
sec.order(sec.unit()*1, comment="Acheter signal(%f)" % val)
pass
#Traitement lorsqu'un signal de vente est émis
sell = current["sell:sig"].dropna()
for (sym, val) in sell.items():
sec = ctx.getSecurity(sym)
sec.order_target_percent(0, comment="Vente de signal(%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)
#Réglage
ctx.configure(
target="jp.stock.daily",
channels={ #Canal utilisé
"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", #le dernier prix
"close_price_adj", #le dernier prix(Après ajustement pour le fractionnement d'actions)
"volume_adj", #Le volume
]
}
}
)
# 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,
}
#Enregistrement du signal
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="Acheter signal(%f)" % val)
pass
sell = current["sell:sig"].dropna()
for (sym, val) in sell.items():
sec = ctx.getSecurity(sym)
sec.order_target_percent(0, comment="Vente de signal(%f)" % val)
pass
pass
La sortie suivante apparaît pour le résultat global
Il est possible de vérifier visuellement les résultats de négociation pour des actions individuelles. Le cercle rouge est le signal d'achat, le cercle bleu est le signal de vente
Lorsque l'histogramme MACD seul est émis, la sortie sera la suivante.
En le superposant sur le graphique des prix de l'action, vous pouvez confirmer que vous pouvez acheter et vendre correctement au point où l'histogramme MACD croise 0. Cependant, certaines pièces ne sont ni achetées ni vendues même si elles dépassent 0, et on peut en déduire qu'elles n'ont pas pu être achetées ou vendues en raison du solde avec la position globale à ce moment-là, mais une confirmation est requise.
Je souhaite apprendre la méthode d'analyse des données en séries chronologiques et créer un algorithme capable de capturer ce que l'on appelle le «double fond» et la «divergence baissière et haussière».
Recommended Posts