ねほり.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年), 機械学習, システムトレード, テクノロジー

  関連記事

情報革命とバイオ革命の融合「バイオ・インフォメーション・エイジ」

March 4, 2005 すでに、コンピューター業界もバイオを新たな成長分野に …

VinePlus(3.0系列)に私の自作ソフト掲載決定

February 15, 2005 なにやら一通のメールが届いてました。 &nb …

新年の挨拶・昨年の振り返りと2020年の目標

9年休なのに何も予定を立てず帰郷もぜず、いつの間にか新年を迎えてしまいました。 …

斉藤正章氏の手法の有効性検証(protraシストレ)

Protraに慣れてないので、まだまだ巷のサンプルソースコードを入手したい。 ・ …

機械学習を使った株価予測(pandas-profiling、create_tree_digraphで可視化する)

株式投資は、予測するものではなくルールに沿って選ぶものです。 その際に、選んだ銘 …

Protraサンプル(Breakout)の有効性検証(protraシストレ)

最初にProtraを利用した際に、サンプルの動作確認でエラーが発生し何もわからな …

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

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

テクニカル手法の勝率・PFまとめ(システムトレード)

当初、システムトレードの手法として、 勝率70%以上 PF2.0以上 最大損失2 …

BNF氏の逆張りスイングトレードの有効性検証(protraシストレ)

BNF(小手川隆)氏の「乖離率」逆張り投資手法のバックテストを以前紹介しましたが …

機械学習で株価予測(Backtraderでバックテスト調査)

中国・武漢で発生した「新型コロナウイルス(新型肺炎)」が、世界に拡散中です。 こ …