Flow fra rebalancering af FX-afdækning ved månedens afslutning: Handl Euro ETF (FXE) mod US-aktiemarkedets bevægelse måned til dato frem mod månedens slutfix (USEQ 1-DAY, long/short, SPY signalben, flad cirka 85% af tiden)
Resultat: Opgivet
MonthEndFxHedgeRebalanceFxe
Resultatoversigt
Strategien forsøgte at indfange flowet fra afdækningsrebalancering ved månedsskiftet i EUR/USD ved at handle FXE mod SPYs bevægelse fra månedens start og holde positionen i 1-5 sessioner hen over månedsskiftet. Efter 2 iterationer havde det fulde 20-årige backtest 183 handler, et afkast på -5.0%, en Sharpe på -0.08 og et afkast pr. handel på -0.024%. Markedspåvirkningsomkostningerne oversteg den lille bruttofordel, og strategien tabte penge hvert år fra og med 2020. Analytikeren opgav den ved gennemgangen af backtestet på grund af negativ forventning og et signal uden målbar information. Analytikeren bemærkede, at dette kun afviser idéens daglige ETF-version, ikke artiklens resultat om intradag spot-EUR/USD ved London-fixet.
Afledt af Research Lead på grundlag af Melvin & Prins (2015, 'Sikring af egenkapital og valutakurser ved Londons 4 p.m.-fix'). Udenlandske institutioner, der ejer US-aktier, afdækker dollar-eksponeringen med FX-terminer og tilpasser disse afdækninger ved månedsslut omkring Londons 11:00 ET-fix. Hvis US-aktierne er steget fra månedens begyndelse til dato, skal de sælge mere USD, så EUR/USD har tendens til at stige frem mod fixet; hvis aktierne er faldet, køber de USD tilbage. Flowet er mekanisk og kalenderbestemt,……Vis mereVis mindre
Afledt af Research Lead på grundlag af Melvin & Prins (2015, 'Sikring af egenkapital og valutakurser ved Londons 4 p.m.-fix'). Udenlandske institutioner, der ejer US-aktier, afdækker dollar-eksponeringen med FX-terminer og tilpasser disse afdækninger ved månedsslut omkring Londons 11:00 ET-fix. Hvis US-aktierne er steget fra månedens begyndelse til dato, skal de sælge mere USD, så EUR/USD har tendens til at stige frem mod fixet; hvis aktierne er faldet, køber de USD tilbage. Flowet er mekanisk og kalenderbestemt, så fordelen er en likviditetspræmie, ikke en prognose. FXE.USEQ (en euro-ETF, reelt EUR/USD, historik fra dec. 2005) handles langt eller kort, og SPY.USEQ er signalbenet. På USEQ-dagsbarer udføres en beslutning ved én sessions lukning ved den næste sessions åbning; dette understøttes indbygget, så ingen erstatning er nødvendig. Ingen tidligere kørsel handler med en valuta eller bruger denne kanal. Forvent cirka 145 handler over cirka 20 år. Gebyrberegning: cirka 0.12% i bruttoafkast pr. handel mod cirka 0.04% i omkostninger tur-retur på USEQ, altså cirka 0.08% netto, omtrent 2x i omkostninger og over minimumsgrænsen på +0.05% USEQ. Risikokontrollen følger rute (b): kalenderbestemt exit med nominel værdi begrænset til 100% af egenkapitalen, uden gearing.
negative_expectancy. Sammenligning med grænsen: avg_trade_return_pct er -0.024% mod grænsen på +0.05% USEQ for gennemgang, baseret på et pålideligt udsnit på 183 månedsskiftehandler over 20 år (2006-2026). PF er 0.926, Sharpe -0.08, samlet afkast -5.0%, og maksimalt drawdown er 18.8% mod den forhåndsregistrerede 15%. Prognosen IC af SPYs z-score fra månedens start er 0.025 (t=0.72), så optimizer har intet signal at justere z_entry eller entry_sessions efter. Bruttoindtjeningen før markedspåvirkning er omkring……Vis mereVis mindre
negative_expectancy. Sammenligning med grænsen: avg_trade_return_pct er -0.024% mod grænsen på +0.05% USEQ for gennemgang, baseret på et pålideligt udsnit på 183 månedsskiftehandler over 20 år (2006-2026). PF er 0.926, Sharpe -0.08, samlet afkast -5.0%, og maksimalt drawdown er 18.8% mod den forhåndsregistrerede 15%. Prognosen IC af SPYs z-score fra månedens start er 0.025 (t=0.72), så optimizer har intet signal at justere z_entry eller entry_sessions efter. Bruttoindtjeningen før markedspåvirkning er omkring +0.10% pr. handel, men den modellerede markedspåvirkning fra FXE (122% af brutto; kapacitet omkring $67k) overstiger den. Hvert år fra 2020 til 2026 er negativt. QAs bekymring bekræftes af hele historikken. QAs foreslåede kontrol af entry_sessions=1 ligger inden for det justerbare interval, men et signal uden information på IC og en bruttofordel under markedspåvirkningen giver intet brugbart område at optimere efter. Afgrænsning: Dette afviser kun Research Leads operationalisering: FXE ETF på daglige barer, udførelse ved næste åbning og en beholdningsperiode på 1-5 sessioner hen over månedsskiftefixet. Det afviser ikke Melvin & Prins' resultat, som handler om intradag spot-EUR/USD ved London-fixet kl. 4pm, og som ikke kan isoleres med daglige ETF-barer. Der hævdes ingen regnskabs- eller datafejl.
Implementering
Månedsskifteflow fra rebalancering af FX-afdækning i FXE.USEQ (1-DAY), med SPY.USEQ som signalled. SPYs logaritmiske bevægelse fra månedens start z-scores med dens daglige volatilitet over 60 sessioner ganget med kvadratroden af antal forløbne sessioner. I løbet af de sidste entry_sessions sessioner før månedens sidste handelsdag: Hvis |z| >= z_entry, gå long FXE, når SPY er steget fra månedens start (udenlandske afdækkere sælger USD), eller gå short FXE, når SPY er faldet. Én handel om måneden. Positionen lukkes ved beslutningen ved lukketid på månedens sidste handelsdag. Alle USEQ beslutninger udføres ved næste sessions åbning.
Iteration 2 retter det kritiske fund QA. position_size() blev dimensioneret til præcis 100% af egenkapitalen ud fra beslutningsbarens lukning, men ordren udføres ved næste sessions åbning. Et gab opad plus gebyret bragte 1xs indledende margin over MTM af egenkapitalen, så det grundlæggende margintjek afviste ordren. Den afviste ordre blev derefter stående i _inflight_entries og blokerede alle senere indgange, hvilket er grunden til, at sandkassen viste 0-2 handler. Positionsstørrelsen anvender nu en size_buffer……Vis mereVis mindre
Iteration 2 retter det kritiske fund QA. position_size() blev dimensioneret til præcis 100% af egenkapitalen ud fra beslutningsbarens lukning, men ordren udføres ved næste sessions åbning. Et gab opad plus gebyret bragte 1xs indledende margin over MTM af egenkapitalen, så det grundlæggende margintjek afviste ordren. Den afviste ordre blev derefter stående i _inflight_entries og blokerede alle senere indgange, hvilket er grunden til, at sandkassen viste 0-2 handler. Positionsstørrelsen anvender nu en size_buffer på 0.97 (3% råderum, nok til FXEs største gab over natten), både på den nominelle værdi og på loftet på 100% af egenkapitalen. notional_fraction forbliver på 1.0, og gearingen på 1.0, som kontrakten fastsætter. Risikostyringen følger stadig metode (b): en kalenderbestemt exit, hvor hver position udgør højst 100% af egenkapitalen. Signal-, indgangs- og exitlogikken er uændret. Om advarslen QA: entry_month forbruges stadig i should_enter. Det fastholder reglen om én handel pr. månedsslutningsvindue, og marginafvisningen, der kunne få en ordre til at bortfalde, bør ikke længere forekomme. Rådgivende note: det forventede bruttoresultat på ~0.12% pr. handel er lille sammenlignet med FXEs daglige støj, så resultatet kan vise sig at være inkonklusivt.
Verifikationsresultater
Sæt eventuelt entry_month i on_position_opened (eller når udførelsen finder sted) i stedet for i should_enter.
should_enter() sætter entry_month, før ordrestørrelsen beregnes og ordren udføres. Hvis indgangen droppes (størrelse 0, under minimumsnotional eller afvist af marginchecket), springes resten af månedens vindue over. 0.97 size_buffer gør en margin-afvisning usandsynlig, så effekten er lille.
Ikke nødvendigt til research. Til paper trading kan du overveje at udlede entry_month fra den åbne positions ts_opened.
Skalartilstanden (entry_month, mtd_anchor, _spy_rets-deque) ligger i hukommelsen. Efter genstart af en paper-node genopbygger warmup signaltilstanden frem til calculate_signal, men entry_month starter igen ved 0. En genstart i et vindue, mens en position er åben, ville stadig udløse korrekt lukning, fordi cur_month != entry_month aktiverer should_exit. Dette har kun betydning ved genstarter; backtestet genstarter aldrig.
Med et 1561-dages vindue og standardparametre (z_entry 0.5, entry_sessions 3) lavede sandkassen 60 handler, gennemsnitligt -0.29% af notional, PF 0.37 og Sharpe -1.14. Den tabte penge i alle volatilitets-terciler og i 2022. Hypotesen forventer omkring +0.12% brutto pr. handel, hvilket er lidt sammenlignet med FXEs daglige støj (omkring 0.4-0.5%) over en beholdningsperiode på 1-5 sessioner. Den modellerede markedspåvirkning ($10.6k på $10.9M handlet, omkring 0.1% pr. roundtrip) ligger allerede tæt på den hævdede bruttoindtjening. Kontrollér først på hele historikken: prognosen IC af SPYs z-score fra månedens start mod FXEs afkast fra indgang til månedsskiftefixet, og om et vindue på 1 sessioner (entry_sessions=1, kun beholdt hen over den sidste dags fix) klarer sig bedre end en beholdningsperiode på 3-5 sessioner, hvor det meste er støj. Dette er en indledende testkørsel, så vurderingen er kun rådgivende og blokerer ikke.
Backtest-gennemgang
Sharpe
-0,08
Samlet afkast
-5,00%
Maks. drawdown
18,83%
Handler i alt
183
Gevinstrate
48,1%
Profit factor
0,93
Handlerne følger den angivne mekanisme: 183 månedsslutindgange over 20 år, tæt på de forudsagte ~145. Der var 119 lange positioner og 64 korte positioner, hvilket stemmer med, at SPY oftere stiger end falder fra månedens begyndelse til dato. Udgangene styres af kalenderen, eksponeringen er 11%, og der er ingen åbne positioner ved periodens afslutning.
Regnskabet stemmer: inputrevisionerne er rene, end_unrealized_pct er 0, og omkostningsbogen har ingen restpost.
Nettoforventningen er negativ i et pålideligt datagrundlag. avg_trade_return_pct er -0.024%, under grænsen på +0.05% USEQ (+0.10% foretrækkes). PF er 0.926, Sharpe -0.08 (CI -0.53 til 0.32) og samlet afkast -5.0%. Maksimalt drawdown er 18.8%, mod den forhåndsregistrerede 15%, og strategien har været under vand i 2,992 dage.
Prognosen indeholder ingen information: Det udførte signals IC er 0.025 (t=0.72, n=858). Diagnostikken vurderer det til rejected_no_information.
Omkostningerne dominerer. Den modellerede markedspåvirkning er $25.2k, 122% af brutto-PnL; kapaciteten for FXE er omkring $67k mod positioner på omkring $100k. Brutto før markedspåvirkning er omkring +$20k på omkring $19M roundtrip-notional, cirka +0.10% pr. handel. Det er tæt på hypotesens 0.12%, men markedspåvirkning på omkring 0.13% pr. roundtrip udvisker gevinsten.
Afkastet aftager: Strategien var positiv i de fleste år fra 2008 til 2019 og negativ hvert år fra 2020 til 2026 (2022 -3.9%, 2023 -3.4%, 2024 -3.75%, 2025 -2.8%, 2026 -3.2% YTD). Flowet, sådan som det indfanges her, er forsvundet fra nyere data.
Iterationshistorik
Verifikation mislykkedes (lag 4 — QA-gennemgang) [class=code_defect]: - [edge_concern] Hypotesen forventer en bruttoindtjening på omkring 0.12% pr. handel. Positionen holdes i 2-6 FXE-sessioner, hver med en daglig standardafvigelse på omkring 0.4-0.6%, og daglige barer omfatter vendingen efter fixet frem til sidste dags lukning samt gapet natten over til næste åbning, som udvikleren anerkender. Signal/støj-forholdet pr. handel er derfor meget lavt. Med omkring 145-180 handler over 20 år måles der sandsynligvis et……Vis mereVis mindre
Verifikation mislykkedes (lag 4 — QA-gennemgang) [class=code_defect]:
- [edge_concern] Hypotesen forventer en bruttoindtjening på omkring 0.12% pr. handel. Positionen holdes i 2-6 FXE-sessioner, hver med en daglig standardafvigelse på omkring 0.4-0.6%, og daglige barer omfatter vendingen efter fixet frem til sidste dags lukning samt gapet natten over til næste åbning, som udvikleren anerkender. Signal/støj-forholdet pr. handel er derfor meget lavt. Med omkring 145-180 handler over 20 år måles der sandsynligvis et inkonklusivt resultat eller tæt på nul snarere end et klart resultat. Shortpositioner i FXE betaler også modelleret låneomkostning (omkring $6.8 på en shortposition på $99k i 5 dage i min replay), hvilket betyder noget i forhold til et mål på 0.12%. Kun rådgivende.
- [kritisk] position_size() fastsætter størrelsen til præcis 100% af egenkapitalen, int(equity / decision-bar close), uden råderum. På en handelsplads med USEQ-sessioner udføres ordren ved åbningen af session NEXT, og basens margincheck i submit_order() (refuse_over_margin, prissat ud fra cachen i stedet for beslutningskursen ved lukning) afviser en ordre, hvis dens 1x initialmargin plus gebyrer overstiger MTM egenkapital med blot nogle få dollar. Jeg reproducerede dette med den faktiske BacktestRunner (USEQ, 2020-03-17 til 2026-10-09, kontraktens standardindstillinger). Handel 1 (SHORT 956 FXE, 2020-03-27 til 2020-04-01) blev udført. På 2020-04-27 blev loggen 'Order refused: BUY 979 FXE.USEQ would need more initial margin than the account holds at 1x leverage' skrevet. Basisskabelonen havde allerede registreret den afviste ordre i _inflight_entries, før submit_order() returnerede. Ordren indsendes aldrig og lukkes derfor aldrig, og _entry_order_inflight() returnerer True resten af kørslen. Alle senere indgange (60 af 62) droppes som 'Blocked stacked entry ... still in flight'. entry_diag: entries_submitted 62, denied_margin 1, dropped_entry_inflight 60. Resultatet er én eller to handler i 6.5 år, hvor signalet udløses 64 gange; min offline-replay af samme logik på katalogets barer giver 183 indgange over 2006-2026. Derfor viste lag -3-sandkassen 0 handler, og et backtest med hele historikken ville måle en fastlåst strategi snarere end hypotesen. (linje 131) — rettelse: Giv plads til gapet ved næste åbning, gebyret og MTM-drift, mens kontraktens notional_fraction=1.0 og loftet på 100% af egenkapitalen bevares. For eksempel: notional = equity * min(notional_fraction, 1.0) * leverage * 0.97, derefter min(notional, 0.97 * equity). En buffer på 3% dækker FXEs største overnight-gap. Kun hvis du ønsker ekstra sikkerhed, kan du også sammenligne den beregnede størrelse med den tilgængelige margin, før den returneres. Kør derefter sandkassetesten igen: den bør vise omkring én handel pr. kvalificerende månedsskifte, ikke 0-2.
- [advarsel] should_enter() sætter entry_month, før ordrestørrelsen beregnes eller ordren godkendes. Hvis basen dropper ordren (margin, minimumsnotional, størrelse 0), er måneden brugt, og senere sessioner i vinduet kan ikke forsøge igen. Det er acceptabelt for 'én handel pr. månedsskiftevindue', men en måned går ubemærket tabt, hvis en ordre droppes. (linje 114) — rettelse: Valgfrit: Sæt entry_month i on_position_opened (eller ved udførelse), eller accepter adfærden og dokumentér den.
- [advarsel] min_bars_required() er tilsidesat til vol_lookback + 2 = 62. Det er tilsigtet og i orden. Bemærk, at z-scoren allerede kræver max(5, vol_lookback // 2) afkast samt en gyldig månedsreference, så den første indgang kan ikke ske før cirka bar 62. (linje 49) — rettelse: Ingen ændring nødvendig.
Sørg for plads til næste åbningskursgab, gebyret og MTM-udsving, samtidig med at kontraktens notional_fraction=1.0 og grænsen på 100% af egenkapitalen overholdes. Eksempel: nominel værdi = egenkapital * min(notional_fraction, 1.0) * gearing * 0.97, derefter min(nominel værdi, 0.97 * egenkapital). En buffer på 3% dækker FXEs største gab natten over. Kun hvis du ønsker ekstra sikkerhed, skal den beregnede størrelse også sammenlignes med den tilgængelige margen, før den returneres. Kør derefter sandkassen igen: den bør vise cirka én handel pr. kvalificerende månedsslut, ikke 0-2.
position_size() fastsætter størrelsen til præcis 100% af egenkapitalen, int(equity / decision-bar close), uden råderum. På en handelsplads med USEQ-sessioner udføres ordren ved åbningen af session NEXT, og basens margincheck i submit_order() (refuse_over_margin, prissat ud fra cachen i stedet for beslutningskursen ved lukning) afviser en ordre, hvis dens 1x initialmargin plus gebyrer overstiger MTM egenkapital med blot nogle få dollar. Jeg reproducerede dette med den faktiske BacktestRunner (USEQ, 2020-03-17 til……Vis mereVis mindre
position_size() fastsætter størrelsen til præcis 100% af egenkapitalen, int(equity / decision-bar close), uden råderum. På en handelsplads med USEQ-sessioner udføres ordren ved åbningen af session NEXT, og basens margincheck i submit_order() (refuse_over_margin, prissat ud fra cachen i stedet for beslutningskursen ved lukning) afviser en ordre, hvis dens 1x initialmargin plus gebyrer overstiger MTM egenkapital med blot nogle få dollar. Jeg reproducerede dette med den faktiske BacktestRunner (USEQ, 2020-03-17 til 2026-10-09, kontraktens standardindstillinger). Handel 1 (SHORT 956 FXE, 2020-03-27 til 2020-04-01) blev udført. På 2020-04-27 blev loggen 'Order refused: BUY 979 FXE.USEQ would need more initial margin than the account holds at 1x leverage' skrevet. Basisskabelonen havde allerede registreret den afviste ordre i _inflight_entries, før submit_order() returnerede. Ordren indsendes aldrig og lukkes derfor aldrig, og _entry_order_inflight() returnerer True resten af kørslen. Alle senere indgange (60 af 62) droppes som 'Blocked stacked entry ... still in flight'. entry_diag: entries_submitted 62, denied_margin 1, dropped_entry_inflight 60. Resultatet er én eller to handler i 6.5 år, hvor signalet udløses 64 gange; min offline-replay af samme logik på katalogets barer giver 183 indgange over 2006-2026. Derfor viste lag -3-sandkassen 0 handler, og backtestet med hele historikken ville måle en fastlåst strategi snarere end hypotesen.
Valgfrit: Sæt entry_month i on_position_opened (eller ved udførelse), eller acceptér adfærden og dokumentér den.
should_enter() sætter entry_month, før ordren dimensioneres eller godkendes. Hvis basen dropper ordren (margin, minimumsnotional, størrelse 0), er måneden brugt, og senere sessioner i vinduet kan ikke forsøge igen. Det er acceptabelt for 'én handel pr. månedsskiftevindue', men en måned går ubemærket tabt, hvis en ordre droppes.
Ingen ændring påkrævet.
min_bars_required() tilsidesættes til vol_lookback + 2 = 62. Det er tilsigtet og i orden. Bemærk, at z-scoren allerede kræver max(5, vol_lookback // 2) afkast plus en gyldig månedsreference, så den første indgang kan ikke ske før cirka bar 62.
Resultatoversigt
Test af et intradag FX-fix-flow med daglige ETF-barer og udførelse ved næste åbning placerer markedspåvirkningen for en lavkapacitets-ETF (omkring $67k) over den omtrentlige bruttofordel på 0.10%. Effekten kræver derfor intradag spotdata tæt på fixet for at kunne testes ordentligt.
Strategien blev opgivet ved gennemgangen af backtestet, før optimering, på grund af negativ forventning: avg_trade_return_pct af -0.024% mod grænsen på +0.05% USEQ, et signal IC af 0.025 (t=0.72, vurderet uden information) og drawdown over den forhåndsregistrerede 15%. Hvert år fra 2020 til 2026 var negativt.
Med udgangspunkt i Melvin & Prins (2015) handlede strategien euroen ETF FXE.USEQ long eller short i retning af SPYs z-scorede bevægelse fra månedens start i løbet af de sidste sessioner hver måned. Hypotesen var, at udenlandske aktieejere, der tilpasser deres USD-afdækning ved månedsskiftefixet, ville presse EUR/USD i den retning.
På tværs af 183 månedsskiftehandler fra 2006 til 2026 var det samlede afkast -5.0%, Sharpe -0.08 (CI -0.53 til 0.32), profit factor 0.926, avg_trade_return_pct -0.024% og maksimalt drawdown 18.8%. Bruttoindtjeningen før markedspåvirkning var omkring +0.10% pr. handel, men den modellerede markedspåvirkning fra FXE ($25.2k, 122% af brutto-PnL) gjorde resultatet negativt.
Stratmill er et research- og papirhandelsværktøj, ikke finansiel rådgivning eller en mægler. Backtest- og papirresultater er hypotetiske. Handel indebærer risiko for tab.