はじめに ── なぜエンジニアが株価サイトを作ろうと思ったのか
「この株価サイト、なんでこんなに使いにくいんだろう」
きっかけは、そんな素朴な苛立ちだった。
証券会社のアプリは情報が多すぎて目が滑る。無料の情報サイトは広告だらけで読み込みが遅い。会員登録しないとチャートすら見られないサービスもある。欲しいのは、自分が保有している銘柄と気になる銘柄の値動きを、ぱっと見て把握できるシンプルなダッシュボードだった。
「ないなら作ればいい」
エンジニアにとってこれほど危険な言葉はない。この一言が、半年以上に及ぶ開発の始まりだった。
今振り返れば、「株価データを取得して表示するだけでしょ」と思っていた当時の自分を殴りたい。データ取得の壁、技術選定の失敗、AI予測精度の残酷な現実。すべてが想像を超えていた。
この記事では、1人のエンジニアがAI株価予測サイトを作り上げるまでの過程を、失敗も含めてすべて書き残しておく。これから同じようなプロジェクトに挑もうとしている人の参考になれば、あるいは「やめておこう」という判断材料になれば幸いだ。
技術選定の迷走 ── 3回やり直した話
1回目:React + Firebase(挫折)
最初に思い描いたのは、ReactでリッチなSPA(Single Page Application)を作り、Firebaseでバックエンドを構築する王道パターンだった。リアルタイムでチャートがヌルヌル動く、かっこいいダッシュボード。
実際に作り始めてすぐ壁にぶつかった。Firebaseの従量課金だ。株価データは1日に何千回もAPIを叩いて更新する必要がある。105銘柄のデータを5分間隔で取得したら、月額いくらになるか。試算して青ざめた。
個人開発でランニングコストが月数千円を超えるのは致命的だ。収益化のあてもない段階で、固定費を抱えるわけにはいかない。1週間で方針転換を決めた。
2回目:Next.js + Vercel(中途半端)
次に試したのがNext.jsとVercelの組み合わせ。SSG(Static Site Generation)で事前にページを生成しておけば、サーバーコストを抑えつつ高速なサイトが作れる。ISR(Incremental Static Regeneration)を使えば、定期的にデータを更新することもできる。
これは悪くなかった。だが、Vercelの無料枠にはビルド時間の制限がある。105銘柄分のデータを取得してページを生成すると、ビルドに10分以上かかることがあり、無料枠を圧迫した。結局、ここでも「コスト」という壁に阻まれた。
3回目:Hugo + Python + Chart.js(現在)
最終的にたどり着いたのが、今の構成だ。
- Hugo(静的サイトジェネレーター)でHTMLを生成
- Python + yfinanceで株価データをJSONに変換
- Chart.jsでブラウザ上にチャートを描画
- GitHub Pagesで無料ホスティング
サーバーレス。ランニングコストはドメイン代の年間数千円のみ。ビルドもHugoなら数百ミリ秒で完了する。
「3回目の正直」だったが、この構成にもトレードオフがある。静的サイトなので、リアルタイム更新はできない。データを更新するたびにビルドし直す必要がある。それでも、「まず動くものを作る」ことを最優先にすると腹を括った。
技術選定に2ヶ月を溶かした。この時間は無駄だったのか? 今となっては、必要な回り道だったと思う。最初からHugoを選んでいたら、「なぜReactやNext.jsを使わなかったのか」という疑問がずっと残っただろう。実際に触って、自分の条件に合わないと体感したからこそ、今の構成に自信を持てている。
yfinanceとの格闘 ── 無料APIの限界を知る
データ取得にはPythonのyfinanceライブラリを使っている。Yahoo FinanceのAPIを手軽に叩ける、個人開発者の強い味方だ。
import yfinance as yf
# トヨタ自動車の株価を取得
ticker = yf.Ticker("7203.T")
hist = ticker.history(period="1mo")
たった3行で1ヶ月分の株価データが取れる。最初は「なんて便利なんだ」と感動した。
だが、使い込むほどに壁が見えてきた。
壁1:リアルタイムデータが取れない
yfinanceで取得できるデータには、15〜20分の遅延がある。「今この瞬間の株価」は取れない。株価サイトとしてはかなり痛い制約だ。
ユーザーが場中(取引時間中)にサイトを開いても、表示されるのは20分前の価格。証券会社の公式アプリにはどうやっても勝てない。これはもう、諦めるしかなかった。
ただし逆に言えば、場が閉まった後のデータ分析や振り返りには十分使える。「リアルタイムの株価チェック」ではなく、「1日の終わりに市場を振り返るダッシュボード」に用途を絞ることで、この制約と折り合いをつけた。
壁2:全市場のランキングが取れない
東証には約3,800銘柄が上場している。値上がり率TOP10、値下がり率TOP10、出来高急増銘柄……。こういったランキングを出したかった。
ところがyfinanceには「全銘柄のデータを一括取得する」APIがない。1銘柄ずつ個別にリクエストを投げる必要がある。3,800銘柄を全部取得しようとすると、APIのレート制限に引っかかるし、時間もかかりすぎる。
結局、主要な105銘柄に絞ることにした。日経平均の主要構成銘柄を中心に、時価総額上位やセクター代表銘柄を手作業で選定した。
「全銘柄対応」を謳えないのは正直悔しい。しかしこれも現実との折り合いだ。個人開発で完璧を目指すと永遠にリリースできない。
壁3:データの欠損と不整合
これが一番厄介だった。
5分間隔のイントラデイデータ(1日チャート用)は、取得タイミングによって歯抜けになることがある。朝9時のデータが欠けていたり、11時台がまるごと飛んでいたり。チャートを描画すると、謎の空白が現れる。
最初は自分のコードのバグだと思って何時間もデバッグした。原因はyfinance側のデータ供給の不安定さだった。
結局、データ欠損を前提とした防御的なコードを書くことで対処した。欠損があっても前後のデータで補間する、チャートが崩れないように空データを適切にスキップする。地味だが、こういった「見えない部分」の作り込みに一番時間がかかった。
AI予測の現実 ── 精度52%が突きつけたもの
サイト名に「AI予測」を入れた以上、予測機能は看板だ。
実装したのは4手法のアンサンブル予測。移動平均のクロスオーバー、RSI(相対力指数)、MACD(移動平均収束拡散法)、そしてscikit-learnで構築した機械学習モデル。4つの予測を統合して、翌日の株価が「上がるか下がるか」を判定する。
開発中は楽観的だった。「4つも組み合わせるんだから、そこそこ当たるだろう」と。
結果、予測精度は約52%。 コイン投げとほとんど変わらない数字だ。
この数字を初めて見た夜、しばらくモニターの前で固まっていた。何週間もかけてパラメータを調整し、特徴量エンジニアリングを試行錯誤した結果がこれか。
だが、冷静に文献を調べてみると、短期の株価方向予測で安定して60%を超えるのは、機関投資家の高度なクオンツチームでも簡単ではないらしい。ユージン・ファーマの効率的市場仮説、バートン・マルキールの「ウォール街のランダム・ウォーカー」。学術的にも、短期の株価変動は本質的に予測が難しいとされている。
つまり52%は「失敗」ではなく、ある意味「正しい結果」だった。
ここで大きな方針転換をした。「当たる予測を出す」のではなく、「予測の根拠を透明にする」方向に舵を切った。AIが出した予測値に加えて、どのテクニカル指標がどう判断したのか、過去の予測精度はどうだったのかをすべて公開する。
ダッシュボードのAI予測セクションを見てもらえれば、この思想が伝わると思う。「AIが上がると言っているから買う」のではなく、「AIはこう判断しているが、自分はどう思うか」を考えるための道具。それが今のスタンスだ。
お金の話 ── 運用コストと収益化の現実
個人開発で避けて通れないのがお金の問題だ。
運用コスト:ほぼゼロ
現在の月額運用コストは以下の通り。
| 項目 | 月額 |
|---|---|
| GitHub Pages ホスティング | 0円 |
| yfinance API利用 | 0円 |
| ドメイン代(stock-kabu3.com) | 約100円 |
| 合計 | 約100円 |
これがHugo + GitHub Pagesを選んだ最大の理由だ。ReactやNext.jsでサーバーを立てていたら、少なくとも月1,000〜3,000円はかかっていただろう。
収益化:道半ば
正直に書くと、現時点ではほぼ収益は出ていない。Google AdSenseの審査は通ったが、まだアクセス数が少ない。投資関連のアフィリエイトも検討中だが、「本当に良いと思えるもの」しか紹介したくないので、慎重に選んでいる。
ただ、ランニングコストが月100円なので、赤字のプレッシャーはほとんどない。これが個人開発×静的サイトの強みだ。収益化を急がなくていい。コンテンツをじっくり育てて、自然にアクセスが増えるのを待つ余裕がある。
うまくいったこと ── 作ってよかったと思える瞬間
苦労話ばかり書いてきたが、ちゃんと成果もある。そして正直、成果の方がずっと大きい。
105銘柄のダッシュボード がまず一番の成果だ。トップページを開けば、主要銘柄の株価・変動率・ミニチャートが一覧できる。広告まみれの既存サイトとは段違いにシンプルで軽い。一番使っているのは、他でもない自分自身だ。毎朝の市場チェックがこれ1つで完結する。
期間別ランキングも気に入っている。デイリー・ウィークリー・マンスリーをタブで切り替えられる。ストップ高/ストップ安の自動検出、年初来高値/安値の更新銘柄の抽出。これらが全自動で更新される仕組みを作れたのは、エンジニアとしてやりがいがあった。
銘柄詳細ページ では、個別銘柄ごとにチャートとAI予測結果をまとめている。Hugoのテンプレート機能とPythonスクリプトで、105銘柄分のページを一括生成。1つ修正すれば全銘柄に反映される仕組みは、個人運用では必須だ。
半年間で学んだ3つのこと
1. 完璧を捨てた瞬間、プロジェクトが動き出す
全銘柄対応、リアルタイム更新、高精度AI予測。最初に夢見た理想の姿を全部実現しようとしていたら、このサイトは今も存在していない。
105銘柄、20分遅延、精度52%。客観的に見ればツッコミどころだらけだ。でも「不完全でもリリースして改善する」ことを選んだからこそ、実際に動くサイトがここにある。
個人開発における最大の敵は、技術的な難しさではなく「リリースできない自分」だった。
2. 制約は創造の母
「静的サイトだからリアルタイム更新ができない」「無料APIだから全銘柄取れない」「予測精度が52%しかない」
すべてが制約だ。でも制約があるからこそ、「じゃあ何ができるか」を真剣に考える。リアルタイムが無理なら、引け後の振り返りダッシュボードに特化する。全銘柄が無理なら、主要銘柄を厳選してカバーする。精度が低いなら、判断根拠を透明にする。
制約がなかったら、たぶん何でもできる中途半端なサイトになっていただろう。制約が、このサイトの個性を作ってくれた。
3. 株式市場は最高の先生
何より、このプロジェクトを通じて投資リテラシーが爆上がりした。テクニカル指標の意味をコードで実装することで理解し、予測モデルを作ることで市場の不確実性を体感した。
PER、PBR、RSI、MACDの全部が、教科書を読むより自分で実装する方が何十倍も早く理解できた。「学ぶ最良の方法は、作ること」。これはプログラミングだけでなく、投資の勉強にも当てはまる。
おわりに ── これからの話
このサイトはまだまだ発展途上だ。
直近では週間マーケットレビューの自動生成を始めた。主要4指数の週間推移と、AI予測の答え合わせを毎週記事にする。当たったのか外れたのか、包み隠さず公開していく。
もっと先の話をすれば、セクター分析の機能追加、予測モデルへのファンダメンタルズデータの組み込み、そしていつかは銘柄スクリーニング機能の実装。やりたいことリストは無限に長い。
でも、それでいい。個人開発は「完成」がないからこそ続けられる。自分が使うものを、自分のペースで改善し続ける。その過程そのものが楽しい。
もし興味があれば、ダッシュボードを覗いてみてほしい。105銘柄の最新データと、当たるかどうかわからないAI予測があなたを待っている。
※ 当サイトで提供する情報は投資助言ではありません。すべての投資判断はご自身の責任においてお願いいたします。株式投資にはリスクが伴い、元本保証はありません。