Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ Interpretation: strong positive Sharpe 0.445 (3rd-best no-ML backbone, close to

- `main.py` - Strategy (v3, risk-adjusted momentum with skip-month)
- `research.ipynb` - Factor analysis and signal robustness tests
- `quantbook.ipynb` - Reproduction QuantBook de l'analyse exploratoire sur les donnees natives QC (validation pre-backtest)

## References

Expand Down
3 changes: 2 additions & 1 deletion MyIA.AI.Notebooks/QuantConnect/projects/ForexCarry/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Long-only top-2 momentum currencies vs USD, monthly rebalance. Signal is inverte

## Figures du notebook de recherche

Le notebook [`research.ipynb`](research.ipynb) teste six hypothèses sur le momentum FX : momentum pur (H1), long-only vs long/short (H3), réduction à 4 paires pour limiter la corrélation (H4), filtre DXY vs SPY SMA200 (H5), filtre de volatilité par régime (H6), puis synthèse de la configuration optimale. Provenance détaillée : [`MANIFEST.md`](assets/readme/MANIFEST.md).
Le notebook [`research.ipynb`](research.ipynb) teste six hypothèses sur le momentum FX : momentum pur (H1), optimisation des lookbacks momentum — 21/63/126/252 jours (H2), long-only vs long/short (H3), réduction à 4 paires pour limiter la corrélation (H4), filtre DXY vs SPY SMA200 (H5), filtre de volatilité par régime (H6), puis synthèse de la configuration optimale. Provenance détaillée : [`MANIFEST.md`](assets/readme/MANIFEST.md).

### Diagnostic préalable — corrélation inter-paires et rendements normalisés (cellule 3)

Expand Down Expand Up @@ -125,6 +125,7 @@ lean backtest --project .

- `main.py` - Strategy (v4.0, baseline L/S) — migration v3e à étudier hors-scope PR
- `research.ipynb` - FX momentum signal analysis (H1-H6 + synthèse)
- `quantbook.ipynb` - Reproduction de l'analyse FX momentum sous QuantConnect Research (données natives QC)

## References

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,5 @@ concentré Mag7. Voir Key-finding #36 dans `docs/qc/qc-comparative-backtests.md`
- `main.py` — Stratégie (composite EMA70/Trend30, alignée 2018-2025)
- `alpha_models.py` — EMACrossAlpha + TrendStocksAlpha
- `portfolio_construction.py` — MultiStrategyPCM (blend d'allocation alpha)
- `quantbook.ipynb` — QuantBook de recherche du composite (sweep d'allocation cellule 12 : EMA70/Trend30 élu, Sharpe 0.497)
- `quantbook_composite_research.ipynb` — QuantBook pré-composite (corrélation des signaux EMA-Cross × TrendStocks)
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"## Performance de reference\n",
"- EMA-Cross-Alpha: Sharpe 0.980 (daily emission)\n",
"- TrendStocks-Alpha: Sharpe 0.718 (weekly emission)\n",
"- Target allocation: EMA40/Trend60\n",
"- Allocation initiale (défaut du simulateur) : EMA40/Trend60 — le sweep (cellule 12) élira EMA70/Trend30 (Sharpe 0.497)\n",
"\n",
"## Prerequis\n",
"- Environnement Lean Research\n",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ Stratégie composite combinant deux approches complémentaires via le QuantConne
- `main.py` : Configuration de l'algorithme avec CompositeAlpha et MultiStrategyPCM
- `alpha_models.py` : Classes SectorMomentumAlpha et RegimeSwitchingAlpha
- `portfolio_construction.py` : MultiStrategyPCM pour l'allocation de capital par stratégie
- `quantbook.ipynb` : QuantBook de recherche du composite Momentum + RegimeSwitching (données natives QC, pré-backtest)

## Résultats de backtest (T60/RS40)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,18 @@ Composite framework combinant TrendStocks (75 %) avec AllWeather (25 %) via l'Al
|--------|--------|------|-------|-----------|---------|--------------|
| **`main.py:8-13` sweep comment** (claim original commit `fa122ae7e`) | **1.155** | **27.4 %** | **27.7 %** | T75 / AW25 (v1.4d selected) | **2015-2026** | Allocation sweep interne (5 tranches T60→T80), **pas de backtest tracé dans le dépôt** |
| `iter4_research.py` yfinance local | n/a (script) | n/a | n/a | grid 5×5×3 | 2014-2026 | yfinance local, **AVERTIT** « Simulation Sharpe typically 2-3× cloud Sharpe » |
| `quantbook.ipynb` cell 12 (research default 50/50) | **0.680** | **10.88 %** | **-23.53 %** | T50 / AW50 (default research) | 2015-2026 | Lean CLI Docker research, **défaut 50/50 ≠ main.py T75/AW25** |
| `quantbook.ipynb` cell 8 (allocation sweep) | 0.382 → 0.738 | 7.22 % → 14.02 % | -33.72 % → -17.29 % | grid T0/T10/.../T100 (PAS de T75) | 2015-2026 | Lean CLI Docker, **T75 absente du grid (jumps T70→T80)** |
| `quantbook.ipynb` cell 9 (stop-loss sweep) | **0.684 → 2.124** ⚠️ | 10.93 % → 21.29 % | -23.53 % → -4.86 % | T50/AW50 + stop-loss | 2015-2026 | Lean CLI Docker, **Stop 5 % Sharpe 2.124 = SUSPECT overfit structurel** |
| `quantbook.ipynb` cell 11 (rebalance freq sweep) | 0.626 → 1.070 | 9.92 % → 16.13 % | -23.53 % → -23.94 % | T50/AW50 weekly/bi-weekly/monthly | 2015-2026 | Lean CLI Docker, **monthly > weekly par 35-40 % Sharpe** |
| `quantbook.ipynb` cell 12 (T×freq grid) | 0.544 → 1.161 | 8.90 % → 17.83 % | -27.88 % → -22.00 % | T30→T60 × W/2W/M | 2015-2026 | Lean CLI Docker, **T60/Monthly Sharpe 1.161 ≈ main.py T75** |
| `quantbook.ipynb` cell 10 (research default 50/50) | **0.680** | **10.88 %** | **-23.53 %** | T50 / AW50 (default research) | 2015-2026 | Lean CLI Docker research, **défaut 50/50 ≠ main.py T75/AW25** |
| `quantbook.ipynb` cell 16 (allocation sweep) | 0.382 → 0.738 | 7.22 % → 14.02 % | -33.72 % → -17.29 % | grid T0/T10/.../T100 (PAS de T75) | 2015-2026 | Lean CLI Docker, **T75 absente du grid (jumps T70→T80)** |
| `quantbook.ipynb` cell 18 (stop-loss sweep) | **0.684 → 2.124** ⚠️ | 10.93 % → 21.29 % | -23.53 % → -4.86 % | T50/AW50 + stop-loss | 2015-2026 | Lean CLI Docker, **Stop 5 % Sharpe 2.124 = SUSPECT overfit structurel** |
| `quantbook.ipynb` cell 23 (rebalance freq sweep) | 0.626 → 1.070 | 9.92 % → 16.13 % | -23.53 % → -23.94 % | T50/AW50 weekly/bi-weekly/monthly | 2015-2026 | Lean CLI Docker, **monthly > weekly par 35-40 % Sharpe** |
| `quantbook.ipynb` cell 25 (T×freq grid) | 0.544 → 1.161 | 8.90 % → 17.83 % | -27.88 % → -22.00 % | T30→T60 × W/2W/M | 2015-2026 | Lean CLI Docker, **T60/Monthly Sharpe 1.161 ≈ main.py T75** |
| **Production cloud backtest (one-shot, fa122ae7e)** | **1.155** | **27.4 %** | **27.7 %** | T75 / AW25 (v1.4d) | 2015-2026 | **NON PERSISTÉ dans le dépôt** — claim original du commit initial |

**Lecture honnête — SUSPECT « SWEEP-COMMENT MISATTRIBUTION » (c.1284-L1 ★★)** : un Sharpe de **1.155** revendiqué sur 11 ans (2015-2026) avec **allocation T75/AW25**, cité depuis un **bloc commentaire dans `main.py:8-13`** (`Allocation sweep results`) **sans backtest cloud traçable dans le dépôt**, est exposé à **3 sources méthodologiques de surestimation** distinctes des library clones (c.1281-L2/82-L2/83-L2) :

1. **Sweep-comment overfitting structurel** : le `main.py:8-13` docstring cite 5 tranches (T60/T65/T70/**T75**/T80) qui varient **monotonement** (Sharpe 1.130→1.141→1.149→**1.155**→1.163, CAGR 23.8 %→25.0 %→26.2 %→**27.4 %**→28.7 %, MaxDD 24.5 %→25.6 %→26.6 %→**27.7 %**→28.7 %) — **+0.033 Sharpe entre T70 et T75 sur 11 ans = 0.003/an, dans le bruit statistique**. Le choix « T75/AW25 selected » est un **milieu de grid monotone** (pas un optimum discriminant), avec un commentaire « best risk/return balance before beta exceeds 0.80 and MaxDD approaches 29 % » qui n'est étayé par aucune mesure de beta dans le dépôt. La grille est **régulière** (T60→T65→T70→T75→T80, step 5), **pas discriminante**.

2. **`quantbook.ipynb` 50/50 ≠ `main.py` T75/AW25** : la recherche locale du dépôt utilise un **défaut 50/50** (cf. `quantbook.ipynb:11-12` : « TrendStocks (50 %) + AllWeather (50 %) ») **différent du T75/AW25 production**. La grille d'allocation `quantbook.ipynb` cell 8 montre **T70/T30 = Sharpe 0.728** et **T80/T20 = Sharpe 0.737** — donc **interpolation vers T75 ≈ Sharpe 0.732**, **pas 1.155**. L'écart **1.155 - 0.732 = +0.42** ne s'explique pas par le seul changement d'allocation ; il vient probablement de **différences méthodologiques substantielles** (frais Interactive Brokers dans `main.py:45` `INTERACTIVE_BROKERS_BROKERAGE` vs simulation 0 frais dans `quantbook.ipynb:155-160`, périmètre univers TrendStocks `main.py:36-50` 15 noms vs 15 noms identiques OK, **MAIS** momentum-weighted `main.py:36-37` `TrendStocksAlpha` vs equal-weight dans `quantbook.ipynb:131-148`, **ET** période warmup + rééquilibrage mensuel 31j dans `main.py:54` vs weekly default dans `quantbook.ipynb` cell 11 sweep). Sans **rétro-engineering complet**, l'écart reste non-attribué.
2. **`quantbook.ipynb` 50/50 ≠ `main.py` T75/AW25** : la recherche locale du dépôt utilise un **défaut 50/50** (cf. `quantbook.ipynb` cellule 10 : « TrendStocks (50 %) + AllWeather (50 %) ») **différent du T75/AW25 production**. La grille d'allocation `quantbook.ipynb` cell 8 montre **T70/T30 = Sharpe 0.728** et **T80/T20 = Sharpe 0.737** — donc **interpolation vers T75 ≈ Sharpe 0.732**, **pas 1.155**. L'écart **1.155 - 0.732 = +0.42** ne s'explique pas par le seul changement d'allocation ; il vient probablement de **différences méthodologiques substantielles** (frais Interactive Brokers dans `main.py:45` `INTERACTIVE_BROKERS_BROKERAGE` vs simulation 0 frais dans `quantbook.ipynb:155-160`, périmètre univers TrendStocks `main.py:36-50` 15 noms vs 15 noms identiques OK, **MAIS** momentum-weighted `main.py:36-37` `TrendStocksAlpha` vs equal-weight dans `quantbook.ipynb:131-148`, **ET** période warmup + rééquilibrage mensuel 31j dans `main.py:54` vs weekly default dans `quantbook.ipynb` cell 11 sweep). Sans **rétro-engineering complet**, l'écart reste non-attribué.

3. **`iter4_research.py` AVERTIT 2-3× overstate** : le script de recherche locale affiche explicitement (ligne 176) « Simulation Sharpe is typically 2-3× cloud Sharpe ». Donc la **simulated Sharpe 0.732 (cell 8, T70)** pourrait masquer une **cloud Sharpe ≈ 0.24-0.37**, **pas 1.155**. Inversement, le **cloud Sharpe 1.155** pourrait correspondre à une **simulation ≈ 2.3-3.5** (jamais observée dans le grid du quantbook, où max = 2.124 sur Stop 5 % — mais ce 2.124 est lui-même SUSPECT). **L'écart entre 1.155 (production) et 0.732 (local sim 50/50) reste non-résolu**.

Expand All @@ -48,7 +48,7 @@ Cf. **c.1281-L3 / c.1282-L3 / c.1283-L3 ★★** (library clones) : le pattern
**Lean CLI (backtest production T75/AW25) :** identique, `main.py` fixe `alpha_allocations={"TrendStocks": 0.75, "AllWeather": 0.25}` ligne 53. **Mais attendre une variation ~±30-50 % sur Sharpe** vs le 1.155 docstring à cause de (a) `INTERACTIVE_BROKERS_BROKERAGE` ligne 45 vs 0 frais dans recherche, (b) périmètre univers TrendStocks `main.py:36-50` (15 noms) vs 15 noms identiques OK, (c) momentum-weighted TrendStocks vs equal-weight, (d) mensuel 31j vs weekly par défaut.
**QC Cloud :** non déployé. Copier `main.py + alpha_models.py + portfolio_construction.py` dans un nouveau projet QC Cloud pour exécuter et préserver les outputs dans `lean-workspace/<project>/backtests/<timestamp>/`. **Recommandation anti-SUSPECT** : **re-exécuter** le backtest cloud avec le T75/AW25 exact, **préserver le JSON output** dans le worktree, et **comparer** au 1.155 docstring — l'écart attendu (cf. `iter4_research.py:176` 2-3× overstate) devrait ramener le Sharpe à ~0.4-0.6 dans le pire cas (surestimation locale) ou confirmer le 1.155 (backtest one-shot originel correct).

**Note variations Docker Lean** : `quantbook.ipynb` cell 12 montre que la même stratégie exécutée en **monthly vs weekly** donne Sharpe **1.064** vs **0.674** (cell 11) — c'est l'effet « less-frequent-rebalance » qui réduit le turnover et préserve les trends. Le `main.py` ligne 54 utilise `rebalance=timedelta(days=31)` (monthly) — donc **dans la même veine que les 1.064**, **pas 0.674**.
**Note variations Docker Lean** : `quantbook.ipynb` cell 23 montre que la même stratégie exécutée en **monthly vs weekly** donne Sharpe **1.064** vs **0.674** (cell 11) — c'est l'effet « less-frequent-rebalance » qui réduit le turnover et préserve les trends. Le `main.py` ligne 54 utilise `rebalance=timedelta(days=31)` (monthly) — donc **dans la même veine que les 1.064**, **pas 0.674**.

## Fichiers

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

## Description

GaussianNB direction classifier on 8 tech stocks. Uses lagged returns, RSI, volume, and volatility features to predict next-day direction.
GaussianNB direction classifier on 8 tech stocks. Utilise des rendements retardés sur fenêtres de 2, 5, 10 et 21 jours pour prédire la direction du lendemain.

## How to Run

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"source": [
"# Research: Partner-HAR-RV-Kelly\n",
"\n",
"HAR-RV (Heterogeneous Autoregressive Realized Volatility) avec critere de Kelly sur un portefeuille multi-actifs.\n",
"HAR-RV (Heterogeneous Autoregressive Realized Variance) avec critere de Kelly sur un portefeuille multi-actifs.\n",
"\n",
"Cette stratégie utilise le modèle HAR de Corsi (2009) pour prevoir la variance realisee\n",
"a 5 jours a partir de la RV quotidienne, puis applique le critere de Kelly a la fraction 1/4\n",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,4 @@ MLPClassifier (not actual LSTM) return prediction. Uses sklearn MLPClassifier wi
## Files

- main.py - Strategy (v2.1, MLP forecasting)
- research.ipynb - Carnet exploratoire (Ex07) : parcours pédagogique du LSTM (portes, propagation avant manuelle, backtest simple sur données téléchargées)
Loading