Stack: FastAPI + React/TypeScript + SQLite + GPT-4o Features: Radar géopolitique, Marchés, Régime Macro, Journal de Bord MTM, Rapport IA, Super Contexte (base de raisonnement évolutive), Boucle feedback IA. Deploy: Docker + docker-compose + nginx pour openfin.open-squared.tech Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
156 lines
3.3 KiB
Python
156 lines
3.3 KiB
Python
from pydantic import BaseModel
|
|
from typing import Optional, List, Dict, Any
|
|
from datetime import datetime
|
|
from enum import Enum
|
|
|
|
|
|
class AssetClass(str, Enum):
|
|
ENERGY = "energy"
|
|
METALS = "metals"
|
|
AGRICULTURE = "agriculture"
|
|
EQUITIES = "equities"
|
|
INDICES = "indices"
|
|
FOREX = "forex"
|
|
CRYPTO = "crypto"
|
|
RATES = "rates"
|
|
|
|
|
|
class RiskLevel(str, Enum):
|
|
LOW = "low"
|
|
MEDIUM = "medium"
|
|
HIGH = "high"
|
|
EXTREME = "extreme"
|
|
|
|
|
|
class GeopoliticalCategory(str, Enum):
|
|
MILITARY = "military"
|
|
SANCTIONS = "sanctions"
|
|
ELECTIONS = "elections"
|
|
NATURAL_DISASTER = "natural_disaster"
|
|
HEALTH_CRISIS = "health_crisis"
|
|
RESOURCE_SCARCITY = "resource_scarcity"
|
|
TRADE_WAR = "trade_war"
|
|
ENERGY_CRISIS = "energy_crisis"
|
|
POLITICAL_SPEECH = "political_speech"
|
|
FINANCIAL_CRISIS = "financial_crisis"
|
|
|
|
|
|
class GeoEvent(BaseModel):
|
|
id: str
|
|
title: str
|
|
summary: str
|
|
category: GeopoliticalCategory
|
|
date: datetime
|
|
source: str
|
|
impact_score: float # -1.0 to 1.0
|
|
asset_impacts: Dict[AssetClass, float] # impact per asset class
|
|
tags: List[str]
|
|
is_processed: bool = False
|
|
|
|
|
|
class MarketQuote(BaseModel):
|
|
symbol: str
|
|
name: str
|
|
price: float
|
|
change: float
|
|
change_pct: float
|
|
volume: int
|
|
iv: Optional[float] = None # implied volatility
|
|
asset_class: AssetClass
|
|
timestamp: datetime
|
|
|
|
|
|
class OptionsContract(BaseModel):
|
|
symbol: str
|
|
underlying: str
|
|
expiry: str
|
|
strike: float
|
|
option_type: str # call / put
|
|
bid: float
|
|
ask: float
|
|
last: float
|
|
volume: int
|
|
open_interest: int
|
|
iv: float
|
|
delta: float
|
|
gamma: float
|
|
theta: float
|
|
vega: float
|
|
rho: float
|
|
|
|
|
|
class TradeIdea(BaseModel):
|
|
id: str
|
|
title: str
|
|
rationale: str
|
|
asset_class: AssetClass
|
|
underlying: str
|
|
strategy: str # e.g. "Bull Call Spread", "Long Put", "Straddle"
|
|
legs: List[Dict[str, Any]]
|
|
max_loss: float
|
|
max_gain: Optional[float]
|
|
breakeven: List[float]
|
|
horizon_days: int
|
|
confidence: float # 0-100
|
|
geo_trigger: Optional[str]
|
|
risk_level: RiskLevel
|
|
capital_required: float
|
|
created_at: datetime
|
|
|
|
|
|
class BacktestParams(BaseModel):
|
|
start_date: str
|
|
end_date: str
|
|
strategy: str
|
|
underlying: str
|
|
geo_filters: Optional[List[GeopoliticalCategory]] = None
|
|
capital: float = 1000.0
|
|
|
|
|
|
class BacktestResult(BaseModel):
|
|
params: BacktestParams
|
|
trades: List[Dict[str, Any]]
|
|
total_return: float
|
|
win_rate: float
|
|
max_drawdown: float
|
|
sharpe_ratio: float
|
|
profit_factor: float
|
|
equity_curve: List[Dict[str, Any]]
|
|
|
|
|
|
class EconomicEvent(BaseModel):
|
|
id: str
|
|
title: str
|
|
country: str
|
|
date: datetime
|
|
importance: str # low / medium / high
|
|
previous: Optional[str]
|
|
forecast: Optional[str]
|
|
actual: Optional[str]
|
|
asset_impact: List[AssetClass]
|
|
|
|
|
|
class PortfolioPosition(BaseModel):
|
|
id: str
|
|
trade_idea_id: Optional[str]
|
|
symbol: str
|
|
strategy: str
|
|
entry_date: datetime
|
|
expiry: str
|
|
legs: List[Dict[str, Any]]
|
|
capital_invested: float
|
|
current_value: float
|
|
pnl: float
|
|
pnl_pct: float
|
|
status: str # open / closed / expired
|
|
|
|
|
|
class GeoPatternMatch(BaseModel):
|
|
pattern_id: str
|
|
description: str
|
|
historical_date: datetime
|
|
current_similarity: float
|
|
historical_outcome: str
|
|
suggested_trades: List[str]
|
|
asset_class: AssetClass
|