Lumaktaw papunta sa nilalaman
Lahat ng estratehiya

Mga Estratehiya

Double-7s Portfolio (pinkfish, F. Aultman batay kina Connors at Alvarez): Bumili sa 7-Day Closing Low na Nasa Itaas ng 200-SMA, Magbenta sa 7-Day Closing High, Pantay ang Timbang sa SPY/QQQ/DIA/IWM, USEQ Daily Bars, Long-Only

Resulta: Inabandona

Double7sPortfolioUseq

Buod ng Resulta

Inilapat ng Double7sPortfolioUseq ang tuntunin ng Double-7s nina Connors at Alvarez sa apat na malalawak na US index ETF sa zero-commission na venue na USEQ, long-only at pantay ang timbang, na may 200-SMA regime filter. Hindi ito nakapasa sa verification: nag-timeout sa 300s ang Layer 3 sandbox smoke test sa lahat ng 3 iteration, kasama ang iteration 2 na ginawang incremental ang trabaho kada bar. Ayon sa mga tala ng profiling sa iteration-3, napunta ang oras sa instrument scan ng catalog ng backtest runner, hindi sa strategy. Itinigil ang run bago ang anumang backtest, optimization, pagsusuri ng analyst o risk review, kaya hindi nasukat ang edge nito.

Hypothesis

Tapat na paglalahad ito ng halimbawang 'double-7s-portfolio' ng pinkfish (Farrell Aultman, lisensiyang MIT; https://github.com/fja05680/pinkfish/blob/18a0d557ead25e0e82de3ece86bcab6c325a59ed/examples/portfolios/double-7s-portfolio/strategy.py). Iniaangkop nito ang tuntunin ng Double 7 nina Larry Connors at Cesar Alvarez mula sa 'Short Term Strategies that Work' sa portfolio ng mga ETF. Long-only mean reversion ang tuntunin batay sa daily closes: bumili kapag nagsara ang isang ETF sa pinakamababang closing price……Magpakita ng higit paMagpakita ng mas kaunti

Tapat na paglalahad ito ng halimbawang 'double-7s-portfolio' ng pinkfish (Farrell Aultman, lisensiyang MIT; https://github.com/fja05680/pinkfish/blob/18a0d557ead25e0e82de3ece86bcab6c325a59ed/examples/portfolios/double-7s-portfolio/strategy.py). Iniaangkop nito ang tuntunin ng Double 7 nina Larry Connors at Cesar Alvarez mula sa 'Short Term Strategies that Work' sa portfolio ng mga ETF. Long-only mean reversion ang tuntunin batay sa daily closes: bumili kapag nagsara ang isang ETF sa pinakamababang closing price nito sa loob ng 7 araw habang nasa itaas ito ng 200-day SMA, at magbenta kapag nagsara ito sa pinakamataas na closing price sa loob ng 7 araw. Para sa ETF isinulat ang source, kaya ginagamit nito ang zero-commission na venue na USEQ at mga DAILY bar na may ilang dekadang kasaysayan. Kinukuha ng source ang listahan ng mga symbol mula sa tumatawag dito at hindi ito nagtatakda ng listahan sa code. Ginagamit namin ang apat na malalawak na US index ETF na sinubukan ni Connors sa tuntunin: SPY, QQQ, DIA at IWM. Iyon ay 4 pangalan, pasok sa limitasyong humigit-kumulang 10 pangalan mula sa aralin 173. Nakapirmi ang piniling listahan, pero mga index tracker ang apat na ito na umiiral at nanatiling liquid mula 1993-2000, kaya walang survivorship selection sa mga indibiduwal na pangalan. Eksaktong kinopya mula sa source ang mga default option: period=7, stop_loss_pct=1.0 (binabasa ito ng source bilang 100%, kaya nakapuwesto ang stop sa 0 at hindi ito kailanman magti-trigger; nananatili ito bilang parameter), margin=1 (walang leverage), use_regime_filter=True, use_vola_weight=False (pantay na timbang na 1/N), use_adj=False. Hindi maisasakatuparan dito ang use_adj: naka-adjust sa stock split ang mga presyo namin sa USEQ at hindi kasama sa PnL ang mga dividend. Kilala at maliit na paglihis ito mula sa source, dahil gumagamit ito ng mga hindi naka-adjust na closing price at hindi rin isinasama ng sariling accounting ng pinkfish ang mga dividend. Pagkuwenta ng bayarin: walang komisyon ang USEQ, at humigit-kumulang 0.02-0.05% ang round trip para sa spread at market impact sa mga ETF na ito. Ipinapakita ng nailathalang resulta ng Double-7s sa SPY ang average na trade na humigit-kumulang +0.6 hanggang +1.0% gross sa loob ng 3-8 session na holding period. Kahit humina nang kalahati ang resultang iyon matapos mailathala (humigit-kumulang 0.4%), katumbas pa rin ito ng humigit-kumulang 10x ng gastos. Inaasahang aabot sa humigit-kumulang 8-12 trade kada ETF bawat taon ang kabuuang trade sa buong buhay ng strategy sa 4 ETF sa loob ng humigit-kumulang 25 taon, kaya nasa 800-1,100 trade ang kabuuan. May flat state ang strategy. Nasa market ang bawat ETF nang humigit-kumulang 25-35% ng oras. Ganap na flat ang book kapag walang ETF na nasa 7-day low habang nasa itaas ng 200-SMA, at flat din ito sa mga bear regime kapag nasa ibaba ng 200-SMA ang mga closing price.

Iteration 3 ng isang Layer-3 sandbox_timeout. Hindi nagbago ang mga tuntunin sa trading mula sa iteration 2; docstring lang ang binago para itala ang diagnosis. Pinatakbo ko ang eksaktong code ng iteration 2 sa parehong 2400-araw at 4-leg na window sa pamamagitan ng run_backtest_in_subprocess at sinuri ang child gamit ang py-spy. Lahat ng wall time nito ay nasa src/backtesting/runner.py:535 -> ParquetDataCatalog.instruments(instrument_ids=...) -> fsspec glob, na dumaraan sa bawat instrument class directory sa……Magpakita ng higit paMagpakita ng mas kaunti

Iteration 3 ng isang Layer-3 sandbox_timeout. Hindi nagbago ang mga tuntunin sa trading mula sa iteration 2; docstring lang ang binago para itala ang diagnosis. Pinatakbo ko ang eksaktong code ng iteration 2 sa parehong 2400-araw at 4-leg na window sa pamamagitan ng run_backtest_in_subprocess at sinuri ang child gamit ang py-spy. Lahat ng wall time nito ay nasa src/backtesting/runner.py:535 -> ParquetDataCatalog.instruments(instrument_ids=...) -> fsspec glob, na dumaraan sa bawat instrument class directory sa data/catalog/data, kasama ang 56,006 binary_option (Polymarket) directory. Nasa humigit-kumulang 77 ang load ng host sa 18 core. Gumamit ang child ng humigit-kumulang 9% CPU, naharang sa disk I/O, at nag-scan pa rin nang walang naprosesong bar nang umabot ito sa limitasyong 900s (3x ng sandbox budget). Constant na ang gastos sa bawat bar ng strategy: deque na may running-sum na SMA200 at O(7) na high/low sa bawat leg, sa humigit-kumulang 2.4k daily bar kada leg. Kaya problema ito sa catalog at host plumbing (aralin 155 (b)), hindi sa strategy code, at walang pagbabago sa code ang makaaayos dito. Sa runner dapat gawin ang pag-aayos: gumamit ng instrument lookup kada class/id sa halip na glob sa buong catalog, o alisin ang Polymarket directory. Gaya ng dati, mga paglihis ito mula sa source: hindi maisasakatuparan ang use_adj (USEQ ang mga presyong naka-adjust sa stock split at hindi kasama sa PnL ang mga dividend); sa engine na ang sapilitang exit sa dulo ng datos sa pamamagitan ng close-out sa stop; use_vola_weight=False (pantay na timbang), gaya ng mga default ng source.

verification_loop: sandbox_timeout: Nabigo ang verification (Layer 3 — sandbox backtest): lumampas ang smoke test sa 300s na wall-clock limit sa window na humigit-kumulang 20000 bar (2400 araw ng SPY.USEQ-1-DAY-LAST-EXTERNAL). Halos palaging nangangahulugan ito ng trabahong ginagawa sa bawat bar na lumalaki kasabay ng history — halimbawa, muling pag-scan sa buong funding/supplementary series, o muling pagbuo ng listahan at pagtawag sa min()/sorted() sa loob ng calculate_signal()/on_bar() sa bawat bar. Ihanda muna ang mga nakaayos na timestamp array ONCE sa __init__ at gumamit ng bisect, o mag-cache ng lookup ayon sa timestamp, para maging O(log n) sa halip na O(n) ang gastos sa bawat bar.

Implementasyon

Salin ng Stratmill sa double-7s-portfolio ng pinkfish (F. Aultman, MIT). Ginagamit nito ang tuntunin ng Double 7 nina Connors at Alvarez sa SPY/QQQ/DIA/IWM daily USEQ bar, long-only at pantay ang timbang na 1/N. Binibili ang isang ETF kapag nagsara ito sa pinakamababang closing price nito sa loob ng 7 araw habang nasa itaas ng 200-day SMA. Ibinebenta ito kapag nagsara sa pinakamataas na closing price sa loob ng 7 araw, o bumaba sa stop nito (itinatalaga ng default na stop_loss_pct=1.0 ang stop sa 0, kaya hindi ito nagti-trigger kailanman, gaya sa source).

Mga Resulta ng Beripikasyon

sandbox_timeout: Nabigo ang verification (Layer 3 — sandbox backtest): lumampas ang smoke test sa 300s na wall-clock limit sa window na humigit-kumulang 20000 bar (2400 araw ng SPY.USEQ-1-DAY-LAST-EXTERNAL). Halos palaging nangangahulugan ito ng trabahong ginagawa sa bawat bar na lumalaki kasabay ng history — halimbawa, muling pag-scan sa buong funding/supplementary series, o muling pagbuo ng listahan at pagtawag sa min()/sorted() sa loob ng calculate_signal()/on_bar() sa bawat bar. Ihanda muna ang mga nakaayos na timestamp array ONCE sa __init__ at gumamit ng bisect, o mag-cache ng lookup ayon sa timestamp, para maging O(log n) sa halip na O(n) ang gastos sa bawat bar.

Buod ng Resulta

Kapag nagmula ang sandbox timeout sa pag-scan ng catalog bago ang unang bar at hindi sa strategy code, hindi ito maaayos ng muling pagsulat ng strategy; kailangan ng ayos sa infrastructure, hindi dagdag na coding iteration.

Matapos ang 3 iteration, itinigil ito dahil naipit sa verification loop: lumampas sa 300s na wall-clock limit ang bawat Layer 3 sandbox backtest sa 2400-araw na SPY.USEQ daily window. Ayon sa mga tala ng iteration-3, natukoy sa profiling na ang wall time ay mula sa ParquetDataCatalog.instruments() glob sa catalog (humigit-kumulang 56k Polymarket directory), na tumatakbo bago ang anumang strategy code, hindi sa trabahong ginagawa kada bar ng strategy.

Long-only at pantay ang timbang ng Double-7s mean-reversion portfolio sa SPY/QQQ/DIA/IWM daily USEQ bars (salin ng halimbawa ng pinkfish para sa tuntunin nina Connors at Alvarez): bumili ng ETF sa pinakamababang closing price nito sa loob ng 7 araw habang nasa itaas ito ng 200-day SMA, at ibenta ito sa pinakamataas na closing price sa loob ng 7 araw.

Walang datos ng performance. Walang laman ang ulat ng backtest, hindi tumakbo ang optimization, at walang nailabas na return, Sharpe o bilang ng trade.

Pagsusuri

double-7s-portfolio

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.