Cette fois, j'ai fait un algorithme utilisant la bande HL (HighLow). Pour plus de détails sur la bande HL, veuillez vous référer à l'article suivant.
Comment lire et utiliser les bandes HL [Indicateurs techniques / tendances]
En bref, dans la bande HL, la ligne reliant la valeur maximale du prix haut pendant une certaine période (bande haute), la ligne reliant la valeur minimale du prix bas (bande basse), et la ligne moyenne des deux lignes (bande médiane) Je l'utilise.
Passons maintenant au sujet principal.
Signal d'achat: lorsque le cours de clôture (cp) franchit la bande médiane Signal de vente: lorsque le cours de clôture (cp) tombe en dessous de la bande médiane ou lorsque le cours de clôture franchit la bande haute
Je me suis référé à ici pour déterminer le signal.
Le code pour cette fois est ici
#Bande HL
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 #Ordre au moment du cours de clôture le lendemain de l'émission du signal
ot = maron.OrderType.MARKET_OPEN #Commande au moment du cours d'ouverture le lendemain de l'émission du signal
#ot = maron.OrderType.LIMIT #Limiter l'ordre
def initialize(ctx):
#Réglage
ctx.logger.debug("initialize() called")
ctx.configure(
channels={ #Canal utilisé
"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", #le dernier prix
"close_price_adj", #le dernier prix(Après ajustement pour le fractionnement d'actions)
"high_price_adj", #Prix élevé(Après ajustement pour le fractionnement d'actions)
"low_price_adj", #Bas prix(Après ajustement pour le fractionnement d'actions)
"volume_adj", #Le volume
"txn_volume", #Prix de négociation
]
}
}
)
#Définition du signal
def _my_signal(data):
cp = data["close_price_adj"].fillna(method='ffill') #Obtenez le prix de clôture
hp = data["high_price_adj"].fillna(method='ffill') #Prendre de la hauteur
lp = data["low_price_adj"].fillna(method='ffill') #Obtenez un prix bas
hband = hp.rolling(20).max() #Réglage de la bande haute
lband = lp.rolling(20).min() #Réglage de la bande basse
mband = (hband - lband)/2 + lband #Réglage de la bande médiane
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 quand sig est vrai.0、sell_Quand sig est vrai-1.Mettre à 0
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,
}
#Enregistrement du signal
ctx.regist_signal("my_signal", _my_signal)
def handle_signals(ctx, date, current):
'''
current: pd.DataFrame
'''
market_sig = current["market:sig"]
done_syms = set([])
#Réduction des pertes, établissement des bénéfices
for (sym, val) in ctx.portfolio.positions.items():
returns = val["returns"]
if returns < -0.02:
sec = ctx.getSecurity(sym)
sec.order(-val["amount"], comment="Coupe de perte(%f)" % returns)
done_syms.add(sym)
elif returns > 0.04:
sec = ctx.getSecurity(sym)
sec.order(-val["amount"], comment="Vente à but lucratif(%f)" % returns)
done_syms.add(sym)
#Acheter signal
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 de vente
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
Pour l'explication du code de base, veuillez consulter ici car le matériel créé pour la session d'étude se trouve sur le lien ci-dessous.
J'expliquerai les points importants cette fois.
** Lignes 69-71 **
hband = hp.rolling(20).max() #Réglage de la bande haute
lband = lp.rolling(20).min() #Réglage de la bande basse
mband = (hband - lband)/2 + lband #Réglage de la bande médiane
Ici, chaque bande est définie. Hband est la valeur maximale du prix élevé (cp) au cours des 20 derniers jours, lband est la valeur minimale du prix bas (lp) au cours des 20 derniers jours et mband est la moyenne de hband et lband. Masu.
Pour plus d'informations sur le roulement, cliquez ici [https://pandas.pydata.org/pandas-docs/version/0.25.3/reference/api/pandas.core.window.Rolling.min.html)
** Lignes 74-75 **
buy_sig = ((mband.shift(1) > cp.shift(1)) & (mband < cp))
sell_sig = ((mband > cp) | (cp > hband))
Signal d'achat: lorsque le cours de clôture (cp) franchit mband Signal de vente: lorsque le cours de clôture (cp) tombe en dessous de mband ou lorsque le cours de clôture passe par hband
Le ratio profits / pertes est de 17% en 3 ans ,,,,
Ce n'est pas très rentable.
En regardant les valeurs de MaxDrawdown, SharpRatio et α, il semble y avoir une marge d'amélioration considérable.
La bande HL est généralement utilisée dans la méthode de cassure, et elle ralentira à moins qu'il ne s'agisse d'un grand marché (un marché où l'ensemble du marché boursier est en plein essor et en plein essor par rapport à l'habitude, et le volume des transactions est également considérablement augmenté). Les résultats montrent également que l'utilisation de la bande HL ne fournit pas un très bon algorithme dans toutes les situations, comme c'est souvent le cas.
Veuillez noter que nous ne pouvons garantir aucun dommage causé par le trading réel utilisant ce code.
Recommended Posts