평가판 QuantX

19400 단어 Python3PythonQuantx

개시하다


나는 이과 대학생으로 평소에 기계공학을 전공한다.
나는 단지 조금 독학했을 뿐, 기본적으로 금융 지식이 없다.
이번 SmartTrade 실습, QuantXhttps://quantx.io/)
에서 알고리즘 개발을 진행했다.

QuantX 사용


의 목적


QuantX로 알고리즘 개발을 진행하다.

생성할 알고리즘


복잡한 거래를 하지 말고 큰 상승세의 최초 구매, 큰 하락세의 최초 베스트셀러 알고리즘을 사용하라.
따라서 아래 그림과 같이 단기선이 장기선을 초과할 때 구매할 수 있다.(반대로)

실제로 해 보다


이번엔 이 기사https://qiita.com/katakyo/items/d786599f6638d53a8602)
참고로 하다.
제작된 알고리즘은 다음과 같다.
[추기]
이번에는 위 그림과 같은 황금 십자가를 만들고 싶었지만, 이후 검증된 결과의 알고리즘이 평균 배리율의 것이 됐다.
따라서 아래의 알고리즘은 상술한 그림과 같은 것이 아니라 평균 배리율이다.
try.py
import talib as ta 
import pandas as pd 
import numpy as np 

  #関数の初期化
def initialize(ctx):#初期関数の定義
  #設定
    ctx.logger.debug("initialize() called")#プログラムのログ出力を行う
    ctx.configure(#トレードの基本設定
      target="jp.stock.daily",#日本株を使う
      channels={          #銘柄選択 #データを実際に入れる
        "jp.stock": {
          "symbols": [
            "jp.stock.7201", #日産自動車
            "jp.stock.2914", #日本たばこ産業
            "jp.stock.8766", #東京海上ホールディングス
            "jp.stock.8031", #三井物産
            "jp.stock.8316", #三井住友フィナンシャルグループ
            "jp.stock.8411", #みずほフィナンシャルグループ
            # "jp.stock.9427", #NTTドコモ
            "jp.stock.4502", #武田薬品工業
            "jp.stock.8058", #三菱商事
            "jp.stock.9433", #KDDI
            "jp.stock.9432", #日本電信電話
            "jp.stock.7267", #本田技研工業
            "jp.stock.6902", #デンソー
            "jp.stock.4503", #アステラス製薬
            "jp.stock.4063", #信越化学工業
            "jp.stock.7974", #任天堂
            "jp.stock.6981", #村田製作所
            "jp.stock.3382", #セブン&アイ・ホールディングス
            "jp.stock.9020", #東日本旅客鉄道
            "jp.stock.8802", #三菱地所
            "jp.stock.9022", #東海旅客鉄道
            "jp.stock.9984", #ソフトバンクグループ
            "jp.stock.6861", #キーエンス
            "jp.stock.6501", #日立製作所
            "jp.stock.6752", #パナソニック
            "jp.stock.6758", #ソニー
            "jp.stock.6954", #ファナック
            "jp.stock.7203", #トヨタ自動車
            "jp.stock.7751", #キヤノン
          ],
          "columns": [#columnsの中に終値などの必要なデータを入れる
            "open_price_adj",     # 始値(株式分割調整後)
            "high_price_adj",     # 高値(株式分割調整後)
            "low_price_adj",      # 安値(株式分割調整後)
            "close_price",        # 終値
            "close_price_adj",    # 終値(株式分割調整後) 
          ] 
        }
      }
    )

    #シグナル定義
    def _my_signal(data): #売買シグナルの定義


      #fillna(method='ffill')を使うと欠損値(NaN)を自動的に保管してくれる
      cp = data["close_price_adj"].fillna(method="ffill")
      ctx.logger.debug(cp)

      #単純移動平均線(SMA)の設定
      #データの入れ物を用意
      s_sma = pd.DataFrame(data=0,columns=[], index=cp.index)#短期の単純移動曲線
      l_sma = pd.DataFrame(data=0,columns=[], index=cp.index)
      #TA-Libによる計算
      for (sym,val) in cp.items():
        s_sma[sym] = ta.SMA(cp[sym].values.astype(np.double), timeperiod=5)
        l_sma[sym] = ta.SMA(cp[sym].values.astype(np.double), timeperiod=75)
      #SMAの売買シグナルの定義
      #短期線と長期線の比率を出したもの
      s_sma_ratio = s_sma/l_sma
      df_sma_buy_sig = (s_sma_ratio > 1.02) & (s_sma_ratio < 1.04) 
      df_sma_sell_sig = (s_sma_ratio < 0.96)  
      ctx.logger.debug(cp)
      #売買シグナルの設定
      buy_sig = df_sma_buy_sig 
      sell_sig = df_sma_sell_sig 
      buy_sig = df_sma_buy_sig 
      sell_sig = df_sma_sell_sig 
      #return内にシグナル定義部分で定義した変数を入れて可視化できるようにする
      return {
        "s_sma": s_sma,
        "l_sma": l_sma,
        "buy:sig":buy_sig,
        "sell:sig":sell_sig, 
        }

     # シグナル登録 登録するとシグナルが生成される
    ctx.regist_signal("my_signal", _my_signal)

#取引数量の設定
def handle_signals(ctx, date, current):
    df = current.copy()

    # 買いシグナル
    df_long = df[df["buy:sig"]]
    if not df_long.empty:
      for (sym, val) in df_long.iterrows(): 
        sec = ctx.getSecurity(sym)
        sec.order_target_percent(0.07, comment= "買いシグナル")

    # 売りシグナル
    df_sell = df[df["sell:sig"]]
    if not df_sell.empty:
      for (sym, val) in df_sell.iterrows(): 
        sec = ctx.getSecurity(sym)
        sec.order_target_percent(0, comment= "売りシグナル")

    done_syms = set([])
    for (sym,val) in ctx.portfolio.positions.items():
      returns = val["returns"]
      if returns < -0.15:
        sec = ctx.getSecurity(sym)
        sec.order(-val["amount"], comment="損切り(%f)" % returns)
        done_syms.add(sym)
      elif returns > 0.30:
        sec = ctx.getSecurity(sym)
        sec.order(-val["amount"], comment="利益確定売(%f)" % returns)
        done_syms.add(sym)
단기선과 장기선의 위치로 매매하고 싶어 장기선/단기선 1.02~1.04에서 사고 0.96 이하에서 판다.

결실



이번에는 단순 이동 평균선만 사용했지만 더 높은 정밀도를 가진 제품을 만들기 위해서는 다른 지표를 조합할 필요가 있다고 생각한다.다음에는 또 다른 것을 조합해 보고 싶다.

참고 자료


QuantX( https://quantx.io/ )
이동평균선에서 이 1~3종의 이동평균선을 그려보세요~#QuantXhttps://qiita.com/katakyo/items/d786599f6638d53a8602)
소차랑 강사(2018)'이동평균선 궁극독법·사용법'일본실업출판사

학습회


SmartTrade사는 매주 수요일 18:00에 학습회를 개최한다.( https://python-algo.connpass.com/)

좋은 웹페이지 즐겨찾기