Lumaktaw papunta sa nilalaman
Lahat ng estratehiya

Mga Estratehiya

SPY Estratehiya sa Kalendaryong Pangkalahating Buwan na Nakabatay sa Lakas ng Merkado

Resulta: Inabandona

SpyStrengthConditionedHalfMonthCalendar

Buod ng Resulta

Sinubok ng estratehiyang ito kung gumagana sa SPY ang tuntunin para sa Chinese index (epekto sa kalahating buwan batay sa lakas ng merkado). Sa loob ng 30 taon at 252 trade, nagbalik ito ng +19.6% na may Sharpe na 0.15, at nagmula ang mga kita nito sa halos 25% notional na long exposure. Nalugi ang short leg kahit wala pang gastos. Pagkaraan ng 3 ulit, iniwan ito ng analyst: walang impormasyong dala ang signal (IC 0.013, t=0.24), negatibo ang alpha, umabot ang drawdown sa 23.0% laban sa limitasyong 15%, at nabigo ang walk-forward. Saklaw lang ng hatol ang paglipat ng tuntunin sa daily bar ng SPY, hindi ang orihinal na resulta sa Chinese index.

Hypothesis

Pag-aangkop na hango sa epekto ng pagsisimula ng buwan batay sa lakas ng merkado ng Guosen Securities, na inilathala ng BigQuant 宽邦. I-trade ang SPY.USEQ gamit ang mga bar na 1-DAY: manatiling long sa malalakas na merkado; sa mas mahihinang merkado, mag-long bago ang araw 15 ng kalendaryo at mag-short mula araw 15 pataas. Tungkol sa mga Chinese index ang orihinal na ulat. Sinusubok ng eksperimentong ito kung maililipat ang tuntunin sa likidong index na US ETF; hindi nito ginagaya ang ulat o tinatanggap ang sinasabing kita nito. Dahil hindi napatunayan ang buong depinisyon ng RPS ng PDF, gamitin ang tahasang nakatalang causal proxy sa ibaba.

Panatilihin ang mekanismong nakabatay sa kalendaryo ng index ng pinagmulan sa halip na mag-imbento ng seasonal edge sa crypto. May ilang dekadang daily history ang USEQ at mababa ang gastos sa execution. Tinutugunan ng long/short exposure ang konsentrasyong 82.6% na long-only ng portfolio at iniiwasang magdagdag ng isa pang eksperimento sa Binance. Makatuwiran ang iisang simbolo dahil idinisenyo ang timing ng index sa pinagmulan. Walang laman ang corpus_concentration, kaya hindi mapatutunayan ang pagiging bago para sa partikular na instrumento. Naiiba ito sa nabigong SPY na one-session overshoot fade at sector momentum rotation dahil sa tuntunin nitong may hawak batay sa kalendaryo. Hindi sapat na dahilan ang kakulangan sa options at Hyperliquid para ilipat ang mekanismo ng kalendaryo ng equity sa mga instrumentong hindi angkop.

premise_falsified (no_edge). Walang ipinakitang halaga ang tuntuning ito sa kalendaryo sa tatlumpung taon ng datos ng SPY. Negatibo ang alpha nito, -0.47 ang information ratio kumpara sa SPY, at IC ang signal na 0.013 (t=0.24). Hindi mga bayarin ang dahilan: 0.291% kada trade kumpara sa minimum na 0.05%. Nilalabag ng estratehiya ang sarili nitong limitasyong 15% sa drawdown (23.0%), at tinanggihan ito ng walk-forward dahil kulang ang saklaw ng kandidato. Dahil walang parameter na maaaring i-tune, hindi mababago ng pag-ulit ang resulta. Iniwan din ang mga naunang estratehiya sa kalendaryo na SPY at QQQ (siklo ng pag-expire ng option, pagtatapos ng buwan ng pensiyon, QQQ na paglipat ng buwan). Saklaw ng hatol na ito ang paglipat lang ng epekto ng pagsisimula ng buwan ng Guosen sa mga daily bar ng SPY. Hindi nito sinusubok ang orihinal na resulta sa Chinese index. Dapat itigil ng pananaliksik ang pagmumungkahi ng mga estratehiya sa kalendaryo na kalahating buwan sa mga large-cap index ng US.

Implementasyon

Nagte-trade ng SPY.USEQ sa mga daily bar. Ang lakas ng merkado ay ang 10-araw na average ng ranggo ng presyo ng SPY sa loob ng 252 araw. Kapag 0.6 o mas mataas ang lakas, nagho-hold ng long ang estratehiya. Kapag mas mababa sa 0.6, long ito sa mga session bago ang ika-15 ng buwan at short mula ika-15 pataas, batay sa araw ng kalendaryo ng susunod na session. Ginagawa ang bawat pasya sa pagsasara ng session at isinasagawa sa bukas ng susunod na session. Para rito, naglalagay ito ng magkakaugnay na pares na……Magpakita ng higit paMagpakita ng mas kaunti

Nagte-trade ng SPY.USEQ sa mga daily bar. Ang lakas ng merkado ay ang 10-araw na average ng ranggo ng presyo ng SPY sa loob ng 252 araw. Kapag 0.6 o mas mataas ang lakas, nagho-hold ng long ang estratehiya. Kapag mas mababa sa 0.6, long ito sa mga session bago ang ika-15 ng buwan at short mula ika-15 pataas, batay sa araw ng kalendaryo ng susunod na session. Ginagawa ang bawat pasya sa pagsasara ng session at isinasagawa sa bukas ng susunod na session. Para rito, naglalagay ito ng magkakaugnay na pares na one-cancels-other, tig-isang tick sa magkabilang panig ng presyong pasya sa pagsasara: STOP_MARKET at MARKET_IF_TOUCHED, kapwa nasa direksiyon ng trade. Binibigyan ng isang segundong timer ang venue para tanggapin ang pares bago itugma ang susunod na bar. Kapag lumampas sa isa sa dalawang antas ang agwat ng bukas, napupunan ang order na iyon bilang market order sa bukas at kinakansela ang isa. Gumagamit ng iisang netting order na katumbas ng hawak na posisyon dagdag ang bago kapag bumaligtad ang direksiyon. Kung nagpapakita ang pagsasara ng luging 4% sa posisyon, lumalabas ito sa susunod na bukas. Hindi ito muling papasok hangga't hindi nagbabago ang target na direksiyon. Ang laki ng posisyon ay ang mas maliit sa 25% ng equity at 1% na panganib na hinati sa 4% stop, na 25% ng equity, sa leverage na 1x.

Sadyang nagtaas ng error ang Iteration 2 sa __init__, dahil tinatanggihan ng matching engine ang mga order na AT_THE_OPEN. Ang error na iyon ang buong pagkabigo ng Layer-2. Isinasagawa ng bersiyong ito ang nakapirming patakaran na next_session_open gamit ang mga karaniwang uri ng order. Sinuri ko ang source code ng engine. May latency sa order na 100 ms ang USEQ, at pinoproseso lamang ng engine ang mga order na kasalukuyang nasa biyahe matapos ma-match ang susunod na bar. Kaya ang payak na market order na……Magpakita ng higit paMagpakita ng mas kaunti

Sadyang nagtaas ng error ang Iteration 2 sa __init__, dahil tinatanggihan ng matching engine ang mga order na AT_THE_OPEN. Ang error na iyon ang buong pagkabigo ng Layer-2. Isinasagawa ng bersiyong ito ang nakapirming patakaran na next_session_open gamit ang mga karaniwang uri ng order. Sinuri ko ang source code ng engine. May latency sa order na 100 ms ang USEQ, at pinoproseso lamang ng engine ang mga order na kasalukuyang nasa biyahe matapos ma-match ang susunod na bar. Kaya ang payak na market order na ipinadala sa pagsasara ay napupunan sa susunod na CLOSE, hindi sa susunod na pagbubukas. Kapag nagpapaputok ang timer pagkatapos ng latency, tinatanggap ng venue ang nakabinbing pares ng order sa oras ng pagpapasya, kaya aktibo na ang pares kapag unang pinoproseso ng engine ang pagbubukas ng susunod na bar. Walang tinanggihang order sa lokal na pagpapatakbo ng SPY sa 2015-2017. Tumugma sa tick ang mga sinuring fill sa pagbubukas ng susunod na bar, at may ilang napunan sa trigger price sa halip na sa pagbubukas. May dalawang pag-aayos sa pagpapasya. (1) Ang araw sa kalendaryo ay araw na ngayon ng sesyon kung kailan isinasagawa ang kalakalan (ang susunod na araw ng trabaho pagkatapos ng pagsasara), kaya nalalapat ang 'short mula sa araw na 15' sa mga sesyon sa o pagkalipas ng ika-15. Hindi isinasaalang-alang ang mga pista opisyal ng palitan dahil wala ang market_calendar sa listahan ng mga pinapayagang import. (2) Isang tunay na bug: nagbabalik ang get_position_pnl_pct ng PERCENT, kaya nag-trigger ang dating stop sa -0.04% sa halip na sa -4%. Inihahambing na ito ngayon sa stop_loss_pct*100. Nananatili ang nakatakdang halaga at kahulugan ng bawat parameter ng plano, at walang idinagdag na mga parameter na maaaring i-tune. Pumapasa nang lokal ang Layer 1 at Layer 2. Itinatala ng Layer 2 na hindi nagbabago ang signal sa dalawang sintetikong senaryo ng tuloy-tuloy na trend, na inaasahan para sa rank-based na score ng lakas; hindi nagiging sanhi ng pagkabigo ng layer ang babala.

Mga Resulta ng Beripikasyon

Katanggap-tanggap na gaya nito. Kung isasama man sa import allowlist ang src.data.market_calendar, gamitin ang next-session function nito.

Itinuturing ng _next_session_day ang susunod na WEEKDAY bilang session ng execution at hindi pinapansin ang mga holiday ng palitan. Mali lang ito kapag inilipat ng holiday ang susunod na session lampas sa hangganan ng araw-15. Halimbawa: kung Good Friday sa ika-14, kinukuwenta ng code ang araw 14 (long), pero sa Lunes ika-17 ang execution (dapat short). Bihira ito at dokumentado ng developer, dahil wala sa import allowlist ang market_calendar.

Opsyonal: itala kung ilang fill ang naiiba sa bukas ng bar sa buong backtest. Kung marami ang bilang, ilayo pa ang mga trigger (hal. ±0.5 bp) para mag-trigger pa rin sa pagbukas ng susunod na bar kapag katumbas ng pagsasara ang bukas.

Gumagamit ang execution sa susunod na bukas ng pares na OCO STOP_MARKET/MIT, na inilagay nang tig-isang tick sa magkabilang panig ng presyong pasya sa pagsasara. Kung eksaktong katumbas ng presyong pasya ang susunod na bukas (sa loob ng isang sentimo sa SPY), walang leg na magti-trigger sa bukas. Magti-trigger naman ang isang leg sa loob ng bar at mapupunan sa trigger price, ibig sabihin, presyong pasya sa pagsasara ±1 tick, hindi sa bukas. Nakakita ang mismong run ng developer ng ilang fill sa trigger price. Nagdudulot ito ng maliit at magkabilang-panig na pagtagas ng execution sa presyong pagsasara sa maliit na bahagi ng mga araw. Hindi ito directional look-ahead.

Walang kailangang gawin. Maaari mong muling ilabas ang order mula sa cancel event.

Ipinapadala ng _cancel_stale_orders ang kanselasyon at tumatakbo naman ang _process_primary sa parehong bar. Dumaraan sa latency ng venue ang kanselasyon, kaya ipinapakita pa rin ng cache na bukas ang mga kinanselang order. Maagang nagbabalik ang base nang may 'order_in_flight' kapag flat, o nagbabalik ng False ang should_exit, kaya nahuhuli pa ng isang session ang muling inilabas na pasya. Nangyayari lang ito pagkatapos ng buong session kung kailan hindi lumihis nang mahigit isang tick ang SPY mula sa naunang pagsasara—halos hindi ito nangyayari.

Panatilihin ang guard para sa mga bukas na order sa should_exit. Kung magdadagdag man ng mga bracket, ibalik ang hakbang na magkansela bago magsara.

Ino-override ng _submit_exit ang base at inaalis ang _close_pending guard nito at ang cancel_all_orders bago magsara. Ligtas ito rito: nagbabalik ng False ang should_exit habang may bukas na order para sa instrumento, kaya hindi nagsasapawan ang mga close order at walang protective leg na dapat kanselahin.

Sandbox: Sharpe 0.18, PF 1.06, 46 saradong trade, beta 0.13. Nalulugi sa tercile ng stressed volatility (-6.1%), sa rate_shock_2022 at sa covid_2020. Nagmula sa pananaliksik sa Chinese index ang tuntunin para sa kalahating buwan. Hindi pa napapatunayan ang paglipat nito sa SPY; sa mahihinang merkado ng US, maaaring pag-short lang ng mga rebound ang short na bahagi ng buwan. Sa mga 8 round trip kada taon, magbibigay ang buong kasaysayang 1993+ ng halos 250 trade, kaya masusukat ito ng buong backtest. Suriin muna kung positibo ang gross expectancy ng short leg sa mahinang rehimen (short win rate na 0.35). Kung hindi, ang long-only na filter ng lakas ang gumagawa ng lahat.

Pagsusuri ng Backtest

Sharpe
0.15
Kabuuang Return
19.56%
Max Drawdown
23.02%
Kabuuang Trade
252
Win Rate
40.5%
Profit Factor
1.12

Maaasahang sample: 253 na naisara nang trade mula 1994 hanggang 2024 (127 long, 126 short), na may maayos na accounting at walang puwang sa datos.

Ang avg_trade_return_pct ay 0.29%, mas mataas sa floor na 0.05% ng USEQ. Ang PF ay 1.12 at positibo ang Sharpe sa 0.15.

Causal ang execution: napupunan ang mga order sa bukas ng susunod na session, hindi kailanman sa presyong pasya sa pagsasara.

Nalulugi ang leg ng premise. Kabuuang -$23,746 net ang 126 SHORT trade (mahinang rehimen, ikalawang bahagi ng buwan). Mga $621 lang ang gastos sa pangungutang, kaya nalulugi rin ang leg na ito bago ang mga gastos. Kabuuang +$39,843 naman ang 127 LONG trade. Napatunayan ang alalahanin ng QA: karamihan sa mga rebound ang sini-short ng short sa kalahating buwan sa mahihinang merkado ng US.

Ang natitira ay isang long na may notional na humigit-kumulang 25% SPY. Ang beta ay 0.12, alpha ay -0.0027, at information ratio ay -0.47, kaya walang naidaragdag na edge ang estratehiya lampas sa exposure nito sa benchmark. Ang kabuuang return ay +19.6% sa loob ng 30 taon.

Tinatanggihan ng diagnostic na signal-IC ang pagtataya: IC 0.013, t=0.24, hatol na 'rejected_no_information'. Nasa [-0.20, 0.51] ang Sharpe 95% CI.

Nanatiling flat ang estratehiya mula 2016-06-28 hanggang 2018-10-25. Na-stop out ang long, at pinigilan ng nakatalang tuntuning 'reentry_after_stop = next_target_direction_change' ang mga long sa loob ng 28 buwan habang nananatili ang malakas na rehimen, kaya napalampas nito ang rally ng 2016-18. Salungat ito sa tuntuning 'manatiling long sa malalakas na merkado'.

Ang pinakamataas na drawdown ay 23.0%, lagpas sa paunang itinakdang 15%. Nalulugi ang tercile ng stressed volatility (-7.1%, Sharpe -0.08).

Walang parameter na maaaring i-tune sa plano ng optimization (operasyong 'frozen'), kaya hindi mababago ng optimization ang resulta.

Pagsusuri

Maayos ang accounting: sa bukas ng susunod na session napupunan ang mga order, walang lookahead, at ang sample ay 30 taon ng SPY na may 252 saradong trade.

Hindi mga bayarin ang problema: 0.291% ang average na return ng bawat trade, humigit-kumulang 5.8 beses ng 0.05% USEQ na floor. Kinakain ng market impact ang 11.8% ng gross.

Walang edge laban sa buy-and-hold: +19.6% kabuuang return sa loob ng 30 taon, Sharpe 0.15 (agwat na 95% -0.20 hanggang 0.51), profit factor 1.12, alpha na -0.27% kada taon, information ratio na -0.47 kumpara sa buy-and-hold na SPY.

Walang impormasyong dala ang signal: 0.013 ang ugnayan sa mga susunod na return (IC), t=0.24.

Ang pinakamataas na drawdown ay 23.0%, lagpas sa paunang itinakdang limitasyon sa panganib na 15%. Hindi maaaring alisin ang limitasyong iyon, at hindi pa nakakabawi ang drawdown (mga 9,300 araw).

Tinanggihan ng walk-forward ang estratehiya dahil kulang ang coverage ng mga kandidato: 36 lamang sa 59 window ang may katanggap-tanggap na kandidato, at walang kandidato ang pinakahuling window. Mula sa window na 2009 pasulong, nalabag ng iisang nakapirming panuntunan ang limitasyon sa drawdown na 15% sa bawat window. Walang mga parameter na maaaring i-tune.

Hindi magkakatugma ang mga resulta: positibo ang 16 sa 30 taon (53%, mas mababa sa minimum na 60%), 1997 lang ang bumubuo sa 40% ng kita, at nalulugi ang estratehiya sa ikatlong bahagi na mataas ang volatility (Sharpe -0.08). Bumaba sa paglipas ng panahon ang in-sample Sharpe mula mga 1.4 tungo sa mga 0.2.

Depekto sa code na naitala, pero hindi ito ang dahilan ng hatol na ito: nanatiling flat ang estratehiya mula 2016-06 hanggang 2018-10. Pinigilan ng stop ang muling pagpasok habang nanatiling long ang target batay sa lakas ng merkado.

Kasaysayan ng Iterasyon

Nabigo ang beripikasyon (Layer 1.5 — pagkakatugma ng hypothesis/config) [class=hypothesis_mismatch]: - Itinatakda ng optimization_plan ang leverage sa 1.0

Nabigo ang beripikasyon (Layer 2 — mga sintetikong sitwasyon): Mga parameter na ginamit: ['leverage', 'risk_pct', 'stop_loss_pct', 'capital_fraction', 'execution_policy', '_optimization_plan', 'reentry_after_stop', 'strength_threshold', 'calendar_switch_day', 'price_rank_lookback', 'strength_smoothing_bars'] Tiyaking itinatakda ng __init__ ang lahat ng attribute mula sa self.parameters.get(). - steady_uptrend: Error sa setup: RuntimeError: execution_policy_unsupported: kailangan ng next_session_open ang mga event……Magpakita ng higit paMagpakita ng mas kaunti

Nabigo ang beripikasyon (Layer 2 — mga sintetikong sitwasyon): Mga parameter na ginamit: ['leverage', 'risk_pct', 'stop_loss_pct', 'capital_fraction', 'execution_policy', '_optimization_plan', 'reentry_after_stop', 'strength_threshold', 'calendar_switch_day', 'price_rank_lookback', 'strength_smoothing_bars'] Tiyaking itinatakda ng __init__ ang lahat ng attribute mula sa self.parameters.get(). - steady_uptrend: Error sa setup: RuntimeError: execution_policy_unsupported: kailangan ng next_session_open ang mga event ng presyo sa pagbubukas ng session sa antas ng runner at naka-queue na target execution; tinatanggihan ng naka-install na matching engine ang AT_THE_OPEN. Huwag suriin ang hypothesis na ito gamit ang market fill sa mismong pagsasara. - steady_downtrend: Error sa setup: RuntimeError: execution_policy_unsupported: kailangan ng next_session_open ang mga event ng presyo sa pagbubukas ng session sa antas ng runner at naka-queue na target execution; tinatanggihan ng naka-install na matching engine ang AT_THE_OPEN. Huwag suriin ang hypothesis na ito gamit ang market fill sa mismong pagsasara. - flat_ranging: Error sa setup: RuntimeError: execution_policy_unsupported: kailangan ng next_session_open ang mga event ng presyo sa pagbubukas ng session sa antas ng runner at naka-queue na target execution; tinatanggihan ng naka-install na matching engine ang AT_THE_OPEN. Huwag suriin ang hypothesis na ito gamit ang market fill sa mismong pagsasara. - volatility_spike: Error sa setup: RuntimeError: execution_policy_unsupported: kailangan ng next_session_open ang mga event ng presyo sa pagbubukas ng session sa antas ng runner at naka-queue na target execution; tinatanggihan ng naka-install na matching engine ang AT_THE_OPEN. Huwag suriin ang hypothesis na ito gamit ang market fill sa mismong pagsasara. - zero_volume: Error sa setup: RuntimeError: execution_policy_unsupported: kailangan ng next_session_open ang mga event ng presyo sa pagbubukas ng session sa antas ng runner at naka-queue na target execution; tinatanggihan ng naka-install na matching engine ang AT_THE_OPEN. Huwag suriin ang hypothesis na ito gamit ang market fill sa mismong pagsasara. - price_gap: Error sa setup: RuntimeError: execution_policy_unsupported: kailangan ng next_session_open ang mga event ng presyo sa pagbubukas ng session sa antas ng runner at naka-queue na target execution; tinatanggihan ng naka-install na matching engine ang AT_THE_OPEN. Huwag suriin ang hypothesis na ito gamit ang market fill sa mismong pagsasara.

Buod ng Resulta

Sa mahihinang US na merkado, ang pag-short sa SPY sa ikalawang hati ng buwan ay kadalasang nangangahulugan ng pag-short sa mga rebound. Walang naipakitang edge ang mga panuntunan sa kalendaryong pangkalahating buwan sa US large-cap na indeks, alinsunod sa mga naunang itinapong SPY/QQQ estratehiyang pangkalendaryo, kaya dapat nang tumigil ang pananaliksik sa pagmumungkahi ng mga ito.

Ipinadala ito ng pagsusuri sa backtest para sa optimization. Pagkatapos, iniwan ito ng analyst bilang premise_falsified (no_edge). IC ang signal na 0.013 (t=0.24) at walang alpha lampas sa SPY, at lumampas ang drawdown sa paunang itinakdang limitasyong 15%. Tinanggihan ito ng walk-forward dahil kulang ang saklaw ng kandidato (36 sa 59 window); dahil wala ring parameter na maaaring i-tune, hindi mababago ng pag-ulit ang resulta.

Sinubok ng estratehiya kung maililipat sa mga daily bar ng SPY ang epekto ng pagsisimula ng buwan batay sa lakas ng merkado ng Guosen Securities, na inilathala para sa mga Chinese index. Nanatili itong long kapag katumbas o mas mataas sa 0.6 ang pinakinis na proxy ng lakas na ranggo ng presyo sa loob ng 252 araw. Kung hindi, nag-long ito bago ang araw 15 ng kalendaryo at nag-short mula araw 15 pataas.

Sa loob ng 1994-2024, naghatid ito ng +19.6% kabuuang return na may Sharpe na 0.15 (95% CI -0.20 hanggang 0.51), sa 252 saradong trade. 0.291% ang average na return kada trade, 1.12 ang profit factor, -0.0027 ang alpha, -0.47 ang information ratio at 23.0% ang pinakamataas na drawdown. Nalugi nang mga $23.7k net ang 126 short trade at kumita nang mga $39.8k ang mga long trade.

Pagsusuri

Paraan ng pamumuhunan sa index batay sa epekto ng pagsisimula ng buwan kapag malakas o mahina ang merkado Guosen Securities_20180813_ - BigQuant na quantitative trading

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.