Passer au contenu
Toutes les stratégies

Stratégies

BTC Report de momentum intersessions — long-short, instrument unique OHLCV : la direction du mouvement de la session ASIA prédit celle de la session US ; négocier la session US dans cette direction ONLY lorsque le mouvement asiatique est important, position plate pendant la nuit (BINANCE BTCUSDT USD-M, bougies de 1H, intrajournalier, 2 paramètres)

Résultat: Abandonné

BtcAsiaToUsSessionCarryoverLS

Bien mesuré : 594 transactions sur l’intégralité de l’historique de 2020-2026 1H, avec un équilibre long/short (293/301) et une exécution sans anomalie (594 signaux, 594 ordres soumis, aucune perte d’ordre)

Hypothèse

Une stratégie LONG-SHORT, SINGLE-INSTRUMENT, pure-OHLCV INTRADAY sur BTCUSDT.BINANCE USD-M perpétuel, issue d’une famille réellement différente de toutes les stratégies en attente ou abandonnées ici — elle n’est NOT ni une stratégie de tendance ou de cassure (momentum dual-TF, SuperTrend, Donchian, ORB), NOT une stratégie de retour à la moyenne ou de contre-tendance (les deux ont échoué), NOT un signal reposant sur un flux de données supplémentaire (tous sont des perdants nets). Elle exploite un décalage……Afficher plusAfficher moins

Une stratégie LONG-SHORT, SINGLE-INSTRUMENT, pure-OHLCV INTRADAY sur BTCUSDT.BINANCE USD-M perpétuel, issue d’une famille réellement différente de toutes les stratégies en attente ou abandonnées ici — elle n’est NOT ni une stratégie de tendance ou de cassure (momentum dual-TF, SuperTrend, Donchian, ORB), NOT une stratégie de retour à la moyenne ou de contre-tendance (les deux ont échoué), NOT un signal reposant sur un flux de données supplémentaire (tous sont des perdants nets). Elle exploite un décalage intrajournalier entre sessions SESSION LEAD-LAG : la tonalité directionnelle établie pendant la session ASIA à faible participation (00:00-08:00 UTC) tend à PERSIST pendant la session US à plus forte liquidité (13:00-21:00 UTC), à mesure que les flux US/institutionnels prolongent le mouvement au lieu de l’inverser. Chaque jour UTC, le signe et l’ampleur du rendement de la session asiatique sont mesurés ; lorsque le mouvement asiatique est LARGE (un vrai signal directionnel, pas du bruit), la stratégie entre dans la session US dans la direction SAME et ne conserve la position que pendant cette session, en restant FLAT pendant la nuit (pas d’exposition au financement, pas de gap nocturne, pas de risque de tendance sur plusieurs jours). Cette stratégie se distingue de la cassure de la plage d’ouverture BTC en attente (qui négocie une plage BREAKOUT des premières heures) — ici, il n’y a pas de cassure ; il s’agit d’un CARRYOVER directionnel d’un mouvement de session déjà établi vers une session ultérieure distincte. Elle conserve les invariants qui permettent de survivre (instrument unique, pure OHLCV avec un historique complet de 2020-2026 1H, long-short, aucun flux de données supplémentaire au vu des résultats des perdants nets, aucune seconde jambe selon la règle L69) et est conçue pour les seuils statistiques : une fréquence proche du quotidien produit un nombre de transactions LARGE (>100/an), qui franchit le seuil de mesurabilité et resserre l’estimation du Sharpe déflaté ; seuls 2 FREE paramètres (seuil d’entrée du mouvement asiatique, multiplicateur de stop ATR) minimisent la pénalité de déflation liée au meilleur des -225 essais. Elle comble également le manque de stratégies dans la catégorie des horizons courts (8.6% contre 10%).

L’itération 2 corrige à l’identique l’échec Layer-2 : les six scénarios synthétiques ont tous levé « TypeError: _day_of() takes 1 positional argument but 2 were given ». Le harnais Layer-2 rebinde chaque attribut appelable du proxy comme méthode BOUND, si bien que les méthodes utilitaires @staticmethod _day_of/_hour_of recevaient l’instance comme premier argument et la bougie comme second. Correction : les deux sont désormais de simples méthodes d’instance (self, bar) — les appels utilisaient déjà……Afficher plusAfficher moins

L’itération 2 corrige à l’identique l’échec Layer-2 : les six scénarios synthétiques ont tous levé « TypeError: _day_of() takes 1 positional argument but 2 were given ». Le harnais Layer-2 rebinde chaque attribut appelable du proxy comme méthode BOUND, si bien que les méthodes utilitaires @staticmethod _day_of/_hour_of recevaient l’instance comme premier argument et la bougie comme second. Correction : les deux sont désormais de simples méthodes d’instance (self, bar) — les appels utilisaient déjà self._day_of(bar)/self._hour_of(bar), donc rien d’autre n’a changé et le comportement dans le moteur est identique. Deuxième modification défensive dans le même chemin utilitaire : l’horodatage signalé par le harnais (1735690980000) est en MILLISECONDS, tandis que le moteur fournit des nanosecondes ; l’ancien code divisait systématiquement par 1e9, ce qui, dans le harnais, aurait ramené toutes les bougies synthétiques à la même heure/journée et figé la logique de session (un deuxième échec latent Layer-2 une fois le TypeError corrigé). Le nouveau _epoch_secs() normalise selon l’ordre de grandeur (ns/us/ms/s) et ne fait rien pour les vraies bougies en nanosecondes ; Layer-3 et le backtest réel ne sont donc pas affectés. La forme des signaux, les règles d’entrée/sortie, ATR, le dimensionnement, les imports et la structure de classe sont par ailleurs identiques au code qui avait déjà passé Layer 1.

Hypothèse à espérance négative sur un échantillon complet d’historique bien mesuré. Sur 594 transactions réparties sur 2020-2026, le report de session Asie->US est déficitaire : profit_factor 0.937 (<1), total_return -9.81%, espérance de -$17.34/transaction, Sharpe -0.15 avec CI [-0.760, 0.458] chevauchant zéro, information_ratio -0.76. La seule année positive est 2020 (+15.3%) ; toutes les années suivantes sont négatives ou stables (2021 -8.1, 2022 -5.8, 2025 -10.8), et le Sharpe glissant tend vers -8.3 en 2026 — l’hypothèse selon laquelle « un grand mouvement en Asie prédit le mouvement US » n’est tout simplement pas corroborée. La stratégie est également à la limite de la rentabilité après frais : avg_trade_return_pct 0.110% est inférieur au seuil de frais USD-M de Binance de 0.15% (L22). Avec seulement 2 paramètres libres et un avantage directionnel net négatif, l’optimisation ne peut inverser le signe d’un avantage inexistant. C’est la signature d’un perdant net de type fee_edge/no_edge — ne mérite pas 2 heures d’optimisation.

Implémentation

BTCUSDT.BINANCE USD-M perpétuel, barres 1H, avance-retard de session intraday long-short. Chaque jour UTC, le rendement de la session Asie (00:00-08:00 UTC ouverture-à-clôture) est accumulé incrémentalement et normalisé par l'écart-type des 30 derniers rendements Asie (repli de dispersion basé sur ATR pendant que cet historique se constitue), donnant un z-score continu invariant d'échelle renvoyé à chaque barre. À l'heure d'ouverture de la session US (13:00 UTC), la stratégie entre dans la direction SAME du……Afficher plusAfficher moins

BTCUSDT.BINANCE USD-M perpétuel, barres 1H, avance-retard de session intraday long-short. Chaque jour UTC, le rendement de la session Asie (00:00-08:00 UTC ouverture-à-clôture) est accumulé incrémentalement et normalisé par l'écart-type des 30 derniers rendements Asie (repli de dispersion basé sur ATR pendant que cet historique se constitue), donnant un z-score continu invariant d'échelle renvoyé à chaque barre. À l'heure d'ouverture de la session US (13:00 UTC), la stratégie entre dans la direction SAME du mouvement Asie lorsque |z| >= entry_z, au plus une entrée par jour calendaire. Elle sort à l'heure de clôture de la session US (20:00 UTC) de sorte que le portefeuille soit FLAT overnight (pas de funding, pas de risque de gap), ou plus tôt sur un stop basé sur ATR (stop_atr_mult x ATR, plancher à min_stop_pct). Le dimensionnement risque risk_frac des capitaux propres sur la distance du stop, plafonné à max_notional_frac x capitaux propres bruts. Tout l'état (ATR, rendement de session, deque de dispersion) est en O(1) par barre ; le roulement journalier est ancré sur le timestamp propre de la barre, et non sur un compteur de barres.

Résultats de vérification

CLEAN RESTART 2026-09-04 — l’historique des verdicts et les enregistrements d’apprentissage de cette exécution ont été supprimés, puis elle a été relancée à partir de la vérification. Son abandon précédent venait du pipeline, pas du marché : le harnais Layer-2 liait mal les méthodes utilitaires @staticmethod (corrigé), QA émettait des verdicts de performance définitifs lors d’un test exploratoire non optimisé (supprimé — QA évalue désormais uniquement la correction), et les délais d’attente du bac à sable provenaient de la pénurie de créneaux de backtest (corrigée). L’hypothèse et le code de la stratégie n’ont pas changé. Évaluez le code sur ses mérites ; la performance sera déterminée plus tard par le backtest complet et l’optimiseur.

Ajouter _param_bounds = {entry_z: [...], stop_atr_mult: [...]} en cohérence avec les limites du code ; laisser toutes les constantes d’heures de session/ATR/risque en dehors de cet espace.

La configuration déclare NO _param_bounds alors que l’hypothèse repose sur « seulement 2 FREE paramètres » afin de minimiser la pénalité de déflation liée à la sélection du meilleur résultat parmi -225 essais. Sans cela, l’optimiseur ne dispose d’aucun espace explicite qui le lie à {entry_z, stop_atr_mult}, ce qui affaiblit la discipline à 2 paramètres. Ce n’est pas un défaut de correction.

Définir us_exit_hour=21 pour toute la fenêtre, ou documenter 20:00 comme intentionnel.

L’hypothèse désigne la session US 13:00-21:00 UTC, mais us_exit_hour vaut 20, ce qui force une position plate une heure trop tôt. Écart mineur, qui ne change ni le mécanisme ni l’invariant de position plate pendant la nuit.

Revue du backtest

Sharpe
-0,15
Rendement total
-9,81%
Drawdown max
23,40%
Total des transactions
594
Taux de réussite
44,8%
Facteur de profit
0,94

Bien mesuré : 594 transactions sur l’intégralité de l’historique de 2020-2026 1H, avec un équilibre long/short (293/301) et une exécution sans anomalie (594 signaux, 594 ordres soumis, aucune perte d’ordre)

Famille de décalage intrajournalier entre sessions réellement distincte ; position plate pendant la nuit, faible corrélation avec l’indice de référence (0.025), aucune dépendance à un flux de données supplémentaire

Perdant net : profit_factor 0.937 (<1), total_return -9.81%, espérance de -$17.34/transaction, Sharpe -0.15 (CI chevauche zéro), information_ratio -0.76

avg_trade_return_pct 0.110% est inférieur au seuil de frais USD-M de Binance de 0.15% — à la limite de la rentabilité après frais, même en faisant abstraction de l’espérance négative

Seul 2020 (+15.3%) est significativement positif ; toutes les années suivantes sont négatives ou stables (2025 -10.8%), et le Sharpe glissant tend vers -8.3 en 2026 — le principe du report entre sessions ne présente pas d’avantage persistant

return_kurtosis 78.6 — cours irréguliers (par exemple, une journée à -6.07% le 2023-08-29) plutôt qu’un avantage régulier

Historique des itérations

Échec de la vérification (Layer 2 — scénarios synthétiques) : Paramètres utilisés : ['entry_z', 'min_bars', 'risk_frac', 'atr_period', 'min_notional', 'min_stop_pct', 'min_vol_days', 'us_exit_hour', 'asia_end_hour', 'stop_atr_mult', 'us_entry_hour', 'asia_start_hour', 'max_notional_frac', 'vol_lookback_days'] Vérifiez que __init__ définit tous les attributs à partir de self.parameters.get(). - steady_uptrend : TypeError: BtcAsiaToUsSessionCarryoverLS._day_of() takes 1 positional argument but 2 were given……Afficher plusAfficher moins

Échec de la vérification (Layer 2 — scénarios synthétiques) : Paramètres utilisés : ['entry_z', 'min_bars', 'risk_frac', 'atr_period', 'min_notional', 'min_stop_pct', 'min_vol_days', 'us_exit_hour', 'asia_end_hour', 'stop_atr_mult', 'us_entry_hour', 'asia_start_hour', 'max_notional_frac', 'vol_lookback_days'] Vérifiez que __init__ définit tous les attributs à partir de self.parameters.get(). - steady_uptrend : TypeError: BtcAsiaToUsSessionCarryoverLS._day_of() takes 1 positional argument but 2 were given (horodatage de la bougie : 1735690980000) - steady_downtrend : TypeError: BtcAsiaToUsSessionCarryoverLS._day_of() takes 1 positional argument but 2 were given (horodatage de la bougie : 1735690980000) - flat_ranging : TypeError: BtcAsiaToUsSessionCarryoverLS._day_of() takes 1 positional argument but 2 were given (horodatage de la bougie : 1735690980000) - volatility_spike : TypeError: BtcAsiaToUsSessionCarryoverLS._day_of() takes 1 positional argument but 2 were given (horodatage de la bougie : 1735690980000) - zero_volume : TypeError: BtcAsiaToUsSessionCarryoverLS._day_of() takes 1 positional argument but 2 were given (horodatage de la bougie : 1735690980000) - price_gap : TypeError: BtcAsiaToUsSessionCarryoverLS._day_of() takes 1 positional argument but 2 were given (horodatage de la bougie : 1735690980000)

Stratmill est un outil de recherche et de paper trading, pas un conseil financier ni un courtier. Les résultats de backtest et de paper trading sont hypothétiques. Le trading comporte un risque de perte.