2025年6月末から7月、stock-swing-signal-bot を本格運用に近い形まで持っていった。TOPIX 500 銘柄の日次スイングシグナル生成。週ごと(Week 0〜3)に区切って積み上げた。
パイプライン
TypeScript と Python を用途で混ぜている。
- ETL — Yahoo Finance から OHLCV を取得(
src/etl/price_download.ts)、Parquet で保存 - 特徴量 — RSI、ボリンジャーバンド、SMA など(
technical_features.ts)。ファンダ解析やニュースセンチメント(Python)も実験 - 推論 — ルールベース + 学習モデル
- ペーパートレード —
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 の監視と、モデル更新の自動化に手を入れたい。