QuantX에서 bas를 사용한 시스템 거래

자기 소개


이번에 스마트트레이드에서 인턴으로 일한 제이입니다.
샤오제에 대해서 알고 싶은 사람이 여기 있어요.
블로그 꼭 읽어주세요.
첫 번째 문장이 여기 있다(QuantX를 처음 본다)
https://qiita.com/investor-gon/items/2b1952ae5c2c88334c74

뭘 만들지(목표 달성)


닛케이 평균 기여율 상위 10위 품목(2018년 12월 25일)을 사용하여 buzu를 사용한 알고리즘을 제작하였습니다!!!
일단 움직이면 돼.
바즈의 25일 이동평균선은 75일이 넘으면 사고 아래로 떨어지면 파는 알고리즘으로 매매한다.

우선 완성 코드(복사 붙여넣기,)

############################################################################
# 日経225 バズ cup

  #ライブラリーの設定
import pandas as pd
import talib as ta
import numpy as np

def initialize(ctx):
    # 設定
    ctx.logger.debug("initialize() called")
    ctx.configure(
      target="jp.stock.daily",
      channels={          # 利用チャンネル
        "jp.stock": {
          "symbols": [
            "jp.stock.9983", #ファーストリテイリング
            "jp.stock.9984", #ソフトバンク
            "jp.stock.6954", #ファナック
            "jp.stock.9433", #KDDI
            "jp.stock.8028", #ファミリーマート
            "jp.stock.8035", #東京エレクトロン
            "jp.stock.4543", #テルモ
            "jp.stock.6367", #ダイキン
            "jp.stock.6971", #京セラ
            "jp.stock.9735", #セコム
          ],
          "columns": [
            #"open_price_adj",    # 始値(株式分割調整後)
            #"high_price_adj",    # 高値(株式分割調整後)
            #"low_price_adj",     # 安値(株式分割調整後)
            #"close_price",        # 終値
            "close_price_adj",    # 終値(株式分割調整後) 
            #"volume_adj",         # 出来高
            #"txn_volume",         # 売買代金
            "ns_buzz"            # バズ(ニュース、ソーシャル)
                                  # 値の範囲:0 ~ 1
           ]
        }
      }
    )

    def _my_buzz(data):
        ns_buzz = data["ns_buzz"].fillna(method="ffill")

        ns_buzz_m75 = ns_buzz.rolling(window=75, center=False).mean()
        ns_buzz_m25 = ns_buzz.rolling(window=25, center=False).mean()
        #バズの25日と75日移動平均出してるよ

        buy_sig = ns_buzz_m75 > ns_buzz_m25
        sell_sig = ns_buzz_m75 < ns_buzz_m25

        return {
            "buy:sig": buy_sig,
            "sell:sig": sell_sig,
            "ns_buzz_m75": ns_buzz_m75,
            "ns_buzz_m25": ns_buzz_m25
        }

    # シグナル登録
    ctx.regist_signal("my_buzz", _my_buzz)

def handle_signals(ctx, date, current):

 # 買いシグナル
    buy = current["buy:sig"].dropna()
    for (sym,val) in buy.items():
        sec = ctx.getSecurity(sym)
        sec.order_target_percent(0.2, comment="SIGNAL BUY")
        pass

 # 売りシグナル
    sell = current["sell:sig"].dropna()
    for (sym,val) in sell.items():
        sec = ctx.getSecurity(sym)
        sec.order_target_percent(0, comment="SIGNAL SELL")
        pass

결과는 다음과 같다.



KDDI의 매매 역사를 보면 이런 느낌.

3년 사이에 20퍼센트 증가했다.남자도 쓸모가 있을 것 같은데.
겸사겸사 말씀드리겠습니다.
알파치는 알고리즘의 수익률에서 시장 전체 운동(기준)과 연동된 수익을 뺀 것으로, 이 수치가 높을수록 기준 수익률이 높을수록 그에 상응하는 수익이 높다는 뜻이다.
베타값은 알고리즘의 수익이 증권시장 전체의 운동에 얼마나 민감하게 반응하고 변동하는지를 나타내는 수치다.이 수치가 높을수록 전체 증시의 변동폭(증감폭)이 크다는 의미다.

해설


총서 선택


#총서 목록 설정
import pandas as pd
import talib as ta
import numpy as np
사용할 장서를 미리 설정하다.

일본 주식의 선택

def initialize(ctx):
    # 設定
    ctx.logger.debug("initialize() called")
    ctx.configure(
      target="jp.stock.daily",
      channels={          # 利用チャンネル
        "jp.stock": {
          "symbols": [
            "jp.stock.9983", #ファーストリテイリング
            "jp.stock.9984", #ソフトバンク
            "jp.stock.6954", #ファナック
            "jp.stock.9433", #KDDI
            "jp.stock.8028", #ファミリーマート
            "jp.stock.8035", #東京エレクトロン
            "jp.stock.4543", #テルモ
            "jp.stock.6367", #ダイキン
            "jp.stock.6971", #京セラ
            "jp.stock.9735", #セコム
          ],
          "columns": [
            #"open_price_adj",    # 始値(株式分割調整後)
            #"high_price_adj",    # 高値(株式分割調整後)
            #"low_price_adj",     # 安値(株式分割調整後)
            #"close_price",        # 終値
            "close_price_adj",    # 終値(株式分割調整後) 
            #"volume_adj",         # 出来高
            #"txn_volume",         # 売買代金
            "ns_buzz"            # バズ(ニュース、ソーシャル)
                                  # 値の範囲:0 ~ 1
           ]
        }
      }
    )

이번 사용을 가져온 일경 평균 공헌률 상위 10개 품종.
또한 사용된 값은 값에만 적용됩니다.

거래 방법

    def _my_buzz(data):
        ns_buzz = data["ns_buzz"].fillna(method="ffill")

        ns_buzz_m75 = ns_buzz.rolling(window=75, center=False).mean()
        ns_buzz_m25 = ns_buzz.rolling(window=25, center=False).mean()
        #バズの25日と75日移動平均出してるよ

        buy_sig = ns_buzz_m75 > ns_buzz_m25
        sell_sig = ns_buzz_m75 < ns_buzz_m25

        return {
            "buy:sig": buy_sig,
            "sell:sig": sell_sig,
            "ns_buzz_m75": ns_buzz_m75,
            "ns_buzz_m25": ns_buzz_m25
        }

    # シグナル登録
    ctx.regist_signal("my_buzz", _my_buzz)


이번에는 우선 25일과 75일의 이동평균선을 계산해야 한다.
그리고 바즈의 25일 이동평균선은 75일에 이동평균선을 위로 뽑으면 사고 아래로 떨어지면 파는 알고리즘으로 매매한다.
신호를 등록해.

수량 선택

def handle_signals(ctx, date, current):

 # 買いシグナル
    buy = current["buy:sig"].dropna()
    for (sym,val) in buy.items():
        sec = ctx.getSecurity(sym)
        sec.order_target_percent(0.2, comment="SIGNAL BUY")
        pass

 # 売りシグナル
    sell = current["sell:sig"].dropna()
    for (sym,val) in sell.items():
        sec = ctx.getSecurity(sym)
        sec.order_target_percent(0, comment="SIGNAL SELL")
        pass

그리고 아까 설정한 구매 신호로 매매를 하는 거예요.
상세한 상황은 여기에 있으며, 이번에 사용한 것만 열거합니다.
 
order_target_percent(amount, comment): void
이 주식의 총보유액과 총자산평가액(현금+보유위치평가액)을 지정비율로 하기 위해 주문을 진행한다.amount에서 비율을 지정합니다(예를 들어 5%면 0.05).
이번 경우 총자산의 20%를 매입해 자금이 없어지면 끝이라고 느껴 자금 관리에 나선 것이다.
이것은 견우와 직녀의 공격을 사용하는 거래다.실제로 그룹이 아니면 이런 거래를 할 수 없잖아요, 웃음.
그럼 이번엔 여기까지.

좋은 웹페이지 즐겨찾기