💬

SIGNATE日本取引所グループ ニュース分析チャレンジ[モデル構築編1]

2 min read

SIGNATE日本取引所グループ ニュース分析チャレンジ[追加データ取得編][1]の続き

ルール

  • 100万円を元手に月曜日にポートフォリを組み(買い)、金曜日にすべて売る
  • 途中で売り買いできない
  • 5銘柄以上 and 50万円以上の買いが必須

戦略

  • 6日後の株価の予測を行う
  • 予測に基づきポートフォリを組む (とりあえずtop10の銘柄を10万円ずつ買う)

特徴量

まずは株のヒストリカルデータからだけを使ったテクニカル分析を行う。
talib[2]と呼ばれるテクニカル分析のパッケージを使うと簡単

とりえあず、rsi、移動平均、ボリンジャーバンドあたりの有名なものを片っ端から入れていく
これに元のヒストリカルデータの特徴量を結合して特徴ベクトルを生成する。

def create_talib_feature(input_df):
    out_df = []
    target_label = 'EndOfDayQuote ExchangeOfficialClose'
    for target_code in tqdm(input_df['Local Code'].unique()):
        ret = {}
        df = input_df.loc[input_df.loc[:, 'Local Code']==target_code, target_label]
        prices = np.array(df, dtype='f8')
    
        ret['rsi7'] = ta.RSI(prices, timeperiod=7)
        ret['sma14'] = ta.SMA(prices, timeperiod=14)
        ret['sma7'] = ta.SMA(prices, timeperiod=7)
        ret['bb_up'], ret['bb_mid'], ret['bb_low'] = ta.BBANDS(prices, timeperiod=14)
        ret['mom'] = ta.MOM(prices, timeperiod=14)
        tmp_df = pd.DataFrame(ret, index=df.index)
        ret['sma7_diff'] = tmp_df['sma7'].diff()
        ret['sma14_diff'] = tmp_df['sma14'].diff()
        ret['sma_diff'] =tmp_df['sma7'] -tmp_df['sma14']
        ret['bb_diff'] = tmp_df['bb_mid'] - tmp_df['bb_up']
        code_df = pd.DataFrame(ret, index=df.index)
        out_df.append(code_df)
    return pd.concat(out_df, axis=0)

学習

リークしないように注意しながら、5日後の株価をLightGBMのregressionで学習する。
学習期間は以下のようにした

TRAIN_START = "2016-02-01"  # テクニカルを行うために1ヶ月のbuffer
TRAIN_END = "2019-12-30"
VAL_START = "2020-02-01"
VAL_END = "2020-11-30"
TEST_START = "2021-02-01" # ここのデータは無いのでapiで取る必要がある
TEST_END = "2021-02-05"

結果

1週間のリターンが 7.4691% でそこそこの数字
TestのRMSLE: 1.4227

月曜から金曜までの銘柄(Local Code)ごとのリターン

3日目までは割と上昇銘柄を選択できているが、5日先はつらそうで5217が足を引っ張ってる。一方でリターンが+40%の銘柄(3415)も選び出せていてこれは、全銘柄で実際のリターンが一番高かった銘柄である。

最後に効いている特徴ベクトルを調べる

効いてる順から

Close系の株価
bb_mid: ボリンジャーバンドのmiddle (今回は14日の移動平均)
sma7: 7日の移動平均
Local Code: 株価の違い

株価と移動平均がきいていて、rsiなどはほんのちょっと貢献、これは株価自体を当てに行ってるので、株価の大体のオーダーを知るために効いているためだと考えられる。例えば日のリターンなどに変えると効いてくる特徴ベクトルが変わるかもしれない。
またLocal Codeの違いがそこまで重要じゃないようなので、今のように個別にモデルを作る必要もあまりないのかもしれない。

つづく[3]

脚注
  1. 前記事 ↩︎

  2. TA-Libでテクニカル分析 ↩︎

  3. 次の記事 ↩︎

Discussion

ログインするとコメントできます