LoginSignup
3
5

More than 3 years have passed since last update.

機械学習による株価予測で食っていくことは可能か[実施計画編]

Last updated at Posted at 2020-07-30

はじめに

本記事は、単なる思い付きで言っています。当方データサイエンティストでも意識高い系エンジニアでもないので、アカデミックな裏付け無しです。
単なるプー太郎の戯言です。

株価はランダムウォークということは、重々承知しているものの、過去の株価の機械学習で株価予測ができないかと常々思っている。
例えば、明日の値幅(引値と寄り値の差)がプラスかマイナスかを的中率60%の精度で予測できたとする。サイコロを振って予測した場合の的中率は50%なので、60%の的中率はそんなに無謀ではないように思える。

的中率60%ということは、10回予測すると6勝4敗で2回勝ち越しということ。毎回同額を投資したとし、的中して得た利益とはずして失った損失が、長い目で見て打ち消しあったとすれば、10回毎に2回分の利益が積み重なることになる。

個別銘柄だと、空売りでもしなければ、上がると予想した時しか購入チャンスがないので、現物買いだけで成立するようなスキームとする。
すなわち、日経225を予測対象とし、

  • 日経225が上がると予測したら、1570 NF日経レバレッジを購入
  • 日経225が下がると予測したら、1357 NF日経ダブルインバースを購入

とすれば、現物買いだけで回せるようになる。
手持ち資金が少ないので多少のレバレッジも効かせることができる。

日経225の値幅

そこでまず最初に、日経225の値幅がどのくらいあるのかを調べてみる。
日経225の時系列データをcsvに落として、

title=NIKKEI225.csv
Date,Open,High,Low,Close,Volume
2017-10-31,21896.38,22020.38,21840.07,22011.61,1055801728.0
2017-10-30,22047.95,22086.88,21921.24,22011.67,1397960064.0
2017-10-27,21903.27,22016.5,21815.72,22008.45,1241389952.0
2017-10-26,21698.95,21793.62,21688.56,21739.78,851784320.0
  ....

以下のようなコードを書いて確認。相場のトレンドによっては、上昇時と下落時の値幅の平均は異なるだろうが、ほぼボックス相場とみなし、値幅の絶対値の平均をとる。

title=n225_statistics.py
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statistics

def calc_histgram(exchange):
    '''
    値幅分布の標準偏差算出とヒストグラム作成
    '''    
    # 寄値をlistに変換
    open_list = exchange['Open'].tolist()
    # 終値をlistに変換
    close_list = exchange['Close'].tolist()
    diff_list = ((np.array(close_list) - np.array(open_list))/np.array(open_list)).tolist()
    stdev = statistics.stdev(np.array(diff_list))

    # 値幅の平均値を算出する
    abs_diff_list = np.abs(diff_list)
    abs_diff_mean = statistics.mean(np.array(abs_diff_list))
    print('abs_diff_mean={}'.format(abs_diff_mean))

    # 値幅=20のヒストグラムを描画する
    plt.hist(diff_list, bins=80, rwidth=50)
    plt.title('n225 price range, sigma={}'.format(stdev))
    plt.show()

def main():
    nikkei_225 = pd.read_csv('NIKKEI225.csv').set_index('Date').sort_index()
    calc_histgram(nikkei_225)

if __name__ == '__main__':
    main()

fig1-1_n225_sigma.png

2014-10-14~2017-10-31の平均値幅は、0.64%だった。

予測スキーム

今回のスキームでは、NF日経レバレッジ、NF日経ダブルインバースで2倍のレバレッジをかけるので平均値幅ΔはN225の2倍なので、Δ=0.64%×2=1.28%。

1か月に20回相場が開くとし、的中率60%の予測ができれば、月に4回勝ち越すことになり、月間利益は、1日当たりの投資金額×1.28%×4となる。
売買手数料(往復で0.064%)は20回分必要。
このほかに投信の手数料も必要だが、これは微々たる額なので無視。
勝ち越した4日分以外の損益はイーブンだったとする。

月間利益 = 1日当たりの投資金額×(1.28%×4-0.064×20)
= 1日当たりの投資金額×3.84%
となる。

月利3.84%だと12倍すると年率46%。これはおいしい。本当だろうか?
1日当たりの投資金額を100万円とすれば、月間利益の期待値は38,400円。
いいお小遣いだ。
投資金額を1000万円にすれば、食っていけるやん。

どこかが間違っているとすれば、あやしいのは
「日経225の値幅の符号を60%の精度で予測する」というところだが。。。

ここを検証していきたいと思う。

まとめ

日経225の値幅の符号を60%の精度で予測することができれば、年率46%の利益が得られるかもしれないという戯言。

機械学習による株価予測で食っていくことは可能か[機械学習編その1]につづく。

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5