Mga Estratehiya
Pagpapatuloy ng Earnings-Gap (PEAD Proxy), Long-Short na Basket na Batay sa Pangyayari sa 20 na Likidong US na Malalaking Kumpanya (USEQ 1-DAY — pumasok sa CLOSE ng isang overnight gap na may mataas na volume at >=3-sigma, sundan ang drift matapos ang anunsyo sa humigit-kumulang 15 na session, 3-parametro)
Resulta: Inabandona
UsLargeCapEarningsGapContinuationLS
Buod ng Resulta
Nag-trade ang UsLargeCapEarningsGapContinuationLS sa post-earnings drift sa 20 US large cap, pumapasok sa pagsasara matapos ang high-volume na overnight gap na humigit-kumulang 3 sigma o higit pa at sumusunod sa direksiyon ng gap. Mukhang maganda ang nakaulat na optimization: 58.65% return, Sharpe na 1.28 sa 148 trade, 4.20% average return bawat trade, pumasa sa holdout (Sharpe na 1.52) at PBO 0.27. Gayunman, hindi ito pumasa sa programme-wide FDR check, at halos lahat ng trade ay long (133 sa 148). Sa iteration 8, pumalya ang code sa Layer 3 sandbox backtest dahil lumampas sa limitasyong 300 segundo; itinigil ang run bago magbigay ng hatol ang analyst o risk team.
Hypothesis
verification_loop: sandbox_timeout: Nabigo ang verification (Layer 3 — sandbox backtest): lumampas sa 300 segundo ang smoke test sa ~20000-bar na window (2400 araw ng META.USEQ-1-DAY-LAST-EXTERNAL). Karaniwang nangangahulugan ito na lumalaki kasabay ng history ang trabaho bawat bar — halimbawa, muling sinusuri ang buong funding/supplementary series, o muling binubuo ang listahan at tinatawag ang min()/sorted() sa loob ng calculate_signal()/on_bar() sa bawat bar. Paunang kalkulahin ang mga nakaayos na timestamp array ONCE sa __init__ at gumamit ng bisect, o mag-cache ng mga lookup ayon sa timestamp, para O(log n) sa halip na O(n) ang gastos bawat bar.
Implementasyon
Event-driven na basket na long/short at nagte-trade sa post-earnings drift sa 20 likidong US large cap (USEQ, daily bar). Bawat session, naghahanap ito ng anumang stock na may overnight gap na hindi bababa sa gap_sigma_threshold (default na 4) ulit ng daily sigma nito sa loob ng 60 session, at may average volume na hindi bababa sa 2x. Pumapasok ito sa pagsasara ng araw na iyon, sa direksiyon ng gap. Nagsasara ang posisyon sa unang mangyari sa mga ito: ganap na mapunan ang gap (magsara ang presyo pabalik lampas sa pagsasara bago ang event), magkaroon ng bagong salungat na gap na hindi bababa sa 2 sigma at may volume na hindi bababa sa 1.5x, umabot sa 5-session time stop kung mas mababa ang return sa 0.5x entry sigma, o lumipas ang 20 session. Ang laki ng posisyon ay equity x 7.5% x clamp(1.8% / sigma, 0.5, 1.5), na may hindi hihigit sa 10 pangalan at gross na nililimitahan sa 1.5x ng equity. Itinatala sa bawat pagsasara ang aktuwal na return ng long at short leg at ang bilang ng bawat dahilan ng pagsasara.
Mga Resulta ng Beripikasyon
sandbox_timeout: Nabigo ang verification (Layer 3 — sandbox backtest): lumampas sa 300 segundo ang smoke test sa ~20000-bar na window (2400 araw ng META.USEQ-1-DAY-LAST-EXTERNAL). Karaniwang nangangahulugan ito na lumalaki kasabay ng history ang trabaho bawat bar — halimbawa, muling sinusuri ang buong funding/supplementary series, o muling binubuo ang listahan at tinatawag ang min()/sorted() sa loob ng calculate_signal()/on_bar() sa bawat bar. Paunang kalkulahin ang mga nakaayos na timestamp array ONCE sa __init__ at gumamit ng bisect, o mag-cache ng mga lookup ayon sa timestamp, para O(log n) sa halip na O(n) ang gastos bawat bar.
Hindi kailangan ng pagbabago sa code para sa hypothesis na ito. Kung nais ng analyst na limitahan ang epekto, patakbuhin muli nang bahagyang mas mataas ang _volume_mult (hal. 2.2) at tiyaking matatag ang bilang ng trade at kita bawat trade — hindi dapat nasa bingit ang gate.
Imbes na index, itabi sa _entry_sess ang session TIMESTAMP (self._entry_sess[iid] = self._session_ts[-1], saka gumamit ng bisect gaya ng ts_opened path), o ibawas ang offset ng pagputol sa bawat nakaimbak na index kapag pinaiikli ang _session_ts.
Nakatagong panganib ng lipas na index sa fallback path ng _sessions_held. Iniimbak ng self._entry_sess ang ABSOLUTE index sa self._session_ts, pero pinuputol ng calculate_signal ang listahang iyon (kapag len > 600, pinapalitan ito ng huling 400 entry), kaya nalilipat ng 201 ang bawat index nang hindi ina-update ang _entry_sess. Kung ginagamit ang nakaimbak na index bago putulin, magiging negatibo ang (n - 1) - start, at ibinabalik naman ng max(0, ...) sa zero ang orasan ng paghawak; dahil dito, maaaring manatili nang walang hanggan ang isang posisyon. Hindi naaabot sa ngayon ang path na ito: ginagamit lang ito kapag ts_opened ng posisyon ay 0/wala o mas luma kaysa _session_ts[0], at palaging pinupunan ng NautilusTrader ang Position.ts_opened sa backtest, paper at live trading, habang humigit-kumulang 26x lang ang hold_days ng 30 para sa grid na nagpapanatili ng 400 session. Itinuturing itong nakatagong panganib, hindi aktibo.
Pagsusuri
Buod ng Resulta
Dapat panatilihin ng multi-leg daily basket ang O(log n) o mas mahusay na gawain bawat bar (kalkulahin nang isang beses ang mga array, gumamit ng bisect, mag-cache ng mga lookup), kung hindi ay magtatagal nang lampas sa oras ang verification gaano man kalakas ang edge. Suriin muna ang tabinging halo ng long/short (133 laban sa 15 trade) bago mag-tune ng magkakahiwalay na threshold para sa bawat leg.
Pagkaraan ng 8 iteration, iniwan ang run sa verification loop. Nag-timeout ang backtest sa sandbox ng Layer 3, lumampas sa 300s na limitasyon sa wall-clock sa ~20,000-bar na window (2,400 araw ng META.USEQ pang-araw-araw na bar), kaya hindi umabot sa backtest review, analysis o risk review ang pinakabagong bersyon. Walang naitalang hatol mula sa analyst o risk reviewer.
Kunin ang post-earnings-announcement drift sa 20 likidong US large cap (USEQ, daily bar) nang walang earnings calendar: maghanap ng overnight gap na humigit-kumulang 3 sigma o higit pa, na may average volume na hindi bababa sa 2x; pumasok sa pagsasara ng araw na iyon sa direksiyon ng gap (long o short), at humawak nang takdang bilang ng session.
Ipinakikita ng optimization report na nakatala (2012-05-18 hanggang 2023-12-29) ang kabuuang return na 58.65%, Sharpe na 1.28, 148 trade (133 long, 15 short), average return bawat trade na 4.20%, win rate na 67.6% at max drawdown na 3.35%. Ang walk-forward na out-of-sample Sharpe ay 1.08, PBO 0.27, at pumasa ang holdout na may Sharpe na 1.52 sa 39 trade, ngunit hindi nakaligtas ang estratehiya sa pagsusuring FDR sa antas ng programa (p=0.0131; pinanatili ng BH sa q=0.10 ang 4 sa 301 kandidato).
Pagsusuri ng Backtest
- Sharpe
- 0.57
- Kabuuang Return
- 68.71%
- Max Drawdown
- 5.94%
- Kabuuang Trade
- 532
- Win Rate
- 57.3%
- Profit Factor
- 1.58
Ang Stratmill ay isang tool para sa pananaliksik at paper trading, hindi payo sa pananalapi o isang broker. Ang mga resulta ng backtest at paper trading ay hypothetical. May panganib ng pagkalugi ang pangangalakal.