トレード状態機械(State Machine)¶
概要¶
Trade State Machine は、トレードのライフサイクルを明確な状態遷移として管理するモジュールです。
設計理念
「UW検知 → 即エントリー」ではなく、テクニカル条件を満たすまで「監視状態」で待機する。
状態遷移図¶
stateDiagram-v2
[*] --> IDLE: 初期状態
IDLE --> FLOW_DETECTED: UWフロー検知
FLOW_DETECTED --> WATCHING_TECHNICAL: フロー検証OK
FLOW_DETECTED --> IDLE: フロー検証NG
WATCHING_TECHNICAL --> ENTRY_TRIGGERED: テクニカル条件成立
WATCHING_TECHNICAL --> IDLE: タイムアウト(8時間)
WATCHING_TECHNICAL --> WATCHING_TECHNICAL: 追加フロー検知(強化)
ENTRY_TRIGGERED --> POSITION_OPEN: 約定成功
ENTRY_TRIGGERED --> IDLE: 約定失敗
POSITION_OPEN --> CLOSED: イグジット
CLOSED --> [*]: 終了
状態定義¶
1. IDLE(待機)¶
初期状態: 何も監視していない
class TradeState(Enum):
IDLE = "idle"
FLOW_DETECTED = "flow_detected"
WATCHING_TECHNICAL = "watching_technical"
ENTRY_TRIGGERED = "entry_triggered"
POSITION_OPEN = "position_open"
CLOSED = "closed"
2. FLOW_DETECTED(フロー検知)¶
UWでフローを検知した直後の状態
- FlowValidatorでフロー品質を検証
- 検証OKなら
WATCHING_TECHNICALへ遷移 - 検証NGなら
IDLEへ戻る
3. WATCHING_TECHNICAL(テクニカル監視)¶
テクニカル条件の成立を待機中
- MTF分析で環境を確認
- 重要ラインのブレイクアウトを監視
- タイムアウト: 8時間(当日引けまで)
複数フローの強化
30分以内に同一銘柄で追加フローを検知した場合、信頼度スコアが上昇
4. ENTRY_TRIGGERED(エントリートリガー)¶
テクニカル条件が成立し、エントリー準備完了
- スプレッド構築
- 注文発注
- 約定確認
5. POSITION_OPEN(ポジション保有中)¶
ポジションを保有している状態
- 価格監視
- イグジット条件チェック
- ロール判定
6. CLOSED(クローズ済み)¶
トレード完了
- 結果記録
- 統計更新
実装詳細¶
core/trade_state_machine.py¶
@dataclass
class TradeContext:
"""トレードコンテキスト"""
symbol: str
state: TradeState
initial_flow: OptionFlow
additional_flows: List[OptionFlow] = field(default_factory=list)
confidence_score: float = 0.0
state_entered_at: datetime = field(default_factory=datetime.now)
timeout_hours: float = 8.0 # 当日引けまで
class TradeStateMachine:
"""トレード状態機械"""
def __init__(self):
self._contexts: Dict[str, TradeContext] = {}
def on_flow_detected(self, flow: OptionFlow) -> TradeContext:
"""フロー検知時の処理"""
symbol = flow.ticker
# 既存コンテキストがあれば強化
if symbol in self._contexts:
ctx = self._contexts[symbol]
if ctx.state == TradeState.WATCHING_TECHNICAL:
return self._reinforce_flow(ctx, flow)
# 新規コンテキスト作成
ctx = TradeContext(
symbol=symbol,
state=TradeState.FLOW_DETECTED,
initial_flow=flow,
confidence_score=self._calculate_initial_confidence(flow)
)
self._contexts[symbol] = ctx
return ctx
def on_flow_validated(self, symbol: str, is_valid: bool) -> TradeContext:
"""フロー検証結果の処理"""
ctx = self._contexts.get(symbol)
if not ctx:
return None
if is_valid:
ctx.state = TradeState.WATCHING_TECHNICAL
ctx.state_entered_at = datetime.now()
else:
ctx.state = TradeState.IDLE
del self._contexts[symbol]
return ctx
def on_technical_trigger(self, symbol: str) -> TradeContext:
"""テクニカルトリガー成立時の処理"""
ctx = self._contexts.get(symbol)
if ctx and ctx.state == TradeState.WATCHING_TECHNICAL:
ctx.state = TradeState.ENTRY_TRIGGERED
return ctx
return None
def check_timeouts(self) -> List[str]:
"""タイムアウトチェック"""
expired = []
now = datetime.now()
for symbol, ctx in list(self._contexts.items()):
if ctx.state == TradeState.WATCHING_TECHNICAL:
elapsed = (now - ctx.state_entered_at).total_seconds() / 3600
if elapsed > ctx.timeout_hours:
ctx.state = TradeState.IDLE
del self._contexts[symbol]
expired.append(symbol)
return expired
信頼度スコア¶
初期スコア計算¶
def _calculate_initial_confidence(self, flow: OptionFlow) -> float:
"""初期信頼度スコアを計算"""
score = 0.0
# プレミアム(大きいほど高スコア)
if flow.premium >= 100000:
score += 0.3
elif flow.premium >= 50000:
score += 0.2
# Sweep判定
if flow.is_sweep:
score += 0.2
# Ask Side
if flow.side in ['ASK', 'ABOVE_ASK']:
score += 0.2
# OTM度合い(適度なOTMが高スコア)
if 0.2 <= flow.delta <= 0.4:
score += 0.15
# 満期(適切なDTE)
if 7 <= flow.dte <= 30:
score += 0.15
return min(score, 1.0)
フロー強化¶
def _reinforce_flow(self, ctx: TradeContext, new_flow: OptionFlow) -> TradeContext:
"""追加フローで信頼度を強化"""
# 30分以内のフローのみ強化対象
elapsed = (datetime.now() - ctx.state_entered_at).total_seconds() / 60
if elapsed > 30:
return ctx
ctx.additional_flows.append(new_flow)
# 同方向のフローで強化
if new_flow.put_call == ctx.initial_flow.put_call:
ctx.confidence_score = min(ctx.confidence_score + 0.15, 1.0)
logger.info(f"[{ctx.symbol}] フロー強化: 信頼度 {ctx.confidence_score:.2f}")
return ctx
タイムアウト設定¶
| 状態 | タイムアウト | 理由 |
|---|---|---|
| FLOW_DETECTED | 5分 | 検証は即座に完了すべき |
| WATCHING_TECHNICAL | 8時間 | 当日引けまで |
| ENTRY_TRIGGERED | 30秒 | 約定待ち |
Gemini推奨
デイトレード〜短期スイングが前提なら、その日のうちにモメンタムが出なければ「鮮度が落ちた」とみなして監視リストから外す。
ペーパートレードでの使用¶
# run_paper_trading.py
class PaperTradingEngine:
def __init__(self):
self.state_machine = TradeStateMachine()
self.flow_validator = FlowValidator()
self.mtf_analyzer = MTFAnalyzer()
async def on_uw_flow(self, flow: OptionFlow):
# 1. 状態機械にフロー通知
ctx = self.state_machine.on_flow_detected(flow)
# 2. フロー検証
validation = self.flow_validator.validate(flow, ...)
ctx = self.state_machine.on_flow_validated(
flow.ticker,
validation.is_valid
)
if ctx.state != TradeState.WATCHING_TECHNICAL:
return
# 3. テクニカル監視ループ開始
asyncio.create_task(self._watch_technical(ctx))
async def _watch_technical(self, ctx: TradeContext):
while ctx.state == TradeState.WATCHING_TECHNICAL:
# MTF分析
mtf = self.mtf_analyzer.analyze(ctx.symbol, ...)
if mtf.trigger_confirmed:
self.state_machine.on_technical_trigger(ctx.symbol)
await self._execute_entry(ctx)
return
# タイムアウトチェック
if self.state_machine.check_timeouts():
return
await asyncio.sleep(60) # 1分間隔
ログ出力例¶
[TSLA] 状態遷移: IDLE → FLOW_DETECTED
フロー: CALL $250 12/20, プレミアム $125,000
初期信頼度: 0.65
[TSLA] 状態遷移: FLOW_DETECTED → WATCHING_TECHNICAL
フロー検証: VALIDATED
[TSLA] フロー強化: 追加フロー検知
信頼度: 0.65 → 0.80
[TSLA] 状態遷移: WATCHING_TECHNICAL → ENTRY_TRIGGERED
トリガー: 1時間足ブレイクアウト確認
[TSLA] 状態遷移: ENTRY_TRIGGERED → POSITION_OPEN
約定: Put Credit Spread $245/$240
関連ファイル¶
| ファイル | 役割 |
|---|---|
core/trade_state_machine.py |
状態機械本体 |
core/flow_validator.py |
フロー検証 |
core/mtf_analyzer.py |
MTF分析 |
core/technical_validator.py |
テクニカル検証 |
更新履歴¶
| 日付 | 変更内容 |
|---|---|
| 2025-11-29 | Gemini分析に基づき実装 |
| 2025-11-29 | 複数フロー強化ロジック追加 |
| 2025-11-29 | タイムアウト設定(8時間) |