株を買うタイミングを逃す一番の理由は、そもそも見ていないからでした。

条件は決めてあります。「25日移動平均線を大きく割り込んだら」「前日比-2.5%以上の急落があったら」といった具合に。でも会社員をやりながら、毎晩23銘柄のチャートを開いて条件に合っているか確認するのは、3日で挫折しました。

なので、確認する作業そのものをやめました。条件に合った銘柄だけが、毎朝スマホに届く仕組みをPythonで作った話を書きます。

作ったもの:「朝刊」と「夕刊」

やっていることはシンプルです。

時刻内容
朝刊平日 8:00寄り付き前。前日終値までのデータで条件に合った銘柄と、当日の地合い判定
夕刊平日 15:30引け後。その日の終値で条件チェック

これがDiscordに飛んできます。スマホでDiscordの通知を見るだけで、その日に見るべき銘柄が分かる状態になりました。

なぜDiscordかというと、Webhookが無料でURLを1本発行するだけで使えるからです。メールだと迷惑メールに振り分けられたり、通知に埋もれたりしますが、Discordなら専用のサーバー(チャンネル)を作って、そこだけ通知をオンにしておけます。LINEでも似たことはできますが、Discordの方が仕組みが単純でした。

構成

大がかりなものは何も使っていません。

Windowsタスクスケジューラ
   ↓ 平日8:00 / 15:30に起動
Python スクリプト
   ↓ 株価データ取得(J-Quants / Yahoo Finance)
   ↓ テクニカル指標を計算
   ↓ 条件に合致した銘柄を抽出
Discord Webhook
   ↓
スマホに通知

サーバーは借りていません。自宅のPCで動かしています。クラウドに置いた方が確実なのは分かっていますが、まずは動くものを作るのを優先しました。

条件や銘柄はコードに直書きせず、設定ファイル(YAML)に分けてあります。

  • watchlist.yaml … 監視する銘柄
  • rules.yaml … 売買条件
  • trading.yaml … 資金・手数料などの前提

こうしておくと、条件を追加したいときにプログラムを書き換えなくて済みます。「移動平均線の日数を25日から20日に変えて試したい」みたいな検証が、設定ファイルの数字を1つ変えるだけで終わります。

実装した条件

現時点で入れているのは、僕が本で学んだ内容をそのままコードにしたものです。

  • 25日移動平均線からの乖離(大きく割り込んでいるか)
  • パーフェクトオーダー(短期・中期・長期の移動平均線が上から順に並んでいる=強い上昇トレンド)
  • ボリンジャーバンド(-3σ付近にタッチしているか)
  • RCI(順位相関指数が売られすぎの水準か)
  • 前日比の急落(大型株が明確なニュースなしに-2.5%以上下げているか)

加えて、地合いの判定も出しています。日経平均の25日線乖離、前日の米国市場(S&P500 / NASDAQ)、半導体のSOX指数、日経225先物を合成して、【強気 / 中立 / 弱気】の3段階で表示させています。

個別銘柄の条件だけ見ていると、全体が崩れている日に買いシグナルが並ぶ、という状況になりがちだったので、地合いを一緒に出すようにしました。

地味だけど重要:シャットダウンではなく「休止状態」にする

自宅PCで自動実行する場合、PCの電源をどう扱うかが意外な落とし穴でした。

通知を送ったあとPCをシャットダウンすると、次の日の8:00にタスクスケジューラがPCを起こせません。電源が完全に切れた状態からは、タスクスケジューラはPCを起動できないからです。1回シャットダウンした時点で、翌日以降のルーティンが全部止まります。

なので、送信後は休止状態(ハイバネート)に移行させています。休止状態なら「スリープ解除タイマー」でタスクスケジューラがPCを復帰させられるので、翌朝も自走します。

  • タスクの設定で「タスクを実行するためにスリープを解除する」にチェックを入れる
  • 電源オプションでスリープ解除タイマーを許可する
  • スクリプトの最後に休止状態へ移行する処理を入れる

この3つが揃って初めて、放置しても毎日動く状態になりました。ここは自動化の内容とは関係ない、環境側の話ですが、ここでつまずくと何も動きません。

作って一番よかったのは「バックテストできるようになったこと」

通知そのものより効果が大きかったのが、過去のデータで条件を検証できるようになったことでした。

同じコードで過去3年分をなぞれば、その条件で売買していたらどうなっていたかが分かります。しかも、

  • 売買手数料
  • スリッページ(想定より不利な価格で約定する分)
  • 信用取引の金利

まで差し引いた純損益で集計できます。ここまでやると、机上の数字と実際の成績のギャップがかなり見えるようになりました。

たとえば、コストを引く前と引いた後でこれだけ違いました。

3年間の合計損益
コスト控除前436万円
コスト控除後390万円

差額46万円。利益の約1割がコストで消えています。手数料が0円のコースを使っていてもです。内訳の大半はスリッページと信用金利でした。

ここから分かるのは、回転数を上げるほどスリッページが効いてくるということです。「手数料無料だから何回売買しても同じ」ではありませんでした。

正直な話:自作ツールにバグがありました

ここからが、この記事で一番書きたかったことです。

最初にバックテストを回したとき、年利+51.9%という数字が出ました。素直に嬉しかったです。「このルール、けっこういけるのでは」と思いました。

その後、別の調査をしている最中に、RCIの計算で符号が完全に反転しているバグを見つけました。

  • 症状:一貫して上昇し続けるデータを入れると-100、一貫して下落するデータを入れると+100を返す(本来は逆)
  • 原因:日付の順位づけを「古い日を1位」として計算していた(正しくは直近の日を1位とする)
  • 影響:「RCIが売られすぎ(-90以下)なら買い」というルールが、実際には買われすぎの銘柄を拾っていた

つまり、正反対の条件でエントリーしていたということです。

修正して回し直したところ、年利は +51.9% → +43.5% に下がりました。

このとき自分で反省したのは、都合の良い数字が出たときに疑わなかったことです。もし最初に「年利-30%」と出ていたら、僕はコードを疑ったと思います。良い数字が出たから、そのまま受け入れてしまった。

テクニカル指標を自分で実装する場合は、合成データでテストするのが確実でした。「ひたすら上がり続けるだけの価格データ」を入れて、指標が想定どおりの値を返すか確認する。これをやれば、符号の反転のような根本的なミスは一発で見つかります。

バックテストの数字を鵜呑みにしてはいけない3つの理由

バグを直したあとの「年利+43.5%」も、僕はそのまま信じていません。理由が3つあります。

① 銘柄選定の先読みバイアス

監視している23銘柄は、「今、伸びていると分かっている」銘柄です。半導体を中心に選んでいます。

でも3年前の自分が、この23銘柄を選べたでしょうか。まず無理です。過去を検証しているつもりで、未来の情報を使って銘柄を選んでいることになります。実運用の成績は、これよりはっきり悪くなるはずです。

② 検証期間の相場環境が良すぎる

検証したのは日本株、特に半導体が強かった時期です。下落相場での成績はまったく検証できていません

③ 実際には買えない銘柄が混ざっている

僕の資金設定では1トレード上限が決まっているので、株価が高い銘柄は1単元も買えません。バックテストの結果は、実質的に「買える価格帯の銘柄」中心の数字になっています。ウォッチリストの見た目と、実際に売買できる範囲が一致していませんでした。

→ 関連記事:信用取引の資金管理|1トレードの損失を「資金の2%」に抑えるポジションサイズの決め方

これから作るもの

次に手を付けるのは、通知でも条件でもなく、逆指値の自動セットです。

僕が一番大きく損をしたのは、条件を見逃したからではなく、損切り注文を入れ忘れて自分の手で決済してしまったときでした。であれば、機械に任せて効果があるのはエントリーではなく出口です。

そのあとは、約定履歴の自動記録 → 場中データの収集 → 半自動発注、という順番で進める予定です。エントリーの完全自動化は最後に回します。ルールの検証がまだ終わっていないのに自動化しても、間違いを高速で繰り返すだけなので。

よくある質問

Q. プログラミング未経験でも作れますか?

僕もエンジニアではありません。ただ、株価の取得・指標の計算・通知の送信は、それぞれ調べれば情報が出てくる範囲です。最近はAIに書かせながら進めることもできます。ただし書かせたコードが正しいとは限らないのは、今回のRCIのバグが示すとおりです。合成データでのテストは必ずやった方がいいです。

Q. 株価データはどこから取っていますか?

J-QuantsとYahoo Financeを併用しています。Yahoo Financeのデータは非公式な手段で取得しているので、仕様変更で突然使えなくなる可能性があります。継続的に使うなら、公式にデータを提供しているサービスを使う方が安全です。

Q. 通知が来た銘柄をそのまま買っているんですか?

買っていません。あくまで「見る銘柄を絞る」ためのものです。条件に合致していても、地合いが悪ければ見送りますし、資金的に買えない銘柄も混ざっています。判断を代行させるのではなく、判断の対象を減らすのが目的です。

Q. クラウドで動かした方がいいですか?

その方が確実です。自宅PCだと、停電・再起動・Windows Updateで簡単に止まります。ただ最初から完璧を目指すと作り終わらないので、まず手元で動かして、必要になったら移す、という順番でいいと思っています。


※この記事の内容は個人の見解・体験談であり、投資助言ではありません。記載のバックテスト結果は筆者が作成したプログラムによる過去データの検証であり、将来の成果を保証するものではありません。信用取引は元本を超える損失が生じる可能性があります。売買の判断はご自身の責任でお願いします。