AI株取引支援システムの全体像――候補抽出からLINE通知、エアトレードまで
はじめまして。「株取引を仕組み化するヲ」、略して「するヲ」です。関西で会社員をしながら、PythonとAIを使った株取引支援システムを個人開発しています。
作り始めたきっかけは、勘やその日の気分に頼る売買を減らしたかったからです。買いたい理由を探すだけでなく、見送る条件や損失への備えも、あらかじめ決めておきたいと考えました。
今回は、私が作っているシステムが何をしているのか、候補銘柄の抽出からLINE通知、エアトレードでの検証までの全体像を紹介します。
候補を絞り、複数の条件で評価し、その後の結果を記録する。最終的な判断は人間が行う。そんな「株取引の判断と検証を支援する仕組み」です。
執筆時点では、エアトレードと、実際には注文を送らずに内容を確認するdry-runで検証しています。この記事で紹介する仮想売買の記録は、実際の資金による売買実績ではありません。
(寝ている間にAIが全部稼いでくれるところまでは、いっていません。私も一度は期待しました。)
全体を7つの工程に分けています
主な流れは、次の7工程です。
1.市場から候補銘柄を集める
2.日足データとテクニカル指標を更新する
3.売買ルールで候補を絞る
4.機械学習で候補を評価する
5.Entry、Watch、Skipに分類する
6.LINEへ通知する
7.エアトレードで結果を追跡する
候補収集 → データ更新 → ルール判定 → AI評価 → 分類 → 通知 → 結果検証、という流れです。
最初は、一つのスクリプトで株価を取得する程度でした。そこへ候補抽出、通知、機械学習、結果の追跡を加えていき、気がつけば七つの工程になっていました。
(ちょっと便利にしたかっただけやのに、だいぶ増えました。)
1.市場から候補銘柄を集める
最初に、その日に確認する候補銘柄を集めます。
日本株をすべて、一銘柄ずつ人間が確認するのは現実的ではありません。そこで、私のシステムではkabuステーションAPIから取得したランキング情報などを使い、値動きや売買の活発さが一定条件に合う銘柄を集めています。
APIは、プログラムから情報の取得などを行うための窓口です。ここではPythonから利用し、「今日確認する候補」を集める入口にしています。
この段階では、確認対象を現実的な数まで減らします。候補に入っただけで購入を決めたり、そのまま自動発注したりする運用にはしていません。次の工程へ進めるための一次選考に近い位置づけです。
2.株価データとテクニカル指標を更新する
候補銘柄が集まったら、Pythonのライブラリであるyfinanceを使って、日ごとの値動きを表す日足データを更新します。私のシステムでは、過去の日足を集め、検証用の指標を計算するために使っています。
取得データについては、提供元や利用ツールの利用条件を確認する必要があります。本記事では、元の株価データそのものの販売・配布は行わず、自分の開発・検証の進め方を紹介します。
終値や出来高に加え、移動平均、ボリンジャーバンド、直近高値との距離、出来高の変化などを計算します。例えば、次のような点を見ています。
・短期と中期の移動平均はどの位置にあるか
・出来高は普段より増えているか
・直近高値に近づいているか
・上昇後に過熱しすぎていないか
・押し目らしい位置にいるか
以前は、チャートを見て「なんとなく上がっている」と判断していました。今は、その「なんとなく」を、できるだけ数字へ分解しようとしています。
数字にすれば必ず当たるわけではありません。それでも、自分の気分が変わっても同じ条件で比較し、判断を振り返りやすくなります。
3.売買ルールで候補を絞る
計算した指標を使って、候補をさらに絞ります。
主に見ているのは、「上方向への動きが強まっている候補」と「上昇傾向の中で一度下げた候補」です。
一方、急に上がりすぎている、値動きが大きすぎる、買える金額に合わないといった候補は、この段階で除外したり、評価を下げたりします。
大切にしているのは、良さそうな理由だけでなく、見送る理由も記録することです。
人間がチャートを見ると、買いたいときほど都合のよい材料を探しがちです。
(少なくとも私は、かなり探します。)
そのため、あらかじめ決めた条件に合わなければ、見送る判定が出るようにしています。
4.機械学習で候補を評価する
売買ルールによる評価に加えて、LightGBMという機械学習モデルでも候補を評価しています。本記事でいうAI評価は、主にこの部分です。
中心となる問いは、「候補が一定期間内に目標とする値動きへ到達する可能性を、どの程度と見積もるか」です。
モデルには、銘柄ごとの値動きやテクニカル指標に加えて、市場全体の状態も一部取り入れています。
ただし、モデルが出す確率は、過去のデータから学習した推定値です。その数値どおりの割合で将来も成功するとは限りません。高く評価した候補が外れたり、低く評価した候補が上がったりすることもあります。
そのため、機械学習の出力は売買ルールによる評価と組み合わせ、判断材料の一つとして使っています。
5.Entry、Watch、Skipに分類する
テクニカル指標、売買ルール、機械学習の評価をまとめ、候補を三つに分類します。
・Entry候補:優先して確認する対象
・Watch候補:条件が整うか継続して見る対象
・Skip/参考:今回は見送る対象
Entryという名前を付けていますが、意味は「優先して確認する候補」です。購入を指示するものではありません。
WatchとSkipも残しているのは、見送った候補がその後どうなったかを検証するためです。Entry候補だけでは、選別の仕方が適切だったのか比較しにくくなります。
「見送った銘柄の方が上がっていた」という、あまり見たくない結果も記録します。
(見たくないものほど、だいたい改善材料です。)
6.結果をLINEへ通知する
分類が終わると、その日の候補を自分のLINEへ通知します。
毎回CSVファイルを開かなくても、Entry候補やWatch候補の概要をスマートフォンで確認できるようにするためです。通知では、候補の分類、主な評価、想定する売買計画などを確認します。
通知は「今日、優先して確認するものがあります」という入口です。内容を見てすぐ注文するのではなく、詳しいデータやダッシュボードを確認する流れにしています。
作り始めたころは、通知が来るだけで少し完成した気分になりました。
(通知は利益ではありません。ここ、地味に大事です。)
7.エアトレードでその後を追跡する
候補を出して終わりにすると、その判断が良かったのか分かりません。そこで、一定の条件で仮想的に購入したものとして、その後の値動きを記録しています。
確認するのは、例えば次のような項目です。
・想定した購入価格に到達したか
・利益確定や損切りの水準に到達したか
・保有中にどこまで上昇、下落したか
・Entry候補とWatch候補で差があったか
・厳しい条件と緩い条件で結果が変わったか
一定の利益に到達した後の売却方法や、固定的な損切りと値動きに応じた方法の違いも検証しています。
ただし、価格への到達を記録できても、実際にその時刻、その価格で購入・売却できたとまでは言えません。エアトレードの結果を見るときは、どの時点の情報を使い、どの条件で売買できたと仮定したかも確認する必要があります。
大切なのは、一回当たったかどうかだけでなく、同じルールを繰り返したときにどうなるかです。一件だけなら、うまくいった理由を後付けできます。件数が増えるほど、その説明だけでは済まなくなります。
(データ、容赦ないです。)
自動化しても、人間が確認する部分は残しています
候補収集、データ更新、指標計算、機械学習による評価、通知、結果記録の多くを自動化しています。
一方で、実際の注文へ進む前には、人間が次のような点を確認する方針です。
・データは正常に更新されているか
・市場全体に大きな異変がないか
・想定する損失額は許容範囲か
・買付余力や既存保有に問題がないか
・流動性や急な値動きに無理がないか
・システムが想定外の状態になっていないか
注文を送らずに内容を確認するdry-runや、実運用へ進める状態かを確認するチェックも作っています。
毎日繰り返す作業をシステムへ任せることで、人間が例外やリスクの確認に時間を使えるようにしたいと考えています。
裏側では、もっと地味な確認が動いています
実際の開発では、安定して動かすための確認にも多くの時間を使っています。
・APIから正常にデータを取得できたか
・当日分のファイルが作成されたか
・同じ処理が重複して動いていないか
・閉場前と日足確定後で、候補が変わる理由は何か
・仮想的な注文や決済が想定どおり記録されたか
・エラーが起きたときに処理を止められるか
モデルの精度を上げることより、こちらの確認に時間がかかる日もあります。
(AIより先に、ファイルの日付を疑う日もあります。)
派手さはありませんが、毎日動かして結果を比較するために欠かせない部分です。
現在地は、実運用前の検証中です
執筆時点では、エアトレードとdry-runを使い、実際の資金を使った検証へ進む前の条件を確認しています。
仮想的な購入が安定して記録されるか、利益確定や損切りが想定どおり判定されるか、条件の違いによって結果がどう変わるか。こうした確認を積み重ねています。
実運用へ進む場合も、少ない銘柄数、最小限の金額、人間の最終確認あり、という小さな範囲から始める予定です。以前、損切りをためらった経験があり、その反省も仕組みに反映しようとしています。
作り始めたころは、上がる銘柄を見つけることが一番重要だと思っていました。今は、候補を絞ることに加えて、見送る理由を残すこと、損失を抑える条件を決めること、同じ条件で結果を記録すること、想定外のときに止まることも重視しています。
勘だけで売買していたころより、判断の理由を説明し、振り返れるようになりました。これからも、検証で分かったことや、うまくいかなかった点を記録していきます。
※本記事は、筆者個人のシステム開発・検証記録です。特定の金融商品の購入・売却を推奨するものではなく、将来の運用成果を保証するものでもありません。エアトレードの結果は実際の売買実績とは異なります。投資判断はご自身の責任で行ってください。