アルゴリズムに勝つには?個人投資家が“唯一”戦える時間とは

株の知識
スポンサーリンク

今日の投資戦略は?

???

はじめに

株式市場は今や、超高速で動くアルゴリズム取引が主流となっています。
ニュースや適時開示が公表された瞬間、機関投資家やプロの専用端末はわずか数秒以内に反応し、株価を大きく動かしてしまいます。
そんな中、個人投資家は「材料が出た頃にはもう株価が動き終わっている」「情報を得てもすぐに買えない」と感じることが多いでしょう。

しかし、実は個人投資家にも“唯一”アルゴリズムに対抗できる時間帯があります。
それは市場の取引時間外に開かれるPTS(私設取引システム)市場を活用する方法です。

この記事では、アルゴリズムに勝てないと悩む個人投資家が取るべき戦略と、僕自身が実践するTDnet情報の抽出やSBIのAPIを活用したリアルタイム情報収集方法を紹介します。
ぜひ最後まで読んで、あなたの投資スタイルに役立ててください。

アルゴリズム取引が強すぎる理由:個人投資家が直面する3つの壁

1. 市場の反応が早すぎる

プロの機関投資家や専用端末(QUICK端末、Bloombergなど)は、ニュースが出てから数ミリ秒〜数秒以内に株価を動かします。
一方で、個人投資家がTDnetや適時開示を見られる頃には、既に株価が動いてしまっていることが多いのです。

2. 証券会社APIには制限がある

国内の証券会社が提供するAPIは、取引機能が限定的だったり、リアルタイム性に欠けることが多いです。
たとえば楽天証券APIでは「条件に合ったら注文」といった自動注文の設定はできますが、完全にリアルタイムでアルゴに反応するのは難しい場合があります。

3. 実行タイミングと市場時間の問題

TDnetの適時開示は15:00以降(15:30)、つまり株式市場が引けた後に多数発表されることが多いです。
そのため、翌営業日の寄り付きで価格がギャップアップして始まる可能性があり、「寄り付きで注文してもすでに高値」というリスクもあります。

個人投資家が戦える“唯一”の時間帯とは?

PTS市場の特徴とメリット・デメリット

PTS(私設取引システム)は、夜間や早朝も取引できる市場で、個人投資家がアルゴリズムに対抗できる“唯一”の時間帯といわれています。

ただ、正直に言うと昔の僕はPTSの板の薄さや流動性の低さにガッカリして、「なぁんだ、これじゃ使えないな…」と思っていました(笑)。

しかし、逆に板が薄いことで大口投資家やアルゴが入りにくく、小回りの利く個人投資家にはチャンスも生まれます。

夜間のPTSを上手に活用すれば、翌日のザラ場開始前に有利なポジションを取ることも可能です。

夜間・早朝取引の活用法

PTSの取引時間は、一般の市場取引時間外に設定されているため、ニュースが市場終了後に出た場合でも、その情報をもとに取引ができます。
これにより、翌日の寄り付き前に有利なポジションを築くことが可能になるのです。

PTS取引の注意点とリスク

流動性の低さとスプレッドの広さ

PTSは取引参加者が少ないため、流動性が低く、スプレッド(買値と売値の差)が広いことがあります。
これにより、思った価格で売買できないリスクがあるため、注意が必要です。


大口投資家やアルゴリズムの先回りリスク

また、大口の機関投資家や高速アルゴリズムもPTSに参加しており、先回りされる可能性があります。
完璧に「勝てる」わけではないことを理解したうえで活用することが重要です。

僕が実践する情報収集法:TDnetから特定キーワード抽出&SBI APIの活用

TDnetのキーワード抽出仕組み

TDnet(適時開示情報伝達システム)とは?

TDnetは「適時開示情報伝達システム」の略で、上場企業が株主や投資家に対して重要な情報(決算発表、業績修正、M&Aなど)を公表するための公式な情報開示システムです。
この情報は金融庁や証券取引所のルールに基づいて公開されており、個人投資家も無料で閲覧できます。

詳しくは公式サイトをご覧ください。
TDnet公式サイト(日本取引所グループ)

TDnetから特定キーワードを抽出する方法

※この記事で紹介する方法は、Windowsパソコン向けです。
僕自身がMacを使ったことがないので、Macでの動作や手順についてはごめんなさい、わかりません…!

H3:TDnetから特定キーワードを抽出する6つのステップ(全体概要)

  1. Pythonをインストールする
  2. VS Codeをインストールする
  3. Pythonの動作確認
  4. 必要なライブラリのインストール
  5. ニュース抽出プログラムの作成
  6. ダッシュボードで表示・管理

🔧 ステップ1:Pythonをインストールしよう

TDnetの情報抽出プログラムを動かすには、まずPythonというプログラミング言語を使える環境を整える必要があります。
Windowsパソコンでは標準で入っていないことが多いので、以下の手順でインストールします。


🟢 手順
  1. Python公式サイト(https://www.python.org/downloads/)にアクセス
  2. ページ上部に表示されている「Download Python ◯.◯.◯」のボタンをクリック(◯にはバージョン番号が入ります)
  3. インストーラーを実行
  4. インストール画面で必ず「Add Python to PATH」にチェックを入れる
  5. 「Install Now」をクリックしてインストール

💡 ワンポイント補足

✅ PATHを追加するチェックを忘れると、後でコマンドプロンプトから python を実行できずに詰まります…
僕も最初それでハマりました(笑)

🔧 ステップ2:VS Codeをインストールしよう

Pythonのコードを書くには、エディタ(=プログラムを書くためのソフト)が必要です。
ここでは、無料かつ多機能で初心者にも人気の高い Visual Studio Code(VS Code) を使います。

🟢 手順

  1. VS Code公式サイト(https://code.visualstudio.com/)にアクセス
  2. 「Download for Windows」をクリックしてインストーラーをダウンロード
  3. ダウンロードした .exe ファイルを開いてインストール開始
  4. インストール中は特別な設定は不要ですが、以下にチェックを入れておくと便利です:
    • ✅ 「Add to PATH(環境変数に追加)」
    • ✅ 「デスクトップにアイコンを作成」
    • ✅ 「エクスプローラーの右クリックメニューに追加」など(お好みで)
  5. 「インストール」をクリックして完了!

🧩 Python拡張機能を入れる

VS Codeを初めて起動すると、「Python拡張機能をインストールしますか?」と聞かれることがあります。
その場合は**「インストールする」をクリック**してください。

聞かれない場合は以下の手順で手動で追加できます:

  1. 左側のブロックアイコン(拡張機能)をクリック
  2. 検索窓に「Python」と入力
  3. Microsoft公式の「Python」拡張機能をインストール

💡 よくあるつまずきポイント

❌ VS Codeを入れただけではPythonは動きません。
⛑ 必ず「Python本体」もステップ1でインストールしておいてくださいね。


ここまでできれば、もうPythonコードを書く準備は整っています!

🔧 ステップ3:Pythonの動作確認をしよう

ここでは、Pythonが正しくインストールされているか、またVS Codeで使える状態かを確認します。
最初にやっておくことで、後で「動かない…」と焦るのを防げます。


🟢 動作確認その1:コマンドプロンプトで確認

  1. キーボードで Windowsキー + R を押して「ファイル名を指定して実行」を開く
  2. cmd と入力して Enter(コマンドプロンプトが開きます)
  3. 以下のコマンドを入力:
python --version

✅ 正しくインストールされていれば、次のようにPythonのバージョンが表示されます:

Python 3.13.5

🟢 動作確認その2:VS CodeでPythonスクリプトを実行してみる

  1. VS Codeを起動し、新しいファイルを作成(例:test.py
  2. 以下のようなテストコードを入力:
print("Hello, Python!")
  1. 右上の ▶︎(再生ボタン)をクリック、または Ctrl + F5 で実行

✅ ターミナルに「Hello, Python!」と表示されれば成功!


💡 補足:もしPythonが動かない場合…

  • コマンドが通らない場合は、ステップ1で「PATHを通す」のチェックを忘れている可能性があります
  • VS CodeでPythonが選ばれていない場合は、ウィンドウ右下にある「Pythonインタープリター」をクリックして、使いたいPythonを選び直してみてください

このステップがクリアできれば、いよいよキーワード抽出の準備が整ってきました!

🔧 ステップ4:必要なPythonライブラリをインストールしよう

Python本体を入れただけでは、TDnetのデータ取得やHTML解析などはできません。
ここでは、情報収集に必要なライブラリ(部品)をインストールして、プログラムを動かす準備を整えます。

✅ 今回使うライブラリ

ライブラリ名用途
requestsWebサイトにアクセスしてデータ取得
beautifulsoup4HTMLやXMLから情報を抽出する
pandas表形式のデータを扱う(CSVなど)

🟢 インストール手順

  1. コマンドプロンプトを開く(Windowsキー + R → cmd
  2. 以下のコマンドを1行ずつ実行:
pip install requests
pip install beautifulsoup4
pip install pandas

✅ すべて「Successfully installed ○○○」のように表示されればOK!


💡 補足:pipが使えない場合

  • pip は内部コマンドとして認識されていません」と表示された場合は、PythonのPATHが通っていない可能性があります
  • その場合は、Pythonの再インストールか「環境変数の編集」が必要になります(※初心者には少しハードルが高いかもなので、再インストールがラク)

✅ インストール済みのライブラリを確認するコマンド

pip list

上記を実行すると、インストールされているライブラリ一覧が表示されます。


これでPythonプログラムを動かすための“部品”は揃いました!

🔧 ステップ5:TDnetのキーワード抽出プログラムを作ろう

~フォルダ作成からサンプルコードの実行まで~

🗂 ① 作業用フォルダを作ろう

まずは、プログラムを保存するフォルダを用意します。

手順:

デスクトップなど好きな場所で右クリック

  1. 「新規作成」→「フォルダー」を選択
  2. フォルダー名は tdnet_project など、わかりやすい名前にしておくと便利です
💻 ② VS Codeでフォルダを開こう
  1. VS Codeを起動
  2. メニューから「ファイル」→「フォルダーを開く」
  3. 先ほど作った tdnet_project フォルダを選ぶ

✅ 左側にフォルダ名が表示されればOK!

📄 ③ 新しいPythonファイルを作成しよう
  1. 左上の「新しいファイル」ボタン(📄)をクリック
  2. ファイル名を main.py にして保存
  3. そのファイルにこれから紹介するコードを貼り付けます

💡 .py 拡張子を忘れずに!

🧪 ④ サンプルコードを貼り付けよう

以下は「TDnetのWebページから材料ニュースを取得し、キーワードでフィルタリングする」サンプルコードです👇

import requests
from bs4 import BeautifulSoup
import json

# キーワードの一覧(お好みでカスタマイズ可能)
keywords = ["自己株式", "業績修正", "M&A", "株式分割", "TOB"]

# TDnetのページURL
url = "https://www.release.tdnet.info/inbs/I_main_00.html"

res = requests.get(url)
res.encoding = res.apparent_encoding
soup = BeautifulSoup(res.text, "html.parser")

rows = soup.find_all("tr")

data = []

for row in rows:
    cols = row.find_all("td")
    if len(cols) < 3:
        continue

    time = cols[0].get_text(strip=True)
    company = cols[1].get_text(strip=True)
    title = cols[2].get_text(strip=True)

    for kw in keywords:
        if kw in title:
            print(f"{time} | {company} | {title} | キーワード: {kw}")
            data.append({
                "time": time,
                "company": company,
                "title": title,
                "keyword": kw,
                "action": "ヒット"
            })
            break

# データをJSONファイルとして保存
with open("data.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

📝 補足:このコードについて

※このコードはサンプル用です。
本番運用では、HTML構造の変更や通信エラー、データの整形・保存形式などを考慮した改良が必要になります。
僕自身も、自動化・通知連携などを行っていますが、今回はあくまで「再現できる体験」に絞って紹介しています

▶ 実行してみよう!

  1. main.py を開いた状態で、右上の ▶ ボタンをクリック
  2. ターミナルに「キーワードにヒットしたニュース」が表示され、同時に data.json というファイルが作成されていれば成功です!

💡 ワンポイント

  • data.json ファイルは、次のステップで表示用ダッシュボードに使います
  • 出力されたJSONファイルをメモ帳で開くと、キーワードにヒットしたニュース一覧が保存されています

🌐 ステップ6:HTMLダッシュボードで抽出結果を表示しよう

Pythonで集めたデータは、見やすく表示してこそ価値が出るもの。
ここでは、data.json をHTML+JavaScriptで読み込み、きれいにテーブル表示する「材料速報ダッシュボード」を作っていきます。

📁 フォルダ構成の準備

まず、作業フォルダ(例:tdnet_projectフォルダ)の中に以下のようなファイルを用意します。

cssコピーする編集するtdnet_project/
├─ main.py
├─ data.json ← Pythonが出力
└─ dashboard.html ← これから作るHTMLファイル
📄 dashboard.html の中身

以下のコードを新しく作った dashboard.html にコピペしてみてください👇

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8" />
  <title>材料速報ダッシュボード</title>
  <style>
    body { font-family: sans-serif; padding: 20px; }
    h1 { color: #0066cc; }
    table { border-collapse: collapse; width: 100%; }
    th, td { border: 1px solid #ccc; padding: 8px; text-align: left; }
    th { background-color: #f0f0f0; }
  </style>
</head>
<body>
  <h1>材料速報ダッシュボード</h1>
  <p id="last-updated" style="color: #666; font-size: 0.9em;">最終更新: --:--:--</p>
  <p id="next-update" style="color: #999; font-size: 0.9em;">次の更新まで: 60 秒</p>

  <table id="material-table">
    <thead>
      <tr>
        <th>日時</th>
        <th>会社名</th>
        <th>タイトル</th>
        <th>キーワード</th>
        <th>判定</th>
      </tr>
    </thead>
    <tbody></tbody>
  </table>

  <script>
    let countdown = 60;

    function updateCountdownDisplay() {
      document.getElementById("next-update").textContent =
        "次の更新まで: " + countdown + " 秒";
    }

    function loadData() {
      const now = new Date();
      document.getElementById("last-updated").textContent =
        "最終更新: " + now.toLocaleTimeString();

      // キャッシュ対策としてクエリ付きでリクエスト
      fetch("data.json?" + now.getTime())
        .then(response => response.json())
        .then(data => {
          const tbody = document.querySelector("#material-table tbody");
          tbody.innerHTML = ""; // テーブル初期化

          if (data.length === 0) {
            const tr = document.createElement("tr");
            tr.innerHTML = `<td colspan="5" style="text-align:center; color:#888;">
              本日はキーワードに該当する材料が見つかりませんでした。
            </td>`;
            tbody.appendChild(tr);
          } else {
            data.forEach(item => {
              const tr = document.createElement("tr");
              tr.innerHTML = `<td>${item.time}</td>
                              <td>${item.company}</td>
                              <td>${item.title}</td>
                              <td>${item.keyword}</td>
                              <td>${item.action}</td>`;
              tbody.appendChild(tr);
            });
          }

          countdown = 60;
        })
        .catch(err => console.error("Error loading data.json:", err));
    }

    // 初期化
    loadData();
    updateCountdownDisplay();

    // 1秒ごとにカウントダウン
    setInterval(() => {
      countdown--;
      if (countdown <= 0) loadData();
      updateCountdownDisplay();
    }, 1000);
  </script>
</body>
</html>
🧪 dashboard.htmlを開いてみよう(※Live Serverで開こう!)

dashboard.htmlを表示するには、まずキーワード抽出プログラム(main.py)を実行して、表示用データファイル(data.json)を作っておく必要があります。

main.py を実行する方法(初心者向け手順)

Visual Studio Code で main.py を開いていることを確認

右上にある「▶ 実行」ボタン(緑色)をクリック

画面下のターミナルに実行結果が表示されます
 (キーワードにヒットしたニュースがあれば、そこに表示されます)

💡 data.json が正しく生成されたか確認するには?

main.py と同じフォルダ(例:tdnet_project/)に data.json というファイルが新しくできていればOK!

VS Code のサイドバーからファイル一覧を見れば、data.json が追加されたのが確認できます

data.json を開けば、ニュース情報がJSON形式で保存されているのが分かります

⚠️ キーワードに該当するニュースがない場合、data.json には空の配列 [] が保存されます。それでも問題ありません!

⛳ 補足:何も表示されないときは…

TDnetに開示がなかった日や、キーワードに合致する開示がなかっただけかもしれません

動作確認をしたい場合は、main.py の中のキーワードを "株" などに変更して実行してみると結果が出やすくなります!

続いて、HTMLファイル(dashboard.html)をブラウザで開いて内容を確認します

✅ 正しい手順(Live Serverを使って表示)
  1. VS Code で dashboard.html を開く
  2. サイドバーでdashboard.htmlを右クリックし、「Open with Live Server」 を選択
  3. ブラウザが自動で起動し、http://127.0.0.1:5500/(または類似のURL)でページが表示されます。
    ※ポート番号(5500の部分)は環境によって 5501 などに変わることがありますが問題ありません。

📋 期待される表示内容

  • テーブル形式で「日時」「会社名」「タイトル」「キーワード」「判定」が一覧表示される
  • キーワードに該当する開示がない日は、
     「本日はキーワードに該当する材料が見つかりませんでした。」と表示される

💡 Live Serverがない場合

「Open with Live Server」が表示されない場合は、拡張機能の「Live Server」をインストールしてください。

  1. 左の拡張機能(四角アイコン)をクリック
  2. 検索欄に「Live Server」と入力
  3. 「Live Server – by Ritwick Dey」をインストール
  4. インストール後、右クリックメニューに追加されます!

この記事のまとめ

株式市場では、アルゴリズム取引が一瞬で情報に反応するため、個人投資家がザラ場中に勝つのはほぼ不可能

ただし、**TDnetの開示が多く出る「15時以降(場が引けた後)」**は、アルゴが動かない時間帯

この時間にいち早く情報を取得し、夜間のPTSや寄り付きに備えることが、個人に残された“唯一のチャンス”

本記事では、そのチャンスを活かすための情報取得ツールとして
 **「TDnet×Python×HTMLで作る材料ニュースダッシュボード」**の作り方をステップ形式で解説しました

難しそうに見えるかもしれませんが、仕組みは意外とシンプルで、再現可能な内容になっています!

🛠 僕が実践している情報収集法を、なんとかブログでわかりやすく伝えたいと思ったのですが……
Pythonのインストールやプログラムの仕組みを、誰にでもわかるように説明するのは、正直ちょっと無理がありました(;^ω^)

きっと、Pythonどころか「コマンドプロンプトって何?」というところでつまずく人も多いんじゃないかなと思って、あれこれ詰め込んでいくうちに、逆にごちゃごちゃした内容になってしまったかもしれません

それでも「こういうことができるんだ」と感じてもらえたなら嬉しいですし、
興味のある方は、ぜひ気軽にトライしてみてください😊

スポンサーリンク

コメント