Essayez d'utiliser la bande HL dans l'ordre

introduction

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.

Algorithme de bande HL

signal

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.

code

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

Commentaire de code

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

Résultat du test de retour

hlband2.PNG

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.

Impressions

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.

Clause de non-responsabilité Précautions

Veuillez noter que nous ne pouvons garantir aucun dommage causé par le trading réel utilisant ce code.

Recommended Posts

Essayez d'utiliser la bande HL dans l'ordre
Essayez d'utiliser l'API Wunderlist en Python
Essayez d'utiliser l'API Kraken avec Python
Essayez d'utiliser l'API BitFlyer Ligntning en Python
Essayez d'utiliser l'API DropBox Core avec Python
Essayez d'utiliser l'API Twitter
Essayez d'utiliser l'API Twitter
Essayez d'utiliser l'API PeeringDB 2.0
Essayez d'utiliser Spyder inclus dans Anaconda
Essayez d'utiliser LevelDB avec Python (plyvel)
Essayez d'utiliser le module Python Cmd
Essayez Cython dans les plus brefs délais
Essayez d'utiliser LeapMotion avec Python
Essayez d'utiliser FireBase Cloud Firestore avec Python pour le moment
Essayez d'utiliser le framework d'application Web Flask
Essayez d'utiliser le LiDAR de 6 $ de réduction (Camsense X1)
Essayez d'utiliser l'appareil photo avec OpenCV de Python
Tweet à l'aide de l'API Twitter en Python
Essayez l'analyse de cluster par K-means
Essayez le nouveau chaînage du planificateur dans PyTorch 1.4
Essayez d'accéder à l'API Spotify dans Django.
Essayez d'utiliser Tkinter
Essayez d'utiliser docker-py
Essayez d'utiliser Blueprint avec Flask pour séparer les contrôleurs
Essayez d'utiliser Cookiecutter
Essayez d'utiliser PDFMiner
Python: essayez d'utiliser l'interface utilisateur sur Pythonista 3 sur iPad
Essayez d'utiliser jieba, un moteur d'analyse morphologique chinois
Essayez d'utiliser des géopandas
Essayez d'utiliser Selenium
Essayez d'utiliser scipy
Essayez d'utiliser le framework Web Python Tornado Partie 1
Essayez d'utiliser LINE Notify pour le moment
Essayez de dessiner un diagramme de contour en utilisant matplotlib avec OpenFOAM
Essayez d'utiliser pandas.DataFrame
Pré-traiter l'index en Python à l'aide de ScriptUpdateProcessor de Solr
Essayez d'utiliser le module de collections (ChainMap) de python3
Essayez d'utiliser django-swiftbrowser
Essayez d'utiliser matplotlib
Essayez d'utiliser le framework Web Python Tornado Partie 2
Essayez d'utiliser tf.metrics
Essayez d'implémenter la méthode Monte Carlo en Python
Essayez d'utiliser PyODE
Essayez d'utiliser une classe orientée objet dans R (méthode R6)
Essayez d'utiliser l'API ChatWork et l'API Qiita en Python
Obtenir le nom de fichier dans un dossier à l'aide de glob
[AWS IoT] Enregistrer des éléments dans AWS IoT à l'aide du SDK AWS IoT Python
Paramètres initiaux lors de l'utilisation de l'API foursquare avec python
Déterminer le seuil à l'aide de la méthode P-tile en python
Essayez d'utiliser le capteur de température (LM75B) avec Raspeye.
Essayez de charger l'image dans un thread séparé (OpenCV-Python)
À propos de l'ordre épuré dans l'ordre d'importation flake8
Essayez de supprimer des tweets en masse à l'aide de l'API de Twitter
Essayez la détection des visages en temps réel à l'aide d'une webcam
Essayez de déchiffrer les données de connexion stockées dans Firefox
Utiliser l'API de recherche de la Bibliothèque du Parlement national en Python
[Python] Comment afficher les valeurs de liste dans l'ordre
Utilisation de l'application LibreOffice en Python (1) Où sont les macros?