Pinkfish Monthly SMA: Tapat na SPY na nakaayon sa kalendaryo, 10 buwan
Resulta: Paper Trading
PinkfishCalendarMonthlySmaSpy
Buod ng Resulta
Inilipat ng PinkfishCalendarMonthlySmaSpy ang nakapirming tuntuning 10-buwang SMA na may label ayon sa kalendaryo tungo sa SPY na walang leverage, gamit ang pagpuno sa pagbubukas ng susunod na sesyon at hindi pagsama sa mga dibidendo. Pagkaraan ng tatlong pag-ulit, nagbalik ang buong backtest nito ng 989.40% na may Sharpe na 0.645 sa 22 saradong kalakalan at pinakamalaking drawdown na 26.33%. Inirekomenda ng analyst ang pag-angat habang itinatala ang hindi tiyak na kabuluhan sa estadistika, hindi pag-abot sa pinakamababang antas ng Calmar at hindi pa napatunayang higit na performance ng aktibong estratehiya. Umabot sa paper trading ang pagtakbo.
I-port ang estratehiyang monthly-sma ni Farrell Aultman na lisensyado ng MIT sa pinkfish tungo sa pang-araw-araw na bar ng SPY.USEQ, habang pinananatili ang monthly_sma=10, use_adj=false at use_cache=true. Pinagmulan: https://github.com/fja05680/pinkfish/blob/18a0d557ead25e0e82de3ece86bcab6c325a59ed/examples/strategies/monthly-sma/strategy.py. Panatilihin ang aktuwal na semantika ng resampling sa katapusan ng buwan ng kalendaryo at forward-fill ng code ng pinagmulan, sa halip na tahimik na ipatupad lamang ang……Magpakita ng higit paMagpakita ng mas kaunti
I-port ang estratehiyang monthly-sma ni Farrell Aultman na lisensyado ng MIT sa pinkfish tungo sa pang-araw-araw na bar ng SPY.USEQ, habang pinananatili ang monthly_sma=10, use_adj=false at use_cache=true. Pinagmulan: https://github.com/fja05680/pinkfish/blob/18a0d557ead25e0e82de3ece86bcab6c325a59ed/examples/strategies/monthly-sma/strategy.py. Panatilihin ang aktuwal na semantika ng resampling sa katapusan ng buwan ng kalendaryo at forward-fill ng code ng pinagmulan, sa halip na tahimik na ipatupad lamang ang paliwanag: nilalagyan ng petsa ng huling araw ng kalendaryo ng buwan ang mga buwanang pagsasara, at ginagamit ng pang-araw-araw na signal ang pinakabagong gayong petsa na hindi lalampas sa petsa ng sesyon nito. Dahil dito, kapag tumapat sa weekend o holiday ang katapusan ng buwan sa kalendaryo, inihahambing ng huling sesyon ng kalakalan ang pagsasara laban sa naunang magagamit na SMA ng nakaraang buwan, hindi sa isang SMA na kinabibilangan ng pagsasara ng kasalukuyang buwan. Iangkop ang pagpapatupad ng presyo ng pagsasara sa pinagmulan sa suportadong pagpapatupad sa pagbubukas ng susunod na sesyon ng platform. Gumamit ng mga presyo ng platform na iniangkop sa stock split ngunit hindi sa dibidendo; hindi isinasama ang mga dibidendo sa PnL. Ilaan ang magagamit na equity sa buong SPY share nang walang leverage. Walang idinadagdag na stop, target na kita, short position o salaan sa panganib. Hindi pa napatutunayan ang mga pahayag tungkol sa performance ng pinagmulan.
Tinutukoy ng isinumiteng source ang buwanang strategy sa S&P 500, kaya mas mahalaga ang pagiging tapat sa source kaysa sa mga quota para sa venue at direksyon na awtomatikong pinipili. Naiiwasan ng USEQ ang isa pang eksperimento sa Binance crypto. Walang konsentrasyon sa corpus, kaya walang pahayag tungkol sa bahagi ng instrumento. Sinusubok nito ang nakapirming tuntuning nakaayon sa kalendaryong buwanan, hindi ang pumalyang DOT daily crossover, LINK Supertrend o mga mekanismo ng pares ng equity; walang pagtanggi batay sa performance o paunang backtest.
Implementasyon
Pag-angkop ng pinkfish monthly-sma sa daily bar ng SPY.USEQ. Nilalagyan ng petsa ng katapusan ng buwan sa kalendaryo ang pagsasara ng bawat buwan, at ipinapasa sa mga daily session ang SMA na 10-buwan. Sa huling trading session ng bawat buwan, bumibili ang strategy kapag walang hawak na posisyon at close > SMA, at nagbebenta kapag may hawak na posisyon at close < SMA. Napupunan ang mga order sa open ng susunod na session, at itinatakda ang laki ng posisyon sa buong share batay sa equity.
Inaayos ng iteration na 3 ang pagkaka-lock ng entry matapos itong tanggihan, at hindi binabago ang lohika ng signal. (1) Mula 0.01 naging 0.03 ang gap buffer na fill_price_buffer, at nagdagdag ng bagong 0.05% na cost_reserve. floor(equity*1.0/(close*1.03*1.0005)) na ngayon ang shares; nag-iiwan ito ng puwang para sa agwat hanggang sa susunod na open, pati sa spread at epekto sa presyo, kaya hindi na dapat tanggihan ng pagsusuri ng margin ang entry. Nananatili sa 1.0 ang allocation_fraction at sa 10 ang……Magpakita ng higit paMagpakita ng mas kaunti
Inaayos ng iteration na 3 ang pagkaka-lock ng entry matapos itong tanggihan, at hindi binabago ang lohika ng signal. (1) Mula 0.01 naging 0.03 ang gap buffer na fill_price_buffer, at nagdagdag ng bagong 0.05% na cost_reserve. floor(equity*1.0/(close*1.03*1.0005)) na ngayon ang shares; nag-iiwan ito ng puwang para sa agwat hanggang sa susunod na open, pati sa spread at epekto sa presyo, kaya hindi na dapat tanggihan ng pagsusuri ng margin ang entry. Nananatili sa 1.0 ang allocation_fraction at sa 10 ang monthly_sma, ayon sa takda ng kontrata. (2) Bago ang bawat BUY, inaalis ng strategy sa self._inflight_entries ang mga order na INITIALIZED/DENIED (hindi kailanman naipadala). Hindi na mahaharangan ng isang tinanggihang order ang mga susunod na buwan (ang counter na dropped_entry_inflight). (3) Nagtatakda ng flag na target_long sa bawat desisyon sa katapusan ng buwan (true kapag close > SMA). Kung tinanggihan o inalis ang month-end BUY at flat pa rin ang strategy, muling isinusumite nito ang BUY sa hanggang 3 kasunod na session. Pagkatapos nito, maghihintay ito sa susunod na katapusan ng buwan. Walang idinadagdag na bagong signal, filter o stop. Hindi pa na-backtest ang iteration na ito, kaya kailangan pang kumpirmahin sa susunod na run ang denied_margin==0, pati ang mga posisyon sa Apr-2022 at 2023.
Mga Resulta ng Beripikasyon
Payo lamang. Humigit-kumulang 5.5 taon ang tinakbo ng sandbox at 8 trade lang ang isinara: Sharpe na 0.25 (CI -0.54 hanggang 1.06), alpha na -0.4%/taon kumpara sa buy-and-hold na SPY, at drawdown na 840 araw. Karaniwan ito sa tuntunin ng pagtukoy ng tiyempo gamit ang 10-buwang SMA, na kadalasang nagbabawas lang ng beta at hindi nagdaragdag ng alpha. Walang isyu sa bayarin: humigit-kumulang 2.3% bawat trade kumpara sa ~0.05% na minimum na spread ng USEQ. Ang buong kasaysayang 1993+ ang magpapasya. Asahan ang kakaunting sample ng mga isinara nang trade dahil humigit-kumulang 1 hanggang 2 round trip bawat taon (L195 ang umiiral); suriin ito batay sa pagbawas ng drawdown at return na isinasaalang-alang ang exposure, hindi sa alpha.
Pagsusuri ng Backtest
Sharpe
0.65
Kabuuang Return
989.40%
Max Drawdown
26.33%
Kabuuang Trade
22
Win Rate
63.6%
Profit Factor
4.47
Pinananatili ng code ang semantika ng buwanang SMA na may label ayon sa kalendaryo. Long position sa buong share ang lahat ng 10 saradong trade, at napunan ang mga ito sa open ng unang session; tugma ito sa hipotesis.
Nagkamit ng +$276,052 ang mga saradong kalakalan. Ang karaniwang kita sa kalakalan ay 17.59%, lampas sa pinakamababang antas na 0.05% USEQ; ang Sharpe sa pagbuo ay 0.736 at ang drawdown ay 20.43%.
Limitado ang malayang ebidensiya mula sa mga kalakalan dahil sampung saradong posisyon lamang sa loob ng humigit-kumulang 21 taon. Hindi dapat ituring na napatunayang katatagan ang profit factor na 10.76.
May kasamang bukas na posisyon sa pangkalahatang bilang na +487.19%; +276.05% ng paunang kapital ang kinakatawan ng kita sa mga saradong kalakalan.
Nagbabalik ang benchmark batay sa mga sinampol na datos ng 332.42% hanggang Disyembre 11, 2014, at 50.60% ang drawdown batay sa mga sinampol na datos. Naiiba ang petsa ng pagtatapos nito sa cutoff ng pagsusuri, kaya hindi maihahambing nang eksakto ang magkatugmang panahon. Hindi pa nareresolba ang alalahanin ng QA tungkol sa exposure sa merkado.
Pagsusuri
Muling nalilikha ng mga nakapirming pinal na parameter ang baseline: Sharpe na 0.645, 22 saradong kalakalan, profit factor na 4.47 at karaniwang kita sa kalakalan na 13.743%, kumpara sa ibinigay na minimum na USEQ na 0.05%. Walang paghahanap ng parameter o matinding pagbabago sa resulta kapag bahagyang binago ang mga parameter.
Positibo ang Sharpe sa lahat ng apat na outer window; humigit-kumulang 0.574 ang pinagsamang OOS Sharpe. 0.492 ang holdout Sharpe sa 12 trade, na may retention na 85.6% at tugma sa OOS.
Sinusukat ng rekonstruksiyon ng ledger ang pinakamalaking natantiyang pagkalugi sa kalakalan bilang 12.10% ng equity sa entry at ang pinakamalaking posisyon sa entry bilang 98.64%. Natutugunan ng signal exit at pagtatakda ng laki nang walang leverage ang pamantayan ng ruta (b) na risk_control.
Natupad ang mga hula sa buong kasaysayan: trades na 22 kumpara sa 20, return na 989.4% kumpara sa 100%, karaniwang return bawat trade na 13.74% kumpara sa 2.95%, at drawdown na pasok sa 30%, sa 26.33%. Mas mataas ang pinagsamang OOS Sharpe kaysa sa magkakahiwalay na hula na 0.5.
Mababa ang kumpiyansa: hindi napatunayan sa estadistika. Hindi naaabot ng pinagsamang OOS HAC t=2.306 ang pamantayang iniaangkop sa lineage na 3.290; hindi naaabot ng itinamang block t=1.708 ang 2.255. Hindi rin nagbibigay ng tiyak na konklusyon ang holdout na HAC at mga pagsusuri sa block.
Positibo ang Sharpe ng lahat ng 26 breadth market, pero hindi pumapasa ang pinagsamang resulta sa mga rehistradong pagsusuri ng kabuluhan sa estadistika. Hindi nagpapataas ng kumpiyansa ang breadth.
Nagbalik ng 1529.8% ang buy-and-hold kumpara sa 989.4%. Hindi bababa sa 50.60% ang drawdown nito batay sa mga sinampol na datos kumpara sa 26.33%; hindi eksaktong pinakamataas sa buong grid ang sinampol na bilang ng benchmark. -0.134 ang information ratio, kaya hindi pa napapatunayan ang higit na performance ng aktibong estratehiya. Hindi kasama ang mga dibidendo sa dalawang paghahambing.
Ang Calmar ay 0.288 at tumagal nang humigit-kumulang 1165 araw ang pagbawi. Humigit-kumulang 406 araw ang aktuwal na karaniwang tagal ng paghawak sa kabila ng serong halaga ng field ng tagal ng paghawak sa gate.
Nag-aambag ang hindi pa narerealisa na kita sa bukas na posisyon ng 73.58 percentage point, o humigit-kumulang 7.4% ng kabuuang kita. Karamihan sa kita ay na-realize na.
Wala ang deflated Sharpe ng backtest; hindi ito nangangahulugang pumasa. May magkakahiwalay na pagtatasa sa OOS. Nangangailangan ng iisang badyet sa alokasyon ang dating iniulat na ugnayang 0.894 sa naka-deploy na lingguhang strategy na SPY.
Ayusin muna ang entry lockout pagkatapos ng pagtanggi bago mag-optimize. (1) Gawing matatag ang pagtakda ng laki upang hindi kailanman tanggihan ng margin check ang entry. Panatilihin ang allocation_fraction=1.0 dahil nakapirmi ito ayon sa kontrata, ngunit dagdagan ang headroom ng hindi-kontratang fill_price_buffer mula 0.01 tungo sa humigit-kumulang 0.03, o magtabi ng cash para sa gap sa susunod na pagbubukas kasama ang market impact at spread. (2) Bilang pag-iingat, alisin ang mga lipas na INITIALIZED order na……Magpakita ng higit paMagpakita ng mas kaunti
Ayusin muna ang entry lockout pagkatapos ng pagtanggi bago mag-optimize. (1) Gawing matatag ang pagtakda ng laki upang hindi kailanman tanggihan ng margin check ang entry. Panatilihin ang allocation_fraction=1.0 dahil nakapirmi ito ayon sa kontrata, ngunit dagdagan ang headroom ng hindi-kontratang fill_price_buffer mula 0.01 tungo sa humigit-kumulang 0.03, o magtabi ng cash para sa gap sa susunod na pagbubukas kasama ang market impact at spread. (2) Bilang pag-iingat, alisin ang mga lipas na INITIALIZED order na hindi kailanman naisumite mula sa self._inflight_entries bago ang bawat bagong entry, upang hindi mahadlangan ng isang pagtanggi ang mga entry sa mga susunod na buwan. (3) Patakbuhin muli at tiyaking denied_margin==0, dropped_entry_inflight==0, at may mga posisyon sa Abr-2022 at 2023. Tala para sa operator: tinatawag ng base_template._submit_entry ang _record_inflight_entry bago ang submit_order, at iniiwan ng refuse_over_margin ang order na INITIALIZED, kaya permanente nitong hinaharangan ang mga entry. Naaapektuhan ng bug na ito sa platform ang bawat estratehiyang nakakaranas ng pagtanggi dahil sa margin. Buong mga tala: workspace/discussions/d4f4d4ab-fe35-4c31-a4ae-388bfab17de6/iteration_1_feedback.md
## Mga pagpino sa aklatan (mula sa aklatan ng kaalaman; subukan ang mga ito, huwag ipagpalagay na tama ang mga ito)
Nasa aklatan ang eksaktong tuntunin (hawakan lamang ang SPY kapag nasa ibabaw ito ng sampung-buwang SMA nito, kung hindi ay manatili sa cash) at ang mga paliwanag ng QuantStart tungkol sa QSTrader na gumagamit ng kaparehong modelo ng pagpapatupad gaya ng port na ito: magpasya sa pagsasara ng buwan, punan sa susunod na pagbubukas, at magpanatili ng reserbang cash upang hindi maharangan ng gap sa magdamag ang order. Ang mga sinusuportahang pagbabago ay mga pag-aayos sa pagpapatupad na hindi binabago ang kontrata: mas malaking reserba, muling pagsubok sa entry na tinanggihan, at pagsusuri sa resulta laban sa SPY na buy-and-hold pagkatapos ng mga gastos, gaya ng hinihingi ng kritika ng aklatan sa timing ng MA.
1. [pagtatakda ng laki] Itakda ang laki batay sa cash gamit ang reserbang gap na sapat upang hindi kailanman matanggihan: Itaas ang fill_price_buffer mula 0.01 tungo sa 0.03. Itakda ang laki ng buong share bilang floor(equity * allocation_fraction / (decision_close * 1.03 * (1 + 0.0005))), kung saan inilalaan ng huling salik ang market impact at kalahati ng spread. Panatilihin ang allocation_fraction=1.0 at monthly_sma=10 gaya ng itinakda ng kontrata. Itala ang bawat pagtanggi dahil sa margin; ang target ay denied_margin == 0 sa buong backtest. — Pareho ang pinipili ng QSTrader at ng port na ito: kinakalkula nito ang muling pagbabalanse sa pagsasara at nakikipagkalakalan sa susunod na pagbubukas. Nagpapanatili ito ng reserbang cash “upang hindi makahadlang ang mga gastos sa slippage sa pagpapatupad ng isang kalakalan,” at gumagamit ng 1% “upang maiwasang lumampas sa kasalukuyang cash ang mga target order dahil sa malalaking pagbabago ng presyo sa magdamag.” Ipinapaliwanag ng artikulo ng QuantStart na 60/40 na hindi pinapayagan ng simulator na lumampas sa cash ang mga pagbili, kaya kailangan ang reserba para sa galaw sa pagitan ng pagsasara kung kailan nagpasya at ng susunod na pagbubukas. Ipinakita ng aming pagtakbo na hindi sapat ang 1% para sa SPY: tinanggihan ng margin check ang isang entry at hindi naisagawa ang mga posisyon sa Abr-2022 at 2023. Sinasaklaw ng 3% ang halos lahat ng SPY gap sa magdamag, at napakaliit ng gastos sa pagpapanatili ng 3% na cash. (pinagmulan: Momentum Top N with Docker, Jupyter and QSTrader | QuantStart p.1; Periodically Rebalanced Static Allocation 'Buy and Hold' Strategies in QSTrader | QuantStart p.1; The 60/40 Benchmark Portfolio | QuantStart p.1)
2. [entry] Subukang muli ang entry sa katapusan ng buwan na tinanggihan hanggang mahawakan ang posisyon: Panatilihin ang nakabinbing flag na 'target_long' na itinatakda sa pasya sa katapusan ng buwan: true kapag close > 10-buwang SMA, false kapag mas mababa. Bago ang bawat entry, alisin mula sa self._inflight_entries ang mga order na nasa estadong INITIALIZED (hindi kailanman naisumite) o DENIED. Kung true ang target_long, flat ang estratehiya at walang anumang nakabinbin, muling isumite ang itinakdang BUY sa susunod na sesyon (hindi lalampas sa 3 sesyon mula sa pasya, pagkatapos ay maghintay sa susunod na katapusan ng buwan). Huwag magdagdag ng iba pang trigger ng entry. — Tuntunin ito tungkol sa estado ang tuntunin ni Faber, ayon sa buod ng Quantpedia: “Hawakan ang bawat klase ng asset na ETF lamang kapag lampas ito sa Simple Moving Average nito para sa sampung buwan; kung hindi, manatili sa cash.” Hindi dapat iwan ng isang tinanggihang order ang estratehiya sa cash nang ilang buwan habang sinasabi ng tuntunin na humawak. Sa kasalukuyan, permanenteng hinaharangan ng lumang order na INITIALIZED ang mga entry sa mga susunod na panahon, kaya bug sa platform ang sinusukat ng backtest, hindi ang tuntunin. Ibabalik ng pagtutugma sa estadong hawak/flat at ng buwanang signal ang nilalayong exposure ng pinagmulan nang hindi nagdaragdag ng mga bagong signal. (pinagmulan: Asset Class Trend-Following - Quantpedia p.1)
3. [gastos] Suriin ang port laban sa SPY na buy-and-hold pagkatapos ng mga gastos, hindi nang mag-isa: Walang pagbabago sa lohika ng signal. Sa ulat ng backtest, magdagdag ng benchmark na SPY na buy-and-hold sa kaparehong panahon, gamit ang parehong pagtatakda ng laki para sa buong share, pagpuno sa susunod na pagbubukas at mga gastos sa spread na USEQ (humigit-kumulang 1bp na kalahati ng spread kasama ang market impact). Iulat ang mga agwat sa CAGR, pinakamalaking drawdown at Sharpe. Iulat ang oras na nasa merkado at bilang ng mga paglipat ng SMA bawat taon. Ituring ang “mas mababang pinakamalaking drawdown kaysa buy-and-hold habang ang Sharpe ay nasa loob ng humigit-kumulang 0.1” bilang paunang itinakdang pagsusuri ng tagumpay, hindi ang kabuuang kita ng 784%. — Ipinapakita ng pahina ng Quantpedia ang 10-buwang SMA bilang pamamaraan para bawasan ang panganib, hindi para pataasin ang kita. Binabanggit nito ang out-of-sample na pagsusuri ni Zakamulin na may makatotohanang mga gastos sa transaksyon: ang iniulat na mga resulta ng timing ng MA ay “karaniwang may malaking bias mula sa data-mining at hindi isinasaalang-alang ang mahahalagang hadlang sa merkado,” at sa totoong buhay, ang tuntunin ay “bahagya lamang na mas mahusay kaysa” buy-and-hold. Sa 17 kalakalan at Sharpe na 0.64, hindi maipapakita ng backtest lamang na may bentahe ito. Ang agwat sa benchmark ang makabuluhang bilang, at pinipigilan nitong itaguyod ang halos puro SPY beta. (pinagmulan: Asset Class Trend-Following - Quantpedia p.1; The 60/40 Benchmark Portfolio | QuantStart p.1)
Pagsusuri ng Panganib
Pumapasa ang kontrol sa panganib ng paglabas batay sa signal: 98.5434% ang pinakamataas na nasukat na exposure sa entry kumpara sa limitasyong 100% sa 1x leverage. 7.3186% ng equity sa entry ang pinakamalaking aktuwal na lugi sa trade. Walang iniulat na malubhang pagkabigo o sapilitang pagpuksa.
Kumpirmado ang waiver sa Calmar para sa pagmamasid sa paper trading na mababa ang kumpiyansa. 0.433 ang Calmar sa development kumpara sa 0.5; 20.4329% ang drawdown, at 1,165 araw ang tagal ng drawdown. Ipinapakita ng ibinigay na pagsusuri sa hula sa buong kasaysayan na pasok ang drawdown na 26.3269% sa limitasyong 30% ng may-ari.
Hindi pa nagbibigay ng tiyak na konklusyon ang estadistikal na ebidensiya: pinagsamang OOS HAC t=2.3065 kumpara sa kinakailangang 3.2896. Hindi rin nagbibigay ng tiyak na konklusyon ang holdout, at hindi nakikita ang mga detalyadong sukat. Binabawasan ng mga nakapirming parameter ang panganib ng pagpili, ngunit hindi pinatutunayan ng mga ito ang kabuluhan sa estadistika.
Natukoy ng QA ang mga paglihis sa timing ng retry-order at posibleng mga salpukan ng nakabinbing order kapag nililinis ang mga order na INITIALIZED. Itugma ang mga retry, nakabinbing order at aktuwal na posisyon sa panahon ng pinangangasiwaang operasyon ng paper trading.
Walang laman ang ibinigay na live book at wala itong item ng pagpapatupad; hindi matantiya ang korelasyon ng mga na-deploy. Hindi nakikita ang mga sukat ng kapasidad, at hindi nasuri ang backtest na deflated_sharpe. Hindi humahadlang ang mga ibinigay na payo.
Aprubahan lamang ang may label na pagmamasid sa paper trading na mababa ang kumpiyansa, gamit ang sinuri at nakapirming mga parameter at leverage na 1x.
Sundin ang limitasyon na $10,000 sa alokasyon bawat estratehiya, mga limitasyon sa posisyon ng account at mga limitasyon sa magkakaugnay na exposure.
Bantayan ang paunang paper trading, itugma ang mga retry order, at ihinto ang mga bagong entry kung may lumitaw na dobleng order o labis na exposure. Panatilihin ang mga circuit breaker ng platform.
Kasaysayan ng Iterasyon
Bumagsak ang beripikasyon (Layer 4 — pagsusuri ng QA) [class=code_defect]: - [edge_concern] Payo lamang: ang tuntunin sa pagtukoy ng tiyempo gamit ang 10-buwang SMA sa SPY trade ay humigit-kumulang 1-3 round trip bawat taon, kaya hindi bayarin at spread ang dapat ikabahala. Ang tanong ay kung nahihigitan ng pagtukoy ng tiyempo sa trend ang buy-and-hold na SPY matapos hindi isama ng platform ang mga dibidendo. Bahagyang pinapaboran ng hindi pagsama sa mga dibidendo ang tuntunin sa pagtukoy ng tiyempo, dahil……Magpakita ng higit paMagpakita ng mas kaunti
Bumagsak ang beripikasyon (Layer 4 — pagsusuri ng QA) [class=code_defect]:
- [edge_concern] Payo lamang: ang tuntunin sa pagtukoy ng tiyempo gamit ang 10-buwang SMA sa SPY trade ay humigit-kumulang 1-3 round trip bawat taon, kaya hindi bayarin at spread ang dapat ikabahala. Ang tanong ay kung nahihigitan ng pagtukoy ng tiyempo sa trend ang buy-and-hold na SPY matapos hindi isama ng platform ang mga dibidendo. Bahagyang pinapaboran ng hindi pagsama sa mga dibidendo ang tuntunin sa pagtukoy ng tiyempo, dahil sinusukat din ang buy-and-hold nang walang dibidendo. Dapat ihambing ito ng analyst sa benchmark na buy-and-hold, hindi sa sero.
- [critical] Hindi kailanman makapagbubukas ng posisyon ang isinumiteng strategy. Inulit ko ang Layer 3 run (SPY.USEQ 1-DAY, 2017-06-19 hanggang 2023-01-01) at nakakuha ako ng 0 trade. entry_diag: entry_signaled=41, entries_submitted=41, denied_margin=1, dropped_entry_inflight=40. Tama ang lohika ng signal: lumilitaw ang 41 signal ng entry sa katapusan ng buwan. Nasa position_size() ang problema; nagbabalik ito ng buong share na int(equity * 1.0 / close), o 100% ng equity sa 1x leverage. Inaaprubahan ng margin_capped_size() ang laki batay sa pagsasara ng bar. Pagkatapos ay pinapatakbo ng submit_order() ang refuse_over_margin(), na muling sumusuri sa market order nang walang presyo, idinadagdag ang nakalaang bayad sa taker at tinatanggihan ito (denied_margin=1). Naitawag na ng _submit_entry() ang _record_inflight_entry(order) bago ang submit_order(). Hindi naipapadala at hindi isinasara ang tinanggihang order, kaya permanenteng nagbabalik ng True ang _entry_order_inflight() at hinaharangan ang lahat ng kasunod na entry sa 40 (dropped_entry_inflight=40). Tatamaan din ng parehong pagtanggi ang buong backtest sa unang entry nito, kaya 0 trade rin ang kalalabasan. Hindi rin kakayanin ng sizing na eksaktong 100% ng equity ang fill sa open ng susunod na session na ipinapataw ng platform: sa anumang pagtaas sa pagitan ng close at open, lalampas sa 1x equity ang halaga ng fill. (linya 95) — ayusin: Mag-iwan ng puwang para sa bayad at agwat hanggang sa susunod na open. Halimbawa: shares = int(equity * allocation_fraction / (decision_close * (1 + buffer))), na may buffer na humigit-kumulang 0.5-1%; maaari rin ang nakapirming factor na 0.99. Ipaliwanag ito sa paglalarawan bilang sapilitang paglihis ng platform: bumibili ang pinkfish ng pinakamataas na bilang ng share sa close, pero dito sa susunod na open napupunan ang order, kaya hindi maaasahang mapupunan ang 100%. Walang binabago sa tuntunin, default o signal. Patakbuhin muli ang sandbox at tiyaking denied_margin=0 at trades > 0.
- [warning] Tala para sa operator tungkol sa platform, hindi para sa developer: sa base_template._submit_entry, tumatakbo ang _record_inflight_entry(order) bago ang submit_order(), at maaaring tahimik na tanggihan ng submit_order ang order sa pamamagitan ng refuse_over_margin. Mananatili magpakailanman sa _inflight_entries ang tinanggihang order sa estadong INITIALIZED at haharangin ang bawat kasunod na entry sa instrumentong iyon. Permanenteng hindi na gagana ang anumang strategy na nagdudulot ng isang pagtanggi dahil sa margin. Sinasadya at walang pinsala ang override na min_bars_required()=1 na tinukoy ng static analysis, dahil sariling flag na month_sma_ready ng strategy ang pinagbabatayan nito. (linya 35) — ayusin: Operator: itala lang ang entry habang isinasagawa matapos maisumite talaga ang order, o alisin ito sa _inflight_entries kapag nagbalik ng True ang refuse_over_margin.
Mag-iwan ng puwang para sa bayad at agwat hanggang sa susunod na open. Halimbawa: shares = int(equity * allocation_fraction / (decision_close * (1 + buffer))), na may buffer na humigit-kumulang 0.5-1%; maaari rin ang nakapirming factor na 0.99. Ipaliwanag ito sa paglalarawan bilang sapilitang paglihis ng platform: bumibili ang pinkfish ng pinakamataas na bilang ng share sa close, pero dito sa susunod na open napupunan ang order, kaya hindi maaasahang mapupunan ang 100%. Walang binabago sa tuntunin, default o signal. Patakbuhin muli ang sandbox at tiyaking denied_margin=0 at trades > 0.
Hindi kailanman makapagbubukas ng posisyon ang estratehiya ayon sa pagkakasumite nito. Muli kong isinagawa ang pagtakbo sa Layer 3 (SPY.USEQ 1-DAY, 2017-06-19 hanggang 2023-01-01) at nakakuha ako ng 0 kalakalan. entry_diag: entry_signaled=41, entries_submitted=41, denied_margin=1, dropped_entry_inflight=40. Tama ang lohika ng signal: gumagana ang 41 signal ng entry sa katapusan ng buwan. Nasa position_size() ang kabiguan, na nagbabalik ng int(equity * 1.0 / close) na buong share, ibig sabihin ay 100% ng equity sa……Magpakita ng higit paMagpakita ng mas kaunti
Hindi kailanman makapagbubukas ng posisyon ang estratehiya ayon sa pagkakasumite nito. Muli kong isinagawa ang pagtakbo sa Layer 3 (SPY.USEQ 1-DAY, 2017-06-19 hanggang 2023-01-01) at nakakuha ako ng 0 kalakalan. entry_diag: entry_signaled=41, entries_submitted=41, denied_margin=1, dropped_entry_inflight=40. Tama ang lohika ng signal: gumagana ang 41 signal ng entry sa katapusan ng buwan. Nasa position_size() ang kabiguan, na nagbabalik ng int(equity * 1.0 / close) na buong share, ibig sabihin ay 100% ng equity sa leverage na 1x. Inaaprubahan ng margin_capped_size() ang laki batay sa pagsasara ng bar. Pagkatapos ay pinatatakbo ng submit_order() ang refuse_over_margin(), na muling sinusuri ang market order nang walang presyo, idinadagdag ang nakalaang bayad sa taker at tinatanggihan ito (denied_margin=1). Natawag na ng _submit_entry() ang _record_inflight_entry(order) bago ang submit_order(). Hindi naipapadala kailanman ang tinanggihang order at hindi rin ito nagsasara, kaya permanenteng nagbabalik ng True ang _entry_order_inflight() at hinaharangan ang 40 pang susunod na entry (dropped_entry_inflight=40). Tatamaan din ng parehong pagtanggi ang unang entry sa backtest ng buong kasaysayan at magbubunga rin ito ng 0 kalakalan. Hindi rin makatatagal sa pagpuno sa pagbubukas ng susunod na sesyon ng platform ang pagtatakda ng laki sa eksaktong 100% ng equity: sa anumang pagtaas sa pagitan ng mga sesyon, lalampas ang notional ng pagpuno sa equity na 1x.
Para sa operator: itala lamang ang entry na nakabinbin matapos aktuwal na maisumite ang order, o alisin ito sa _inflight_entries kapag nagbalik ng True ang refuse_over_margin.
Tala para sa operator tungkol sa platform, hindi para sa developer: sa base_template._submit_entry, tumatakbo ang _record_inflight_entry(order) bago ang submit_order(), at maaaring tahimik na tanggihan ng submit_order ang order sa pamamagitan ng refuse_over_margin. Mananatili magpakailanman sa _inflight_entries ang tinanggihang order sa estadong INITIALIZED at haharangin ang bawat kasunod na entry sa instrumentong iyon. Permanenteng hindi na gagana ang anumang strategy na nagdudulot ng isang pagtanggi dahil sa margin. Sinasadya at walang pinsala ang override na min_bars_required()=1 na tinukoy ng static analysis, dahil sariling flag na month_sma_ready ng strategy ang pinagbabatayan nito.
Opsyonal: itala ang fill_price_buffer sa ilalim ng port_deviations bilang puwang sa sizing na ipinataw ng platform. Walang kailangang baguhin sa lohika.
Sa fill_price_buffer=0.01, humigit-kumulang 99% ng equity ang ginagamit sa sizing, kaya pumapasa ang pagsusuri ng refuse_over_margin sa pagsusumite. Napupunan pa rin ang order sa open ng susunod na session. Kung tumaas nang mahigit humigit-kumulang 1% magdamag ang SPY matapos ang desisyon sa entry, maaaring lumampas sa 1x equity ang halaga ng fill. Maaaring tanggihan o sosobrahan ng engine ang order, kaya mawawala ang entry sa isang buwan. 0.981 ang pinakamataas na leverage sa entry sa sandbox at MTM 1.005, kaya katanggap-tanggap ito. Maliit at isiniwalat na sapilitang paglihis ito ng platform mula sa pagbili ng buong 100% cash sa close ng source.
Walang kailangan.
Ino-override ang min_bars_required() para magbalik ng 1. Sadyang ginawa ito: kailangang makita ng monthly ring buffer ang bawat daily bar, at may kondisyon ang mga entry na month_sma_ready (10 na inilathalang month label). Tinukoy ito ng Layer 1 bilang base_shadow. Walang look-ahead o napaagang resulta ng trading.
Panatilihin ito, pero itala ang bawat retry_buy fill sa mga tala ng desisyon at ilista ito sa port_deviations bilang ipinataw ng platform. Suriin sa buong run kung mangyayari ito. Kung denied_margin ay 0, itakda ang entry_retry_sessions sa 0 para eksaktong tumugma ang port sa source.
Maaaring magbukas ng posisyon ang landas na retry_buy sa hanggang 3 session matapos ang desisyon sa katapusan ng buwan na hindi naman talaga katapusan ng buwan: naka-set ang target_long, walang hawak na posisyon ang strategy at tinanggihan o inalis ang month-end BUY. Bumibili lang ang source (`if row.last_dotm and row.close > row.monthly_sma`) kapag last_dotm. Karaniwang napupunan ang order sa susunod na open at hindi na flat ang strategy; sinasaklaw ng pangunahing order_in_flight guard ang nakabinbing order. Kaya nangyayari lang ito kapag tinanggihan ng platform ang order, na bihira dahil sa buffer na 3%; inilalapit din nito ang resulta sa hawak na posisyon ng source. Pagbawi ito sa execution, hindi bagong signal. Ipinapaliwanag ito sa katwiran ng config, pero walang entry na port_deviations.
Katanggap-tanggap bilang sapilitang paglihis. Itala ang fill_price_buffer at cost_reserve sa port_deviations.
floor(equity / (close*1.03*1.0005)) ang sizing, kaya humigit-kumulang 97% ng equity ang ginagamit (sandbox avg_position_pct 97.2), hindi ang buong cash gaya sa source. Sapilitang puwang ito ng platform para sa agwat hanggang sa susunod na open at sa pagsusuri ng margin. Nananatili sa nakapirming 1.0 ang allocation_fraction at leverage. Bahagya nitong binabago ang exposure, hindi ang mga trade.
Mas mainam na gamitin ang reset hook na ibinibigay ng base kung mayroon. Kung wala, panatilihin ito at magdagdag ng pagsusuri na walang bukas na order para sa instrumento bago magsagawa ng paglilinis.
Binabago ng _prune_stale_entries ang pribadong diksyunaryong _inflight_entries ng base at inaalis ang anumang order na may estadong INITIALIZED/DENIED. Sa backtest, napupunan ang mga entry sa loob ng event, kaya mga stub lamang na hindi naipadala ang nililinis nito. Sa paper trading, posibleng malinis ang isang order na INITIALIZED sandali bago ito isumite. Dahil maagang nagbabalik ang base na on_bar kapag may bukas na order, malabong magdulot ito ng duplicate.
Buod ng Resulta
Nangangailangan ng pag-iingat ang positibong resulta sa mahabang kasaysayan kapag kakaunti ang magkakahiwalay na trade at hindi pa napapatunayan ang kabuluhan sa estadistika at aktibong paglamang sa merkado.
Pagkaraan ng tatlong pag-ulit, bumoto ang analyst na iangat ang estratehiya at umabot sa paper trading ang pagtakbo. Hindi pa rin nagbibigay ng tiyak na konklusyon ang kabuluhan sa estadistika, hindi naabot ng Calmar ang pinakamababang antas nito, at kinailangan ng estratehiyang lingguhang SPY na na-deploy ang iisang badyet ng alokasyon dahil sa korelasyon nito rito.
Iangkop ang tuntunin ng Pinkfish na 10-buwang SMA sa walang leverage at long-only na SPY, gamit ang mga signal sa katapusan ng buwan sa kalendaryo at execution sa open ng susunod na session; hindi kasama ang mga dibidendo.
Nagbalik ang buong backtest ng 989.40%, na may Sharpe na 0.645, 22 saradong trade at pinakamataas na drawdown na 26.33%. Iniulat ng analyst ang pinagsamang OOS Sharpe na humigit-kumulang 0.574 at holdout Sharpe na 0.492 sa 12 trade.
Pagsusuri
monthly-sma
Pagsusuri
strategy.py
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.