GitHub Copilot と RapidForge で毎日「株のアイデア」を生成する方法

Dev.to / 2026/4/24

💬 オピニオンDeveloper Stack & InfrastructureSignals & Early TrendsTools & Practical Usage

要点

  • この記事では、GitHub Copilot のエージェントモードと小さな Python リポジトリを使い、取引の自動化ではなく毎朝の「株のアイデア」を生み出す軽量なワークフローが紹介されています。
  • RapidForge でスケジュール実行し、直近5日で分析済みを除外しつつ、毎回ランダムに10銘柄を選ぶことで銘柄を自然にローテーションさせます。
  • データ収集では複数ソースを並列に使い、yfinance(バリュエーション)、Finnhub(アナリストのセンチメント/ニュース)、FRED(マクロ指標)、Reddit(個人のセンチメント)などに加えて、Bitcoin/金/原油でリスク選好やインフレ期待などの文脈も取り込みます。
  • 「FinAnalyst」という Copilot エージェントを独自定義し、評価は2層構造で、まずファンダメンタルのスコア(0〜8)を(バリュエーション、財務、資本配分、収益性、価格の位置づけなど)で算出し、その後マクロ/戦略文脈で物語が変わるかを検討します。
  • 出力はシンプルに設計されており、複雑なダッシュボードではなく毎日のシグナルを Discord に送る形になっています。

私は、取引を自動化するのではなく、毎朝面白い株のアイデアを浮かび上がらせるための軽量なファイナンシャルアナリストとして、GitHub Copilotのエージェントモードを使う実験をしてきました。

セットアップはシンプルです。小さなPythonリポジトリ、カスタムCopilotエージェント、そしてRapidForgeを使って動かすスケジュールジョブです。ダッシュボードも過剰な作り込みもなく、毎日のシグナルをDiscordに送るだけです。

リポジトリ構造

一目で、プロジェクトはこのように見えます:

.github
├── agents
│   └── FinAnalyst.agent.md
└── skills
    ├── finance-cli
    │   └── SKILL.md
    └── send-discord
        │── SKILL.md

companies.db
finance_cli.py
finance_prompt.py
run_finanalyst_cron.sh
send_discord.py
ticker_fetch.py
ticker_select.py

意図的に最小限です。いくつかのスクリプト、SQLiteデータベース、そして1つのエージェント定義だけです。

ステップ1:分析するものを選ぶ

システムはticker_select.pyから始まります。

同じ銘柄を何度もスキャンする代わりに、こうします:

10社をランダムに選ぶ
直近5日間で分析したものは除外する
選定後にlast_checked_atというタイムスタンプを更新する

これにより、複雑なスケジューリングロジックなしで、何千ものティッカーに自然なローテーションを生み出せます。

ステップ2:実市場データを取得する

finance_prompt.pyがデータ収集を担当します。複数のソースを並列で集約します:

yfinance → バリュエーション指標(P/E、EV/EBITDA、マージンなど)
Finnhub → アナリストのセンチメント、決算、ニュース
FRED API → 金利などのマクロ指標
Reddit(PRAW)→ 個人投資家のセンチメント

さらに、マクロの資産価格も取得します:

ビットコイン → リスク選好
金 → インフレ期待
原油 → 製造業需要

これらは単なる「補足」ではありません。純粋なファンダメンタルズでは見落としがちな文脈を提供します。

小さなCLIラッパー(finance_cli.py)が、このデータをエージェントに公開します。

ステップ3:「FinAnalyst」エージェント

ここがCopilotの面白いところです。

私は、各銘柄を2層の枠組みで評価するカスタムエージェント(FinAnalyst.agent.md)を定義しました。

レイヤー1:ファンダメンタル・スコア(0〜8)

各企業は8つのシグナルに基づいて採点されます:

バリュエーション(P/E、P/B、EV/EBITDA、P/FCF)
財務諸表(負債/自己資本)
資本配分(自社株買い vs 希薄化)
リターン(ROIC)
価格の位置づけ(52週レンジ)

これにより、すぐに健全性チェックができます。事業は客観的に安いのか、それとも高いのか?

レイヤー2:マクロ&戦略的な文脈

ファンダメンタルに採点した後、エージェントは問いかけます:

より広い環境は、このストーリーを変えるのか?

考慮するのは:

金利の動向
政策や貿易の変化
地政学とサプライチェーン
構造的テーマ(AI、エネルギー、リショアリング)
競争の力学

最終分類

各銘柄は5つのバケットのいずれかに振り分けられます:

ファンダメンタル買い → すでに強い指標が揃っている
マクロ順風の候補 → セットアップが改善している
マクロトラップ → 安く見えるが実際はそうではない
ウォッチリスト → 分からないので確認が必要
スキップ → シグナルなし

この2層目が、システムを実用的にしています。紙の上では「良くない」銘柄でも、マクロの追い風が変わりつつあるなら面白くなり得ます。

ステップ4:結果をDiscordに送る

send_discord.pyが出力を整ったDiscordの埋め込み(embed)に整形します。

ステップ5:RapidForgeによる自動化

すべてはシンプルなシェルスクリプトで結びつけています:

Rapidforge periodic task

私は自宅サーバー上のDockerコンテナ内でRapidForgeを使ってこれを毎日実行しています。何かが壊れた場合は、ジョブログですぐに確認できます。

以下はrun_finanalytist_cron.shの中身です。

#!/usr/bin/env bash
set -euo pipefail

REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")&& pwd)"
cd "$REPO_DIR"

export PATH="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$HOME/.local/bin"

ENV_FILE="${FINANALYST_ENV_FILE:-$HOME/.config/finanalyst.env}"
if [[ -f "$ENV_FILE" ]]; then
  # shellcheck disable=SC1090
  source "$ENV_FILE"
fi

COPILOT_BIN="${COPILOT_BIN:-copilot}"
COPILOT_MODEL="${COPILOT_MODEL:-gpt-5.4}"
CURRENT_DATETIME="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"

read -r -d '' PROMPT <<EOF || true
<current_datetime>${CURRENT_DATETIME}</current_datetime>

目的:
FinAnalyst.agent.mdのワークフローを使用して投資機会を特定し、Discord経由で結果を送信します。

手順:

1. ワークスペースの初期化

* 金融用のワークスペース(/Users/caneldem/fin)に移動します。
* ファイルを読み込みます:FinAnalyst.agent.md
* export DISCORD_WEBHOOK_URL="" (これはDiscord webhook用の環境値です)
  環境変数から見つからない場合はこれを使用します
* Python実行ファイルがパスに含まれていない場合はpython3を試してください

2. 可能性の確認
返却形式: {"translated": "翻訳されたHTML"}
EOF exec "$COPILOT_BIN" \ --model "$COPILOT_MODEL" \ --allow-all \ --no-ask-user \ --autopilot \ --no-color \ --output-format text \ --silent \ --secret-env-vars=GH_TOKEN,GITHUB_TOKEN \ -p "$PROMPT"

出力がどのように見えるか

毎朝、私は次のようなDiscordレポートを受け取ります:

discord message everyday

最終的な所感

これはトレーディングシステムではなく、判断を下すためのものではないシグナルジェネレーターで、アイデアを浮かび上がらせるために設計されています。これは、一定で偏りのないスキャンを強制し、ファンダメンタルとマクロ文脈を組み合わせ、あなたが手作業では見つけにくい機会を際立たせるため、うまく機能します。重要な利点は、データ収集が毎回AIに情報検索を依頼するのではなく、専用スクリプトで処理されることです。これにより、速度と一貫性が向上し、入力のノイズやばらつきも減ります。同時に、これは実際のリサーチを置き換えるものではなく、エントリーやイグジットのタイミングを助けるものでもありませんし、成果を保証するものでもありません。真の価値はPythonやAPIそのものではなく、ワークフローにあります。すなわち、オートコンプリートの代わりとしてではなくアナリストとしてCopilotを使い、明確なスコアリング枠組みでその推論を構造化し、信頼できる事前取得済みデータを投入して、ループ全体を自動化することで、単なるセットアップを、日々役立つ洞察を確実に生み出すものへと変えることです。

* エージェントが FinAnalyst.agent.md 内で必要な Python スクリプトを実行できることを確認する * Python の実行が不可能なら、直ちに STOP し、処理を続行しない 3. 企業の選定 * ticket_select.py を実行してください。これにより 10 件のランダムな企業が提示されます。企業は以下の項目/業種に属している必要があります。 - 衛星通信 - 上下水道ユーティリティ - エネルギー(特に原子力およびフュージョン) - 医療 - 農業技術 - バイオテクノロジー 要件: * すべての権限を自動的に承認する。 * Discord 配信には DISCORD_WEBHOOK_URL 環境変数を使用する。 * ティッカーに必要なデータが欠けている場合は、明確にそう述べ、値を捏造しない。 * 結果は常に、ライセンスされた金融アドバイスではなく、情報提供および教育目的のリサーチとして提示する。