Versuchen Sie, das HL-Band der Reihe nach zu verwenden

Einführung

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.

HL-Band-Algorithmus

Signal

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.

Code

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

Codekommentar

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

Rückentestergebnis

hlband2.PNG

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.

Impressionen

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.

Vorsichtsmaßnahmen zum Haftungsausschluss

Bitte beachten Sie, dass wir keinen Schaden garantieren können, der durch den tatsächlichen Handel mit diesem Code verursacht wurde.

Recommended Posts

Versuchen Sie, das HL-Band der Reihe nach zu verwenden
Versuchen Sie es mit der Wunderlist-API in Python
Versuchen Sie, die Kraken-API mit Python zu verwenden
Versuchen Sie es mit der BitFlyer Ligntning API in Python
Versuchen Sie, die DropBox Core-API mit Python zu verwenden
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit der PeeringDB 2.0-API
Versuchen Sie es mit Spyder, das in Anaconda enthalten ist
Versuchen Sie es mit LevelDB mit Python (plyvel)
Versuchen Sie es mit dem Python Cmd-Modul
Probieren Sie Cython in kürzester Zeit aus
Versuchen Sie es mit LeapMotion mit Python
Versuchen Sie vorerst, FireBase Cloud Firestore mit Python zu verwenden
Versuchen Sie es mit dem Webanwendungsframework Flask
Versuchen Sie es mit dem $ 6 Rabatt LiDAR (Camsense X1)
Versuchen Sie, die Kamera mit Pythons OpenCV zu verwenden
Tweet mit der Twitter-API in Python
Versuchen Sie die Clusteranalyse mit K-Mitteln
Probieren Sie die neue Scheduler-Verkettung in PyTorch 1.4 aus
Versuchen Sie, die Spotify-API in Django zu aktivieren.
Versuchen Sie es mit Tkinter
Versuchen Sie es mit Docker-Py
Versuchen Sie, Blueprint with Flask zu verwenden, um Controller zu trennen
Versuchen Sie es mit einem Ausstecher
Versuchen Sie es mit PDFMiner
Python: Versuchen Sie, die Benutzeroberfläche von Pythonista 3 auf dem iPad zu verwenden
Versuchen Sie es mit Jieba, einer chinesischen morphologischen Analyse-Engine
Versuchen Sie es mit Geopandas
Versuchen Sie es mit Selen
Versuchen Sie es mit scipy
Versuchen Sie es mit dem Python-Webframework Tornado Part 1
Versuchen Sie es vorerst mit LINE Notify
Versuchen Sie, ein Konturdiagramm mit matplotlib mit OpenFOAM zu zeichnen
Versuchen Sie es mit pandas.DataFrame
Verarbeiten Sie den Index in Python mit dem ScriptUpdateProcessor von Solr vor
Versuchen Sie es mit dem Sammlungsmodul (ChainMap) von python3
Versuchen Sie es mit Django-Swiftbrowser
Versuchen Sie es mit matplotlib
Versuchen Sie es mit dem Python-Webframework Tornado Part 2
Versuchen Sie es mit tf.metrics
Versuchen Sie, die Monte-Carlo-Methode in Python zu implementieren
Versuchen Sie es mit PyODE
Versuchen Sie es mit einer objektorientierten Klasse in R (R6-Methode)
Versuchen Sie, die ChatWork-API und die Qiita-API in Python zu verwenden
Abrufen des Dateinamens in einem Ordner mithilfe von glob
[AWS IoT] Registrieren Sie Dinge in AWS IoT mithilfe des AWS IoT Python SDK
Grundeinstellungen bei Verwendung der foursquare-API mit Python
Bestimmen Sie den Schwellenwert mithilfe der P-Tile-Methode in Python
Versuchen Sie es mit dem Temperatursensor (LM75B) mit Raspeye.
Versuchen Sie, das Bild in einen separaten Thread zu laden (OpenCV-Python).
Über die übersichtliche Anordnung in der Importreihenfolge von Flake8
Versuchen Sie, Tweets mithilfe der Twitter-API in großen Mengen zu löschen
Versuchen Sie die Gesichtserkennung in Echtzeit mit einer Webkamera
Versuchen Sie, die in Firefox gespeicherten Anmeldedaten zu entschlüsseln
Verwenden Sie die Such-API der National Parliament Library in Python
[Python] So geben Sie Listenwerte der Reihe nach aus