ねほり.com

何もないから何かみつかる

機械学習で株予測(3点チャージ法の有効性検証)

      2020/02/05

前回、機械学習で解いた学習モデルが勝率50.48%、プロフィットファクター1.15、平均年利5.91%、最大損失年利-37.23%という事が分かりました。

今回は、現時点で考えている特徴量を追加して成績が改善するか確認してみます。
 

 
株式投資の種類と手法をまとめました。

私は利益は出てませんが、たまに株式投資を教える事があるため用です。

今回はテクニカル指標(ボリュームレシオ)、ストラテジー(3点チャージ法)を特徴量として追加してみます。

 

「三点チャージ法」を指標として追加する

テーブルデータのコンペにおいて特徴量の作成は非常に重要な要素で、良い特徴量が作れたかどうかで順位が決まることがほとんどです。

複数の変数を組み合わせることで、変数同士の相互作用を表現する特徴量を作成できるからです。

たとえば、
 

「物件の面積」と「部屋数」という変数を割り算して、「1部屋当たりの面積」という新特徴量を作成する

 

ことで、精度が上がったりします。

これって不思議なんだよね。

このような特徴を自動的に見つけるのが機械学習なんじゃないのかな?局所解に陥らないようになるから良くなるの??

 

 

まあ理由はさておき、それならば・・・・みんな大好き「三点チャージ法」!

手法は次の通りです。

  • 1) 終値と26日移動平均線の乖離率が-15%以下
  • 2) VR:ボリュームレシオ(25日)が70以下
  • 3) RSI(14日)が25以下

 

これを実装して、特徴量として追加します。
 
・・・・
 

ボリュームレシオがTa-libに存在しない!

 

 

ProtraのTIlibを使えないと、ここから実装する必要があるのか・・・・

先が思いやられる・・・な。

VR(ボリュームレシオ)の計算方法

Protraの公式マニュアルを見てみると、次のような計算になっていました。
 

U=期間内の株価上昇日の出来高合計
D=期間内の株価下落日の出来高合計
S=期間内の株価変わらずの日の出来高合計

とすると、

VR[A]=(U+S/2)÷(D+S/2)×100

※ 指標値は0以上で上限はない。500~1000近くまで上がるときもある。上昇と下落が均衡しているとき(U=D)は100

VR[B]=(U+S/2)÷(U+D+S)×100

※ 指標値は0~100の間に収まる。上下均衡しているときは50

和光VR=(U-D-S)÷(U+D+S)×100

指標値は-100~100の間に収まる。上下均衡していて株価の変わらずの日が無ければ0

となる。

なお、「3点チャージ投資法」ではVR[A]を用いているそうです。
 

 

ググってみると、Pythonのテクニカル指標ライブラリ「Ta-lib(タリブ)」以外にも、「pyti(パイタイ)」「ta」「stockstats」などが見つかりました。

また、脱talibで自作しようとしている人もいました。

一応、ボリュームレシオの実装らしいものが見つかりましたが、計算式が異なるので、やっぱり自作します。

Pythonによるボリュームレシオ実装方法

そもそもpandas は 2008 年頃から金融の現場で開発され始めたデータツールです。

そのため、金融・経済データの実践的な分析ツールとして強力な機能をいくつも備えています。

株価上昇率を求めるには、前日の終値との差分が必要です。

差分にはpandasのdiff()を使います。

デフォルトでは1行前の値との差分が算出されます。

また、窓関数(ある有限区間以外で0となる関数)には、pandasのrolling()を使います。

作成したボリュームレシオ関数は次のとおりです。

Protraと同じ結果となったので、正しく動いているかと思います。

Pythonによる3点チャージの実装方法

こちらは簡単です。一行です。

ボリュームレシオ追加の学習モデル有効性検証

過去のストラテジーテンプレートを使ったので次の通りです。

【資金管理条件】

  • 1) 銘柄選定(トヨタ)
  • 2) 1回の購入資金 (100万円)
  • 3) 投資総額 (1000万円)
  • 4) 単利利用

【買いルール】

  • 1) LightGBMがSMA、RSI、BB、MACD、VR、三点チャージ法から自動買い選定

【手仕舞いルール】

  • 1) 3日経過

これを引数なしのLightGBMで解いてみます。

デフォルトのパラメータで訓練データの精度(Accuracy)がほぼ100%で分類できてしまう状態になりました。

当然過学習を起こしている状態で、検証データ・テストデータに対しては精度が57%となってしまいました。

そして「feature_importances_」のデータ結果です。

決定木が重要な特徴と判断したデータの上位にボリュームレシオが入っています。

この特徴量は作ってよかった。

因みに三点ジャージ法は、トヨタのような優良株ではそもそもシグナルが出ていないようなので役に立っていません。

バックテスト結果

Protraを使ったバックテスト結果は次のようになりました。

利益曲線は次の通りです。

すごい結果になりました!!!

勝率8割近くでプロフィットファクターが7近くあります。

さらに年利は30%を超えています。

さっそく「聖杯」が見つかりました!

 

が、このストラテジーは今までの経験上、未来データを使った「呂布」なのか???

が・・・・未来データが入る実装ミスはありませんでした。

 
 

このストラテジーが何者なのか簡単に考察してみます。

この学習モデルの構築には「2006/02/20~2020/01/24」までの結果を利用しています。

このため2000年~2006年の株価は学習モデルが一切知らない相場となります。

その部分だけ見てみます。

負ける年もあり勝率は高くありません。

確かに利益曲線も寝ています。

ようするに
 
 

過学習(オーバフィッティング)が発生しています!

 
 

これがオーバーフィッティングというヤツかぁ・・・・・。

初めて体験しました。

やっぱり過去のデータから未来は予測できない・・・・という事なのか?

厄介な問題にぶつかりました・・・。

 
 

なお、作成された「model.pickle」は150MB近くあります。今までは40MB程度でしたがサイズが大きいです・・・・。

本気で機械学習で学習モデルを作ってシステムトレードするならハードディスクの増設が必要そうです。

まとめ

試そうと思っているストラテジーは大量にあります。

ですが、その前にオーバーフィッティングをどうにかしないとリアルでは勝てなそうです。

すでに与える特徴量が多すぎるのか・・・。

ただ、Protraの結果を見る限り期待通りにストラテジーが作られている事が分かったので、安心しました。

「Protra+機械学習」の手法は、(オーバーフィッティングはしますが)思った以上に高い年利のストラテジーが作成できるようです。

ソースコード

学習させるときは、 read_csv の引数はskiprows=2000(2006/02/20~現在まで)、学習済データで予測させるときはskiprows=0に変更して出力しました。

まずはライブラリです。

「nehori」という下に「tilib.py」というファイルを置きます。

そして、上記ライブラリを読み込んで特徴量を作成します。

 - 2020年(社会人16年), 機械学習, テクノロジー, システムトレード

  関連記事

Protra使い方発展編(ボリンジャーバンドを3/-3σまで表示する)

テクニカル分析には、テクニカル指標を活用します。 分析手法 分析法の概要 テクニ …

機械学習で株価予測(年利・勝率向上の分析)

新型コロナウイルス感染症の影響によりスAmazonでのマスクの値段が7~8倍にな …

月単位の利益を出力してみる(システムトレード)

世界的な株の下落が始まりました。 [8/5]米国株、ダウ続落で767ドル安 下げ …

curlと1024バイトとExpect: 100-continue

GWも出社して動作確認の手使いと、今月末リリース予定の実装を進め中。 山手線も会 …

千葉市検見川浜・稲毛海岸でマテ貝・シオフキガイ捕りと砂出し調理法

昨日、マテ貝を大量に貰ったので、自分たちでも挑戦したくなり「マテ貝」を取りに来ま …

Kaggle の Titanic Prediction Competition でクラス分類(Keras編)

将来が不安です・・・。     先週、上司(センター長、部門 …

テレビを捨てた放送局、テレビを捨てた家電メーカー

「テレビの視聴者離れが進み、ネットコンテンツが充実し、テレビはオワコン」 と、よ …

NYダウを利用した空売りの有効性検証(システムトレード)

海外出張から戻ってきました。 また来月、二回海外出張があります。 二週間後も海外 …

大学院生活は大変(授業と研究の両立&論文作成&後輩フォロー&輪講)

ネタが無かったので、日記の更新をサボってました…。 近況報告をお伝えします。 & …

2020年の日本を予想した1920年の人物を紹介する

今からちょうど100年前の1920年(大正9年)、ジャーナリスト(国粋主義者)の …