2025年6月末から7月、stock-swing-signal-bot を本格運用に近い形まで持っていった。TOPIX 500 銘柄の日次スイングシグナル生成。週ごと(Week 0〜3)に区切って積み上げた。

パイプライン

TypeScript と Python を用途で混ぜている。

  1. ETL — Yahoo Finance から OHLCV を取得(src/etl/price_download.ts)、Parquet で保存
  2. 特徴量 — RSI、ボリンジャーバンド、SMA など(technical_features.ts)。ファンダ解析やニュースセンチメント(Python)も実験
  3. 推論 — ルールベース + 学習モデル
  4. ペーパートレードpaper_trading_log.json でシグナルを検証

BUY シグナルの例

RSI(14) < 30 かつ 価格 < BB 下限   → 信頼度 70%+(売られすぎ)
SMA(5) > SMA(20) かつ RSI < 50      → ゴールデンクロス

TRADING_RULES.md にルールを言語化して、コードと文書を一致させるようにした。

アーキテクチャ変更(ここが本題)

最初は週ごとにモデルを進めて、Week 2 でベースライン LSTM + バックテスト、Week 3 で多モーダルの TFT モデルまで作って、推論を Cloudflare Workers に載せていた。

でも、これが Workers と相性が悪かった。Workers の CPU 時間の制限に、モデル推論が普通に引っかかる。結局 Cloudflare Workers関連のファイルを削除 というコミットで、ONNX のローカル推論に移した。重い推論はエッジに置くものじゃない、というのを身をもって学んだ。

学び

個人の quant bot は、モデルより データパイプラインの安定が9割。ETL がコケると後段が全部死ぬので、Parquet 保存や NaN の処理みたいな地味な整合性のところに一番時間をかけた。「重い推論 = ローカル / VPS、軽い処理 = エッジ」という線引きが、ここでようやく自分の中で固まった。

おわり

当てに行くより、パイプラインを毎日安定して回す方が難しい、という当たり前の結論。シグナルの精度はこれからだけど、運用の骨格は作れた。次は ETL の監視と、モデル更新の自動化に手を入れたい。