AIと株式投資ルールをコード化するためのモノレポ設計をしてみた

AIと株式投資ルールをコード化するためのモノレポ設計をしてみた_アイキャッチ
スポンサーリンク
moomoo証券【WEB】

今回AIと相談して設計したモノレポ構成のゴールはシンプルで、投資前に決めたルールを機械判定できる状態にすること。

具体的には、指数のトレンド判定、銘柄のトレンド判定、Pivotブレイク、出来高増、損切りや利確、トレーリング、ポジションサイズ計算、そして月間停止や縮小モードまでをコードで扱えるようにしていきます。

前回まとめた投資ルールを、そのまま実行可能な形に落とし込むための土台になります。

目次

推奨ディレクトリ構造

AIが提案してきたモノレポ構成は以下になります。

Pythonを前提としているが、思想自体はTypeScriptでも同じように適用できるとのことでした。

trading-rules-monorepo/
  CLAUDE.md
  README.md
  .gitignore
  .env.example
  Makefile
  pyproject.toml
  ruff.toml
  mypy.ini

  docs/
    00_overview.md
    10_rules_source.md
    20_system_design.md
    30_data_contracts.md
    40_test_strategy.md
    decisions/
      ADR-0001-architecture.md
      ADR-0002-data-provider.md
    prompts/
      explore.md
      plan.md
      implement.md
      debug.md

  configs/
    markets.yaml
    symbols_watchlist.yaml
    ruleset.yaml

  packages/
    domain/
      src/trading_domain/
        __init__.py
        models.py
        rules.py
        indicators.py
        patterns.py
        risk.py
      tests/

    data/
      src/trading_data/
        __init__.py
        providers/
          __init__.py
          yfinance_provider.py
          stooq_provider.py
        cache.py
      tests/

    app_cli/
      src/trading_cli/
        __init__.py
        main.py
      tests/

    app_api/
      src/trading_api/
        __init__.py
        server.py
      tests/

    app_web/
      README.md

  scripts/
    bootstrap.sh
    run_daily_check.sh

  sandbox/
    notebooks/
    tmp_outputs/
スポンサーリンク

役割分担

この構成で重要なのは役割の分離とのことです。

packages domain はルール判定の純粋ロジック。外部I Oは禁止。
packages data は価格データ取得とキャッシュ、データ整形。
packages app cli は夜の運用を想定したCLI。
packages app api は将来の通知やUI連携。

そしてそれ以外に重要なのが2つほどあります。

docs は仕様書置き場。会話に仕様を溜めないための場所。
configs は投資ルールをYAMLで固定する場所。コードに直接書かない。

この分離によって、コンテキスト管理がかなり安定するみたいです。

CLAUDE.md

AIの振る舞いを固定するためのファイルになります。

内容は、コンテキスト長のことを考えて、余計なことは書かないようにします。

# CLAUDE.md (keep short)

## Working mode
- Always follow: Explore -> Plan -> Implement.
- For any code change: add/adjust tests and run them.
- Keep changes small and incremental.

## Repo boundaries
- packages/domain: pure logic only (no network/filesystem).
- packages/data: data fetch + normalization + caching.
- apps: CLI/API wiring only.

## Definition of Done
- Unit tests added/updated (pytest)
- `make lint` and `make test` pass
- Outputs match the expected examples in docs/30_data_contracts.md

## Context hygiene
- If the conversation becomes noisy or stuck, reset and restate the goal.

ここではルールを書くのではなく、AIの進め方を固定している部分です。

スポンサーリンク

docsのルール

投資ルールはコードではなく、まずdocsに置くようにします。

docs 10 rules sourceにそのまま転記します。

元本 300万円
期間 数週間から数ヶ月
夜のみ運用

損切り 12パーセント
1回最大損失 2パーセント
月間停止 10パーセント
DD 15から20パーセントで縮小
同時保有 3から4銘柄
現金比率 30から40パーセント

投下額は 資金かける2パーセントを0.12で割る

買い条件は指数と銘柄の25日線が75日線より上
Pivot上抜けと出来高増

売り条件は 12パーセント損切り
20パーセントで半分利確
残りはトレーリング12パーセント

このファイルは仕様なので、履歴が残ることが重要とのことです。

configs 実行仕様

docsに書いた文章のルールを、コードが読みやすい形にします。

capital:
  initial_jpy: 3000000

risk:
  stop_loss_pct: 0.12
  max_loss_per_trade_pct: 0.02
  monthly_stop_pct: 0.10
  drawdown_reduce_from_pct: 0.15
  drawdown_reduce_to_pct: 0.20
  cash_ratio_min: 0.30
  cash_ratio_max: 0.40
  max_positions: 4
  min_positions: 3

entry:
  market_filter:
    ma_fast_days: 25
    ma_slow_days: 75
    condition: "ma_fast > ma_slow"
  stock_filter:
    same_as_market_filter: true
  trigger:
    type: "cup_with_handle_breakout"
    require_volume_spike: true
    pivot: "handle_high"

exit:
  take_profit_pct: 0.20
  take_profit_sell_ratio: 0.50
  trailing_stop_pct: 0.12
  hard_stop_loss_pct: 0.12

この形にしておくと、パラメータの変更が簡単になるみたいです。

スポンサーリンク

データ契約

入力と出力の形式を固定します。

## Candle schema
- date
- open high low close
- volume
- adj_close

## Evaluation output
- symbol
- asof_date
- market_ok
- stock_ok
- pattern_ok
- pivot_price
- entry_signal
- suggested_orders
- position_sizing
- notes

ここを曖昧にしないことで、AIの出力が安定するとのことです。

domain 判定ロジック

models はデータ構造
indicators は移動平均や出来高
patterns はカップウィズハンドル
risk はポジション計算
rules は評価関数

evaluate関数で全ての判定を行うようになっていました。

重要なのは、domainは判定だけを返すことで、発注や通知はここではやらない構成とのことでした。

data データ取得

データ取得はprovidersで管理します。

yfinanceやstooqを使って、cacheに保存して再現性を確保していきます。

日付や欠損の扱いはdocsで固定します。

prompts

Claude Codeに渡すプロンプトもファイルとして管理します。

explore 調査
plan 設計
implement 実装

会話に依存しないようにします。

ADR

意思決定を記録します。

なぜこの構成にしたのか
なぜこのデータソースなのか

後から迷わないためのログになるとのことです。

スプリント

小さく作る。

最初は指数判定だけ。
次に銘柄。
次に出来高。
その後にエントリー。
最後に売りとリスク管理。

この順番で積み上げる構成になっているみたいです。

Claude codeでのモノレポ構成の実装

まずはClaude Codeで、以下のざっくりプロンプトでモノレポ構成を作ってもらいました。

もう少しプロンプトは工夫しても良かったと思いますが、なるべく人の手を介さない形でやりたかったので、Chat GPTからの出力をそのまま、Claudeに渡しました。

Claude Codeへの入力プロンプト

以下の提案されている内容をもとに、モノレポ構成を構築してください

#提案内容

以下は、「投資ルールをコード化して判定を自動化する」ために、Claude Codeでのバイブコーディングに最適化したモノレポ構成です。

設計思想は、あなたの整理記事にある Explore→Plan→Implement の分離、自己検証(テスト実行まで含める)、コンテキスト肥大化を避ける運用、CLAUDE.mdでルール固定――に合わせています。

ねらい(このモノレポで「何ができる」状態にするか)

「投資前に決めたルールまとめ」を機械判定できる形に落とし込みます(例:指数のトレンド判定、銘柄のトレンド判定、Pivotブレイク、出来高増、損切り/利確/トレーリング、ポジションサイズ計算、月間停止/縮小モード)。

AIと相談して決めた株式投資ルールまとめ|投資開始前

推奨ディレクトリ構造(Monorepo)

Python想定(データ処理・検証が速い)。TypeScriptでも同じ思想で置き換えできます。

trading-rules-monorepo/

  CLAUDE.md

  README.md

  .gitignore

  .env.example

  Makefile

  pyproject.toml

  ruff.toml

  mypy.ini

  docs/

    00_overview.md

    10_rules_source.md

    20_system_design.md

    30_data_contracts.md

    40_test_strategy.md

    decisions/

      ADR-0001-architecture.md

      ADR-0002-data-provider.md

    prompts/

      explore.md

      plan.md

      implement.md

      debug.md

  configs/

    markets.yaml

    symbols_watchlist.yaml

    ruleset.yaml

  packages/

    domain/

      src/trading_domain/

        __init__.py

        models.py

        rules.py

        indicators.py

        patterns.py

        risk.py

      tests/

    data/

      src/trading_data/

        __init__.py

        providers/

          __init__.py

          yfinance_provider.py

          stooq_provider.py

        cache.py

      tests/

    app_cli/

      src/trading_cli/

        __init__.py

        main.py

      tests/

    app_api/

      src/trading_api/

        __init__.py

        server.py

      tests/

    app_web/

      README.md

      (任意: Streamlit / Next.js など)

  scripts/

    bootstrap.sh

    run_daily_check.sh

  sandbox/

    notebooks/

    tmp_outputs/

役割分担(コンテキスト管理のための分離)

packages/domain:ルール判定の純粋ロジック(外部I/O禁止)

packages/data:価格データ取得・キャッシュ・データ整形(契約を固定)

packages/app_cli:夜の運用を想定したCLI(銘柄スキャン→判定→出力)

packages/app_api:将来の通知やUI連携用(後回しでもOK)

docs/:Claudeに読ませる“仕様書置き場”(会話に仕様を溜めないため)

configs/:あなたの投資ルールをYAMLで固定(コードにベタ書きしない)

最重要ファイル:CLAUDE.md(短く固定)

Best Practicesの要点(自己検証、Explore/Plan/Implement、コンテキスト管理、セッションリセット、CLAUDE.mdは短く)を、そのまま“運用ルール”として置きます。

# CLAUDE.md (keep short)

## Working mode

– Always follow: Explore -> Plan -> Implement.

– For any code change: add/adjust tests and run them.

– Keep changes small and incremental.

## Repo boundaries

– packages/domain: pure logic only (no network/filesystem).

– packages/data: data fetch + normalization + caching.

– apps: CLI/API wiring only.

## Definition of Done

– Unit tests added/updated (pytest)

– `make lint` and `make test` pass

– Outputs match the expected examples in docs/30_data_contracts.md

## Context hygiene

– If the conversation becomes noisy or stuck, reset and restate the goal.

docs/10_rules_source.md(投資ルールの一次ソースを固定)

あなたの「投資開始前まとめ」の“数値ルール+売買ルール”を、ここにそのまま転記します(後でコード化の根拠になる)。

このファイルは「仕様」なので、更新履歴が追えるのが大事です。

元本:300万円、期間:数週間〜数ヶ月、夜のみ 

AIと相談して決めた株式投資ルールまとめ|投資開始前

損切り -12%、1回最大損失 2%、月間 -10%停止、DD -15〜-20%縮小、同時保有3〜4+現金30〜40% 

AIと相談して決めた株式投資ルールまとめ|投資開始前

投下額=(資金×2%)÷0.12 

AIと相談して決めた株式投資ルールまとめ|投資開始前

買い:指数25日線>75日線、銘柄も同条件、Pivot上抜け+出来高増 

AIと相談して決めた株式投資ルールまとめ|投資開始前

売り:-12%損切り(例外なし)、+20%で半分利確、残りトレーリング -12% 

AIと相談して決めた株式投資ルールまとめ|投資開始前

configs/ruleset.yaml(コードが読む“実行仕様”)

「文章のルール」を、判定しやすいデータにします。例:

capital:

  initial_jpy: 3000000

risk:

  stop_loss_pct: 0.12

  max_loss_per_trade_pct: 0.02

  monthly_stop_pct: 0.10

  drawdown_reduce_from_pct: 0.15

  drawdown_reduce_to_pct: 0.20

  cash_ratio_min: 0.30

  cash_ratio_max: 0.40

  max_positions: 4

  min_positions: 3

entry:

  market_filter:

    ma_fast_days: 25

    ma_slow_days: 75

    condition: “ma_fast > ma_slow”

  stock_filter:

    same_as_market_filter: true

  trigger:

    type: “cup_with_handle_breakout”

    require_volume_spike: true

    pivot: “handle_high”

exit:

  take_profit_pct: 0.20

  take_profit_sell_ratio: 0.50

  trailing_stop_pct: 0.12

  hard_stop_loss_pct: 0.12

この形にしておくと、将来「-12%→-10%に変える」みたいな更新も、YAML差分だけで試せます。

docs/30_data_contracts.md(データ契約を固定=ブレを防ぐ)

Claude Codeが迷いやすいのは「入力と出力の形が曖昧」なときです。ここで入出力のスキーマを固定します(Best Practicesの“指示を具体的に”の実装版)。

例:packages/domain が受け取る価格データ

## Candle schema (domain input)

– date: YYYY-MM-DD (tz normalized)

– open, high, low, close: float

– volume: float (0 allowed)

– adj_close: optional float

## Evaluation output schema

– symbol

– asof_date

– market_ok: bool

– stock_ok: bool

– pattern_ok: bool

– pivot_price: float | null

– entry_signal: bool

– suggested_orders:

    – type: stop_loss / take_profit / trailing_stop

    – price: float | null

    – pct: float | null

– position_sizing:

    – max_loss_jpy

    – position_size_jpy

– notes: string[]

packages/domain の中身(判定ロジックの“核”)

models.py

Candle, Series, EvaluationResult などのデータクラス(pydantic or dataclasses)

indicators.py

SMA(25), SMA(75)

出来高の基準(例:直近20日平均比など。基準は docs に固定)

patterns.py

Cup with Handle の判定は難所なので、最初は段階的に:

Pivotを「直近N日高値」として暫定

ハンドル高値=Pivot、出来高増、終値ブレイクを判定

“形”の厳密化(後からアップデート)

risk.py

投下額計算: (資金×2%) / 0.12 

AIと相談して決めた株式投資ルールまとめ|投資開始前

月間停止、DD縮小モード(運用状態 machine)

rules.py

evaluate(symbol_candles, market_candles, ruleset) -> EvaluationResult

コツ:domainは「今日の判断」だけを返し、発注や通知はapp層で行う(テストが激減します)。

packages/data の中身(再現性のためのキャッシュ最優先)

providers:yfinance / stooq 等(どれを使うかはADRで決める)

cache.py:取得結果を data/cache/ に保存(CSV/Parquet)

正規化:日付、欠損、祝日、出来高ゼロなどの扱いを docs に固定

app_cli(夜運用に最適)

trading check –market TOPIX –symbols configs/symbols_watchlist.yaml –asof 2026-03-22

出力はまず JSON + Markdown(ブログにも貼りやすい)がおすすめ。

Makefile(Claudeに“検証まで”やらせるための入口)

Best Practicesで強調されている「テストを書いて実行し、正しく動くことを確認」までを、1コマンドで回せるようにします。

lint:

ruff check .

ruff format –check .

mypy .

test:

pytest -q

fmt:

ruff format .

docs/prompts(Claude Codeに渡す定型プロンプト)

コンテキストを会話に溜めず、毎回このファイルを貼って開始すると安定します。

docs/prompts/explore.md(調査)

どのルールがどのモジュールに対応するか棚卸し

既存テストの有無、データ契約の確認

docs/prompts/plan.md(設計)

変更点、関数シグネチャ、テストケース(期待出力)を列挙

docs/prompts/implement.md(実装)

「実装→テスト追加→make test→結果貼る」まで指示

ADR(意思決定ログ)で“後から迷わない”

ADR-0001:Python/uv採用、domain/data/app分割

ADR-0002:データソース(yfinance等)と、価格は終値ベースで判定する…など

Claudeが迷ったときの“最後の拠り所”になります。

最初のスプリント(失敗しにくい作る順番)

あなたの記事の「小さく作って積み上げる」に合わせて、こう刻むのが安全です。

Sprint 0:雛形(lint/test/契約/CLIの骨組み)

Sprint 1:指数トレンド判定(25SMA>75SMA)だけ

Sprint 2:銘柄トレンド判定+出来高増の定義

Sprint 3:Pivot暫定版(直近N日高値)+ブレイク判定

Sprint 4:売り(損切り/利確/トレーリング)と注文案の計算

Sprint 5:月間停止/DD縮小モード(状態管理)

追加で必要になりそうな「モノレポ記事」の要点(ここに吸収する)

あなたが書こうとしている「モノレポで管理する」記事の主旨(コンテキスト管理、ルール固定、ポリシー分離)は、上の構成にすでに埋め込んであります。特に、

docs/ + configs/ を“仕様置き場”にして会話を軽くする

domain/data/app を分けて、Claudeの探索範囲を狭める

CLAUDE.md を短くして毎回読み込ませる

が効きます。

Claudeが作成してくれたディレクトリ構成

うまくできているか細かく確認していませんが、それっぽくできていそうでした。

実装を進めていく中で課題が見えてくるかと思いますので、順次アップデートしながら進めていこうと思います。

設定ファイル

ドキュメント

パッケージ実装

パッケージ実装内容
packages/domainmodels/indicators/patterns/risk/rules + テスト3ファイル
packages/datayfinance_provider/stooq_provider/cache + test_cache
packages/app_clitrading check CLIコマンド(JSON/Markdown出力)
packages/app_apiFastAPIスケルトン(Sprint 5用

まとめ

今回AIと相談して設計したモノレポ構成は、単なる整理ではなく、ルールを機械に判断させるための土台になります。

docsで仕様を固定し
configsで実行仕様に落とし
domainで純粋に判定する

うまくできていることを願いながら、この構造をベースに、次は実装に入っていこうと思います。

スポンサーリンク
moomoo証券【WEB】
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

東証プライム上場企業で生成AIの開発に携わるAIエンジニアです。

仕事では最先端のAIを扱いながら、日常ではあまり活用できていないことに気づきました。

本当にAIは人生を変えるのか.

それを確かめるため、株式投資や副業、子どもとの遊びなどにAIを取り入れ、暮らしがどう変わるのかを実験・発信していきます。

目次