Type/to search
2
Follow
484
Followers
Stratégie quantitative de filtrage par moyennes mobiles : une pratique quantitative de la pensée de Harness Engineer
Discussions
Created 2026-04-17 11:55:34  Updated 2026-04-21 09:00:18
 0
 374

img

Introduction : La pensée de l'ingénieur Harness

Récemment, dans la communauté de l'ingénierie IA/ML, une approche de plus en plus discutée émerge : l'ingénieur Harness.

Son principe central est simple :

Plutôt que de donner une réponse de manière intuitive, il vaut mieux construire un cadre qui permet aux données et aux expériences de trouver elles-mêmes la réponse.

La méthode traditionnelle de l'ingénieur : Je pense que le paramètre A est bon, donc j'écris le code pour implémenter A. La méthode de l'ingénieur Harness : Je ne sais pas si A, B ou C est le meilleur, donc je construis un cadre qui exécute A, B et C simultanément, et les données me donnent la réponse.

L'ingénieur définit l'espace de recherche et les critères d'évaluation, et le système optimise automatiquement cet espace. Cette approche correspond, en ML, à la walk-forward optimization et à l'AutoML ; dans le domaine quantitatif, elle trouve également des applications naturelles.

img

Les pièces explosives : le terrain le plus favorable aux tendances

Dans le marché des contrats crypto, certaines pièces méritent une attention particulière : les pièces explosives, caractérisées par des volumes de transaction très élevés.

Ces pièces partagent plusieurs traits communs :

  • Forte concentration de capitaux, avec des comportements manifestes des acteurs principaux.
  • Continuité de tendance relativement forte : une fois qu'une tendance s'amorce, elle dure souvent plus longtemps.
  • Volatilité élevée : certaines pièces à fort volume montrent une tendance marquée sur des périodes spécifiques, et les stratégies de moyennes mobiles ont historiquement bien performé sur ces actifs.

C'est pourquoi l'utilisation de la stratégie classique du croisement de deux moyennes mobiles sur ce type de pièces constitue un point de départ simple et pertinent. Lorsque la moyenne rapide croise au-dessus de la lente, la tendance démarre, on suit ; lorsqu'elle croise en dessous, la tendance s'inverse, on sort. La logique est simple, mais sur des actifs à tendance claire, les performances historiques ne sont souvent pas mauvaises.

Un seul problème : quelles pièces sont explosives ? Quelle paire de paramètres de moyennes mobiles utiliser ?

Ces deux questions, si on les traite manuellement, sont trop subjectives : une autre personne pourrait arriver à des réponses totalement différentes. De plus, le marché est dynamique : la pièce explosive d'aujourd'hui ne le sera pas forcément demain, et la combinaison de paramètres efficace aujourd'hui pourrait devenir obsolète demain.

C'est là qu'intervient la pensée de l'ingénieur Harness.

Plutôt que de sélectionner manuellement les pièces et de régler les paramètres, il vaut mieux laisser le cadre résoudre ces deux problèmes : définir des critères d'évaluation, laisser les données historiques trouver les réponses dans l'espace candidat. L'humain n'a qu'à décider quel standard utiliser pour mesurer la qualité, et le système fait le reste.

Basé sur cette idée, la stratégie entière a été conçue comme un cadre de filtrage glissant, fonctionnant sur trois niveaux.

img

Architecture de la stratégie : un mécanisme de compétition à deux niveaux

Premier niveau : construction du pool d'actifs

Parmi tous les contrats du marché, on sélectionne les 150 premières pièces en termes de volume en dollars américains, pour constituer le pool candidat.

Pourquoi le volume ? Parce que là où le volume est élevé, les capitaux sont les plus concentrés, les tendances se forment le plus facilement, et les pièces explosives sont les plus denses. Cette étape ne fait appel à aucun jugement subjectif : ce sont purement les capitaux du marché qui votent. Plus le volume de transaction est élevé, plus la pièce entre dans le pool.

javascript
const filtered = tickers .filter(t => t.Symbol.endsWith('USDT.swap')) .map(t => ({ symbol: t.Symbol, quoteVolume: t.Last * t.Volume })) .sort((a, b) => b.quoteVolume - a.quoteVolume) .slice(0, topN) .map(t => t.symbol);

La logique est très directe : filtrer les contrats perpétuels USDT, calculer le volume en dollars, trier par ordre décroissant, prendre les N premiers. Aucun jugement subjectif : ce sont les capitaux du marché qui votent.

Deuxième niveau : sélection par double compétition

C'est la partie la plus centrale de la stratégie, et celle où la pensée Harness est la plus évidente.

L'ordre d'exécution correct est le suivant :

img

⚠️ Attention : utiliser le score des paramètres optimaux pour représenter la capacité d'une pièce comporte un certain risque de surapprentissage – les paramètres qui ont bien fonctionné historiquement ne seront pas nécessairement aussi efficaces à l'avenir. Cette limitation sera discutée plus en détail dans la suite de l'article.

Processus de backtest

Pour chaque pièce du pool candidat, on exécute simultanément plusieurs combinaisons de paramètres de moyennes mobiles (MA). Chaque combinaison tourne indépendamment sur les données historiques de chandeliers, simulant la logique réelle d'ouverture et de fermeture de positions par croisement :

javascript
// 遍历每个币种 × 每组参数组合 for (const params of maParamsList) { const bt = backtest_MA(records, params.fast, params.slow); // 每组回测独立得出:胜率、盈亏比、最大回撤、信号次数 }

Le cœur de chaque backtest est le croisement standard de deux MA :

javascript
const crossUp = fastMA[i-1] <= slowMA[i-1] && fastMA[i] > slowMA[i]; const crossDown = fastMA[i-1] >= slowMA[i-1] && fastMA[i] < slowMA[i]; if (crossUp) position = { side: 'long', entryPrice: records[i].Close }; if (crossDown) position = { side: 'short', entryPrice: records[i].Close };

Score composite

Après le backtest, on calcule un score composite pour chaque combinaison de paramètres. Ce score est composé de deux parties :

Score pondéré normalisé (coefficient total 0.80) :

javascript
const score = Math.min(bt.winRate * 100, 100) * 0.30 // 胜率,上限封顶100 + Math.min(bt.profitFactor * 20, 60) * 0.30 // 盈亏比,上限封顶60 + Math.max(0, 1 - bt.maxDrawdown / maxMDD) * 100 * 0.20 // 最大回撤控制 + volPct * volPctBonus // 波动率分位奖励加分项

Bonus de rang de volatilité : Le dernier terme volPct × volPctBonus (coefficient par défaut de 10) est une prime indépendante du système de pondération, visant à favoriser, à score égal, les pièces dont la volatilité actuelle se situe dans un percentile historique élevé – car ces pièces ont tendance à être plus actives en termes de tendance.

Il est important de noter que ces pondérations et coefficients de prime sont fixés empiriquement et non obtenus par optimisation ; ils peuvent être ajustés en fonction des conditions de marché lors de l'utilisation réelle.

Première compétition : compétition de paramètres

Pour une même pièce, plusieurs combinaisons de paramètres obtiennent chacune un score. On retient le score le plus élevé comme score représentatif de la pièce, ainsi que les paramètres optimaux correspondants :

javascript
if (score > bestScore) { bestScore = score; bestResult = bt; bestParams = params; // 记录当前历史表现最优的参数组合 }

Deuxième compétition : compétition entre pièces

Toutes les pièces présentent leur meilleur score respectif. On les classe par ordre décroissant et on sélectionne les N premières pour former la liste blanche :

javascript
results.sort((a, b) => b.score - a.score); const whitelist = results.slice(0, topCoins).map(r => r.coin);

Le résultat final est, pour chaque pièce de la liste blanche, un paramètre de moyenne mobile optimal spécifique, et non un paramètre unique appliqué à toutes.

Troisième niveau : exécution en temps réel et gestion des risques

On utilise la configuration sélectionnée pour trader en temps réel, avec plusieurs couches de gestion des risques :

Déclenchement des signaux : Surveillance en temps réel des croisements de MA pour les pièces de la liste blanche. Croisement haussier → achat, croisement baissier → vente à découvert :

javascript
const crossUp = fastPrev <= slowPrev && fastCur > slowCur; const crossDown = fastPrev >= slowPrev && fastCur < slowCur; if (crossUp) longList.push(sym); if (crossDown && allowShort) shortList.push(sym);

Stop suiveur dynamique : Activé lorsque le gain flottant atteint un seuil. Le seuil de retrait se resserre dynamiquement avec l'augmentation du gain. Les trois paliers sont fixés empiriquement : plus le gain est élevé, plus la tolérance au retrait est faible, afin de verrouiller les profits :

javascript
function getDynamicTrailDrawdown(maxPnl) { if (maxPnl >= 7) return 3; // 浮盈高,回撤容忍收紧 if (maxPnl >= 4) return 2; return 1.5; // 浮盈低,给行情多一点空间 }

Perception de l'état du marché : Détection du percentile de volatilité du BTC. En environnement de forte volatilité, on réduit automatiquement le coefficient de taille de position ; en cas de volatilité extrême, on interdit les ventes à découvert :

javascript
if (marketState === 'volatile') positionScaleDown = 0.5; else if (marketState === 'high_vol') positionScaleDown = 0.8; else if (marketState === 'low_vol') positionScaleDown = 0.7;

L'ensemble du processus de filtrage est réexécuté périodiquement en mode glissant, sans s'accrocher à une configuration fixe ; la liste blanche et les paramètres sont mis à jour dynamiquement en fonction du marché.


Hypothèse sous-jacente : la persistance de la tendance

Ce cadre repose sur une hypothèse centrale :

Les pièces et les paramètres qui ont bien performé dans l'histoire récente ont une certaine probabilité de continuer à bien performer dans un avenir proche.

Ce n’est pas de la superstition : il y a derrière une certaine logique de marché — l’inertie des capitaux, la persistance du sentiment de marché, la cohérence des comportements des acteurs dominants — qui permettent aux tendances de rester valables dans une certaine fenêtre temporelle.

Mais il faut être honnête : cette hypothèse n’a pas fait l’objet d’une validation statistique rigoureuse ; il s’agit davantage d’un jugement empirique. La pérennité du cadre en trading réel dépendra en fin de compte de la vérification par des données de transactions réelles.


Quelle est la différence avec un véritable Harness Engineer ?

Il faut bien le préciser.

Cette stratégie possède la forme d’un Harness, mais elle reste nettement en retrait par rapport au véritable système Harness Engineer :

DimensionVéritable HarnessCette stratégie
Division des échantillonsEnsemble d’entraînement + ensemble de validation + ensemble de test (holdout)Backtest sur l’intégralité des données historiques, sans validation hors échantillon
Protection contre le surapprentissageTest explicite de généralisationCompensation partielle par la diversité des paramètres, mais incomplète
Isolation des expériencesChaque variante fonctionne indépendamment sans interférencePartage les mêmes bougies, avec un couplage implicite
Seuil de mise en productionDoit passer la validation avant déploiementLe score le plus élevé est directement mis en production, sans couche de validation secondaire
Accumulation des erreursÉvaluation indépendante à chaque niveauLes deux niveaux de compétition reposent tous deux sur l’optimum historique, accumulation des erreurs

L’écart central est le suivant : un véritable Harness se demande « ce résultat reste-t-il valable hors échantillon ? », tandis que dans cette stratégie, l’« optimum » sélectionné par les deux niveaux de compétition est, par essence, un optimum historique — le surapprentissage au niveau des paramètres se cumule avec celui au niveau des paires de cryptomonnaies. La question de savoir s’il se prolongera dans le futur reste toujours ouverte.


Conclusion : chercher une épée tombée dans l’eau, ou tenter sa chance ?

Dans le monde du trading quantitatif, prédire a toujours été extrêmement difficile.

Beaucoup diront que sélectionner des paramètres sur des données historiques puis les appliquer en réel revient à chercher une épée tombée dans l’eau — l’épée a déjà coulé, l’entaille que vous avez faite sur le bateau ne vous aidera pas à la retrouver. Le marché change, les paramètres efficaces deviennent obsolètes, la pièce miracle d’aujourd’hui peut retomber dans l’oubli demain, la meilleure moyenne mobile d’hier peut n’être que du bruit aujourd’hui.

Cette critique n’est pas infondée.

Mais en contrepartie, il faut tenter les expériences qui méritent de l’être.

L’essence du trading quantitatif n’a jamais été de trouver une réponse juste pour toujours, mais d’améliorer systématiquement les chances de gagner dans l’incertitude. Même pour chercher une épée tombée dans l’eau, il faut d’abord avoir un bateau et faire cette entaille — positionner la stratégie (le bateau) est déjà le commencement du quantitatif.

Bien entendu, le cadre lui-même ne garantit pas les profits. Disposer d’un cadre n’est que le point de départ ; la véritable valeur réside dans l’exécution et l’itération continues : la liste blanche peut être ajustée, les poids de notation modifiés, l’espace des paramètres élargi, les take-profit et stop-loss optimisés. Chaque ajustement est une nouvelle expérience qui rapproche ce cadre du véritable Harness.

Le chemin se trace en marchant, pas en réfléchissant.

Code source de la stratégie : Stratégie quantitative de filtrage des moyennes mobiles Harness Engineer

Comment
All comments (0)
No data
No data
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)