← Maqolalarga qaytish
July 3, 2026
5 daqiqa o'qish

Ikki oʻqli parametr fazosi: nega sweepingizning katta qismi deyarli bepul boʻlishi kerak

Ikki oʻqli parametr fazosi: nega sweepingizning katta qismi deyarli bepul boʻlishi kerak
#algotrading
#backtest
#parametr qidirish
#optimizatsiya
#keshlash
#oʻlchamlilik laʼnati
Part 4 of 10 · Collection
High-Performance Backtest Engines

"Illyuziyalarsiz backtest'lar" turkumining bir qismi.

Oʻlchamlilik laʼnati odatda ogohlantirish sifatida aytiladi: qoʻshgan har bir parametringiz qidiruv fazosini koʻpaytiradi, shuning uchun 18 oʻlchovli strategiyani sweep qilish umidsiz ish. Bu qarash jimgina har bir oʻlchov bir xil qimmatga baholanadi deb faraz qiladi. Aslida esa unday emas. Bizning ikki/uch timeframe'li dvigatelimizda parametrlarning uchdan ikki qismini sweep qilish deyarli bepul, uchdan bir qismi esa aslida butun hisoblash hisobini oʻz zimmasiga oladi. Bu boʻlinishni bir marta koʻrganingizdan soʻng "qidiruv fazosi juda katta" degan shikoyat toʻgʻri boʻlmay qoladi. Toʻgʻri savol shu: qaysi oʻlchovlar uchun toʻlayapsiz?

Qayta hisoblashga muhtoj boʻlmagan oʻlchov

Bizning parametr-qidiruv benchmark'imiz koʻp timeframe'li momentum strategiyasini ishga tushiradi: ikki yoki uch timeframe'da Hull moving average va uning uch marta silliqlangan varianti (HMA3), hamda crossover qachon harakat qilishga "yetarlicha toza" ekanini hal qiluvchi yoʻnaltirilgan-ajralish darvozasi. Uch-TF variantining toʻliq qidiruv fazosi oʻn sakkiz oʻlchovdan iborat — har bir timeframe uchun davr va HMA uzunligi, hamda har bir timeframe'da kirish va chiqish uchun ajralish threshold'lari toʻplami.

Buni sweep qilishning sodda usuli — bitta tsikl: parametr vektorini tanlash, har bir indikatorni noldan qurish, simulyatsiyani ishga tushirish, uni baholash, takrorlash. Biz shu yerdan boshladik. U sekin edi, va u sekin boʻlishining sababi biz uni nom bilan atagach uyat boʻlib chiqdi: qoʻshni sinovlarning ezib tashlovchi koʻpchiligi uchun biz oʻzgarmagan indikatorlarni qayta hisoblab yurar edik.

Kirish-ajralish threshold'ini 0.03 dan 0.035 ga surib qayta ishga tushiring. Bir yillik 1 daqiqalik barlar boʻyicha Hull MA oldingi sinov bilan bit-be-bit bir xil — threshold uning taʼrifida hech qayerda uchramaydi. Shunga qaramay sodda tsikl uni baribir yarim milliondan ortiq bar boʻylab, uch timeframe chuqurlikda, har safar qaytadan quradi. Biz hisoblash byudjetimizning deyarli barchasini aslida oʻzgartirayotgan parametrimizga bogʻliq boʻlmagan miqdorlarni qayta chiqarishga sarflayotgan edik.

Ana shu kuzatuv — butun maqola shu haqda. Ayrim parametrlar indikatorlarni oʻzgartirishini, ayrimlari esa faqat belgilangan indikatorlarga qoʻllaniladigan qaror qoidasini oʻzgartirishini payqagan lahzangizda parametr fazosi tekis oʻlchovlar bulutidan iborat boʻlishdan toʻxtaydi va narx yorligʻlari keskin farq qiluvchi ikki uyalangan qatlamga aylanadi.

Bir emas, ikki oʻq

Turli narx yorligʻlaridagi parametr fazosining ikki oʻqi: har bir yacheykasi zich, deyarli bepul threshold konfiguratsiyalari qatlamini ochib beruvchi siyrak qimmat indikator toʻri

Parametrlarni ularni qayta baholash sizni nimani qayta hisoblashga majbur qilishi boʻyicha ajrating:

  • Qimmat oʻq — indikator parametrlari. Timeframe davri va HMA uzunligi. Ikkalasidan birini oʻzgartirsangiz, indikatorni butun narx qatori boʻylab qaytadan qurishingiz kerak: yuqori timeframe'ni qayta tanlash, Hull vaznlashni ishga tushirish, crossover qatorini va har bir crossda ajralishni qayta hisoblash. Bu tarixning har bir bari boʻyicha O(n) sweep, va siz uni har bir alohida kombinatsiya uchun toʻliq toʻlaysiz. Uch-TF strategiyasida bu oʻq oltita parametr: yuqori, oʻrta va past timeframe'larning har biri uchun (period, hma_length).

  • Arzon oʻq — qaror threshold'lari. Allaqachon hisoblangan crossover va ajralish qatorlarini hisobga olib, kirish yoki chiqishni hal qiluvchi yoʻnaltirilgan-ajralish darvozalari. Threshold'ni oʻzgartirsangiz, hech qanday indikator qimirlamaydi. Siz faqat oldindan hisoblangan signallar boʻyicha bitta O(n) oʻtishni qayta ishga tushirasiz, darvozalarni tekshirasiz va toʻldirishlarni qayd qilasiz. Uch-TF strategiyasida bu oʻq oʻn ikki parametr (uchta timeframe'ning har birida toʻrtta ajralish threshold'i — kirish-sotib olish, kirish-sotish, chiqish-sotib olish, chiqish-sotish). Ikki-TF varianti sakkiztaga ega (ikki timeframe'ning har birida toʻrtta threshold).

Demak, fazoning haqiqiy shakli: uch-TF uchun 6 qimmat + 12 arzon = 18, ikki-TF uchun esa 4 qimmat + 8 arzon = 12. Oʻlchamlilikning uchdan ikki qismi arzon oʻqda yashaydi. Va ikki oʻq faqat soni bilan farq qilmaydi — ular birlik qiymatida uch tartibdan koʻproq martaga farq qiladi, va bu maqolaning qolgan qismi aynan shu son haqida.

Tuzilma qatʼiy uyalangan. Qimmat oʻqdagi har bir nuqta — har bir timeframe uchun bitta aniq (period, hma_length) — belgilangan signal massivlari toʻplamini aniqlaydi. Ana shu belgilangan poydevor ustida arzon oʻqning butun bir qatlami yotadi: minglab threshold vektorlari, har biri xuddi shu massivlar boʻyicha tez oʻtish. Siz poydevor uchun bir marta toʻlaysiz va uni butun qatlamga amortizatsiya qilasiz.

Nega indikatorlar threshold'larga bogʻliq emas

Keshlash faqat matematik dalil tufayli ishlaydi, omadli implementatsiya tafsiloti tufayli emas, va buni aniq aytish arziydi, chunki bu yuk koʻtaruvchi faraz. Indikator massivlari faqat (period, hma_length) funksiyasidir. Ajralish threshold'lari ularning taʼrifida hech qayerda uchramaydi.

Aniqroq aytganda, har bir timeframe uchun dvigatel bazaviy indeks boʻyicha toʻrtta moslashtirilgan massivni oldindan hisoblaydi: Hull MA hma, uning uch marta silliqlangan hma3, crossover qatori cross (+1 sotib olish / −1 sotish / 0) va har bir crossdagi separation foizi. Ularning har biri narxlar va ikki indikator parametridan olinadi. Threshold — siz separation ni unga qiyoslaydigan son — keyinroq, qaror qabul qilish paytida qoʻllaniladi. U massivlarga hech qachon tegmaydi.

Bu ahamiyatsiz darajada xavfsiz qayta tartiblash emas. U faqat shuning uchun xavfsiz, chunki biz maʼlumot qachon mavjud boʻlishiga ehtiyot boʻldik, va bu masala shu turkumdagi boshqa joyda oldinga-qarash biasi ishining tashvishidir. Bazaviy bar i dagi yuqori-timeframe indikatori yopilgan yuqori-TF shamlaridan hamda joriy bazaviy yopilish close[i] ga teng ishlab turgan yopilishga ega shakllanayotgan shamdan hisoblanadi — bu i barida maʼlum boʻlgan qiymat. Kelajakdan hech narsa sizib kirmaydi. Shuning uchun i baridagi oldindan hisoblangan signal aynan jonli botning i barida koʻrgan narsasi boʻladi, va u siz keyinroq qaysi threshold bilan sinasangiz ham amal qilib qolaveradi. Sizib chiqadigan signalni keshlash faqat sizishni keshlar edi; sababiy signalni keshlash esa siz haqiqatan savdo qila oladigan narsani keshlaydi.

Bu bogʻliq emaslik bizga faktorizatsiya beradi. Bitta toʻliq parametr vektori θ = (indicator_params, threshold_params) ning baholanishini shunday yozing:

signals   = build_indicators(indicator_params)      # EXPENSIVE, depends only on indicator_params
score     = simulate(signals, threshold_params)     # CHEAP, reuses signals across all thresholds

build_indicators threshold_params ni oʻqimaydi. Aynan shu bitta dalil keshga ruxsat beradi: indicator_params ni belgilangan holda ushlab turing, threshold_params ni erkin oʻzgartiring, va signals — siz bir marta hisoblaydigan konstanta.

Arxitektura: bir marta hisobla, koʻp marta sweep qil

Indikator parametrlari boʻyicha kalitlangan signal keshi tezkor batch sweep'ni oziqlantiradi: bitta indikator qurilishi bir xil keshlangan massivlarni boʻlishuvchi threshold baholashlarining keng qatoriga tarqaladi

Dvigatel (scripts/engine_multitf.py, bizning backtester'imizdagi commit bfc8aaa) faktorizatsiyani nomlari nima qilishini aynan aytadigan ikki qism bilan amalga oshiradi.

SignalCache — qimmat oʻq, memoizatsiya qilingan. Bu (period_bars, hma_length) boʻyicha kalitlangan lugʻat. Undan timeframe signallarini soʻrang va agar bu indikator kombinatsiyasi ilgari qurilgan boʻlsa, u keshlangan TFSignals ni qaytaradi, aks holda ularni bir marta quradi va saqlaydi. Kalit faqat indikator parametrlari boʻlgani uchun, indikator kombinatsiyasini boʻlishuvchi har bir threshold konfiguratsiyasi — va zich threshold sweep'da bular minglab — xuddi shu kesh yacheykasiga tushadi. Ayniqsa yuqori timeframe'lar buni mukofotlaydi: masalan, toʻrtta nomzod davrga bir nechta HMA uzunligini koʻpaytirgan qoʻpol toʻr kichik miqdordagi alohida qimmat qurilishdir, va ularning har biri ustiga taxlangan butun threshold qatlami boʻylab qayta ishlatiladi.

sweep_separations — arzon oʻq, batchlangan. U keshlangan signal massivlarini va threshold vektorlari matritsasini (sps, shakli [m, 12]) oladi va ularning barchasini bitta kompilyatsiya qilingan yadro orqali ishga tushiradi. Har bir qator — bitta O(n) oʻtish: barlar boʻylab yuring, darvozalarni qoʻllang, open[i+1] da sizishsiz toʻldirishlarni qayd qiling, PnL va pozitsiyadagi vaqtni hisoblang. Bu tsikl ichida hech qanday indikator qayta qurilmaydi — u cross va separation ni toʻgʻridan-toʻgʻri keshdan oʻqiydi. Ichki simulyatsiya JIT-kompilyatsiya qilingan (Numba), shuning uchun bir marta isitilgach har bir konfiguratsiya qiymati Python overhead'i bilan emas, balki barlar boʻyicha bitta chiziqli skanerlash bilan aniqlanadi.

Ikki qism tabiiy uyalangan qidiruvga birlashadi: tashqi tsikl qimmat oʻq boʻylab yuradi (har bir iteratsiya bitta indikator kombinatsiyasini quradi va keshlaydi), ichki tsikl esa ana shu keshlangan massivlar boʻyicha arzon oʻq boʻylab keng batchni tarqatadi. Kodda shakl aynan shunday — keng arzon batchni oʻrab olgan kichik qimmat tsikl:

cache = SignalCache(base_close, base_ts)           # keyed by (period, hma_length)

for htf_p, htf_h, mtf_p, mtf_h, ltf_p, ltf_h in indicator_grid:   # EXPENSIVE axis (coarse)
    htf = cache.get(htf_p, htf_h)                  # built once, then a cache hit forever
    mtf = cache.get(mtf_p, mtf_h)
    ltf = cache.get(ltf_p, ltf_h)

    sps = sample_thresholds(m=4000)                # CHEAP axis: [m, 12] threshold vectors
    pnl, n_trades, bars_in_pos = sweep_separations(  # one compiled batch, no indicator work
        base_close, base_open, htf, ltf, sps, mtf=mtf)

Siz qimmat quruvchiga indikator toʻri ruxsat berganicha kam marta tegasiz, va arzon sweep'ga hajmni bajarishiga imkon berasiz — hech qachon qimirlamaydigan massivlarga qarshi minglab sps qatorlari. Butun optimizatsiya shu — hech qanday approksimatsiya yoʻq, hech qanday yoʻqolgan aniqlik yoʻq, faqat oʻzgarmagan narsani qayta hisoblashdan bosh tortish.

"Bepul" aslida nimaga tushadi: sonlar

Har bir konfiguratsiya qiymatining panjarali taqqoslashi: har bir konfiguratsiya uchun qayta hisoblash uchun baland ustun, keshlangan threshold oʻtishi uchun ingichka boʻlak, taxminan 1,600x farq bilan izohlangan

Biz demo yuklamada ikki oʻqni oʻlchadik: bir yillik toʻliq 1 daqiqalik ETHUSDT barlari (~527k bar), uch-TF, indikatorlar isitilgan va JIT kompilyatsiya vaqtdan chiqarilgan.

Arzon oʻqda sweep_separations sekundiga ~5,600 threshold-konfiguratsiyani ushlab turadi. Bu har bir konfiguratsiya uchun toʻliq simulyatsiya — darvozalar, toʻldirishlar, PnL, ekspozitsiya — yarim milliondan ortiq bar boʻyicha, har bir konfiguratsiya uchun taxminan 180 mikrosekundda. Uning shunchalik tez boʻlishining sababi — u hech qanday indikator ishi qilmaydi: har bir konfiguratsiya xuddi shu keshlangan cross va separation massivlarini oʻqiydi.

Endi muqobil variantni narxlaymiz. Uch-TF indikator toʻplamini bir marta qurish bir necha yuz millisekund tartibida (~0.3 s) vaqt oladi — uch timeframe'ni qayta tanlash, Hull vaznlash, butun yil boʻyicha crossover va ajralishni chiqarish. Agar siz konfiguratsiya tsikli ichida indikatorlarni qayta hisoblasangiz — sodda bir-tsiklli dizayn — sekundiga oʻsha 5,600 konfiguratsiyaning har biri buning oʻrniga toʻliq indikator qurilishini toʻlar edi. Har bir konfiguratsiya qiymati ~180 mikrosekunddan ~0.3 sekundgacha shishib ketadi:

Har bir konfiguratsiya qiymati Konfiguratsiya/sek
Arzon oʻq (keshlangan signallar) ~180 µs ~5,600
Har bir konfiguratsiya uchun indikatorlarni qayta hisoblash ~0.3 s ~3.4

Nisbat ~1,600x. Keshlangan signallar boʻyicha arzon oʻqni sweep qilish har bir threshold vektori uchun indikatorlarni qaytadan quruvchi sodda dizayndan taxminan uch tartibdan arzonroq. Aniq qilib aytganda: keshlangan yoʻlda bir sekunddan kamroq vaqtda tugaydigan bir necha ming threshold konfiguratsiyasidan iborat batch, agar har bir konfiguratsiya oʻz indikatorlarini qaytadan qurganida, taxminan bir soatning katta qismini olar edi. Bir xil natijalar, bir xil aniqlik, matematikada hech qanday qisqartma yoʻq — yagona farq shuki, biri oʻzgarmasni qayta hisoblaydi, ikkinchisi esa yoʻq.

Bu siz oxirida ustiga sepadigan mikro-optimizatsiya emas. U qaysi qidiruvlar amalga oshirilishi mumkin ekanini oʻzgartiradi. 5,600 cfg/s tezlikda threshold oʻqi uni tegishlicha oʻrganish uchun yetarlicha zich — siz har bir indikator kombinatsiyasi uchun nozik toʻr yoki uzun random/QMC namunasini tanlashga qodir boʻlasiz — qimmat oʻq esa ataylab qoʻpol boʻlgan bir nechta qurilishligicha qoladi. Hisoblash byudjeti parametrlar haqiqatan nimagadir tushadigan joyga oqadi.

Oʻlchamlilik laʼnati, qayta narxlangan

Ikki qavatli narx xaritasiga qayta belgilangan parametrlarning tekis bir jinsli toʻri: bir nechta qimmat yacheykalar qalin chizilgan, qolganlari deyarli bepul sifatida soyalangan

Maqola boshlangan qarashga qayting. Oʻlchamlilik laʼnati aytadiki, qidiruv fazosi parametrlar soniga eksponensial oʻsadi, shuning uchun koʻproq oʻlchov kategorik yomonroq. Bu toʻrning hajmi haqida toʻgʻri. Ammo uni qamrab olishning qiymati haqida chalgʻituvchi, chunki u har bir oʻlchovni bir xil narxlaydi.

Oʻqlarni ajratganingizdan soʻng, son boshqacha oʻqiladi. Uch-TF strategiyasi 18 oʻlchovli, ammo bu oʻlchovlarning faqat 6 tasi qimmat. Qolgan 12 tasi — hisoblash hisobini hech qanday jiddiy tarzda kengaytirmasdan toʻrni kengaytiruvchi arzon-oʻq oʻlchovlari — ularga tiyin evaziga minglab konfiguratsiya tashlashingiz mumkin. Ikki-TF strategiyasi 12 oʻlchovli, faqat 4 qimmat va 8 arzon oʻlchov bilan. Ikkala holatda ham "laʼnat"ning koʻpchiligi sweep qilish deyarli hech narsaga tushmaydigan oʻqda toʻplangan.

Shunday qilib, qidiruv qiymatini halol tahlil qilishning yoʻli "qancha parametr" emas, balki "qancha qimmat parametr, va ularning toʻri qanchalik qoʻpol boʻlishi mumkin"dir. Qimmat oʻq — eksponensial aslida ogʻritadigan joy, va u yerda siz kichik, yaxshi tanlangan toʻrni xohlaysiz — bir nechta nomzod davr, HMA uzunliklarining oʻrtacha diapazoni — biz boshqa joyda foydalanadigan adaptiv-ruxsat drill-down ruhida, ehtimol qoʻpoldan-nozikka takomillashtirilgan. Arzon oʻq — siz saxovatli boʻla oladigan joy, chunki har bir qoʻshimcha threshold konfiguratsiyasi 180 mikrosekund.

Bu qayta narxlash bizning HMA strategiyamizdan ancha uzoqroqqa yaxshi umumlashadi. Naqsh — ayrim parametrlar xususiyatlarni oʻzgartiradi, koʻpchilik parametrlar belgilangan xususiyatlarga qoʻllaniladigan qoidani oʻzgartiradi — tizimli savdoda hamma joyda takrorlanadi. Indikator uzunliklari, qayta tanlash chastotalari va lookback oynalari qimmat; kirish/chiqish threshold'lari, stop masofalari, pozitsiya-oʻlchamlash koʻpaytirgichlari va tasdiqlash darvozalari arzon. Har qachon parametr faqat allaqachon hisoblangan signallar ustidagi qaror chegarasini qayta shakllantirsa, u arzon oʻqqa tegishli va u yerda sweep qilinishi kerak. Bir xil oiladan boʻlgan bogʻliq keshlash yutuqlari koʻp-timeframe'li parquet keshlashda va kengroq dvigatel tezligi narvonida namoyon boʻladi.

Bepul tushlikning hisobi qayerda

Arzon oʻq hisoblashda arzon. U statistikada arzon emas, va bu ikkisini aralashtirib yuborish — bu ishlash yutugʻini overfitting mashinasiga aylantirishning yoʻli.

Siz baholaydigan har bir threshold konfiguratsiyasi — bir sinov, va bitta maʼlumotlar toʻplamida minglab sinov oʻtkazganingizda, ularning eng yaxshisi qisman omad tufayli yaxshi koʻrinadi. Bu sinovlarni 1,600x arzonroq qilish omadni yoʻqotmaydi — u uni toʻplashni osonlashtiradi. Zich threshold sweep — aynan koʻp-sinovlik inflyatsiyasi eng qattiq tishlaydigan holat: koʻp nomzod, bitta tarix, va maksimumni hisobot qiladigan tanlov qoidasi. Dunyodagi eng tez dvigatel sizga test oynangizning shovqiniga goʻzal moslashadigan va namunadan tashqarida muvaffaqiyatsizlikka uchraydigan threshold vektorini bajonidil topshiradi.

Shuning uchun intizom tezlik bilan miqyoslashishi kerak. Sinovning hisoblash qiymati nolga qarab tushgan lahzada statistik hisob-kitob bogʻlovchi cheklovga aylanadi, va siz uni aniq toʻlashingiz kerak:

  • Sinov soni uchun deflatsiya qiling. Gʻolibni nolga qarshi emas, balki necha konfiguratsiya sinaganingizga qarshi baholang. Deflatsiya qilingan Sharpe koeffitsiyenti va backtest overfitting ehtimoli aynan shu uchun mavjud — ular "biz 4,000 threshold vektorini sinadik" ni hisobot qilingan chetdan chegirmaga aylantiradi.
  • Namunadan tashqarida, har bir fold uchun validatsiya qiling. Arzon sweep baribir halol walk-forward boʻlinishi ichida ishga tushirilishi kerak; faqat namuna ichida gʻalaba qozonadigan threshold, uni qanchalik tez topganingizdan qatʼi nazar, arzimaydi. Bizning dvigatelimiz toʻldirishlarni sizishsiz (open[i+1]) saqlaydi — aynan arzon oʻq oldinga qarab peep qilish orqali ishlashni sotib ololmasligi uchun.
  • Choʻqqilardan koʻra platolarni afzal koʻring. Threshold oʻqi zich va tez boʻlgani uchun, siz uning javob sirtini xaritalashingiz mumkin, faqat uning argmax'ini emas. Barchasi ishlaydigan keng threshold hududi — haqiqiy chet; bitta oʻtkir maksimum — moslashtirilgan artefakt — biz taʼriflayotgan tezlik tufayli hamyonbop qilingan plato-va-choʻqqi farqi.

Ikki oʻqli tuzilmani toʻgʻri oʻqing: u sizga koʻproq ishonch sotib olmaydi, u sizga har bir sinov uchun bir xil ishonch qiymatida koʻproq sinov sotib oladi. Bu haqiqatan qimmatli — arzon oʻqning zich qamrovi platolarni topish va sirtni tavsiflash imkonini beradi — ammo faqat statistik daftarni halol tutsangiz. Tezlik puxta qidirmaslik uchun hisoblash bahonasini olib tashlaydi; u puxta qidiruv topgan narsani chegirma qilish majburiyatini olib tashlamaydi.

Oʻz qidiruvingizni qanday tuzish kerak

Buni oʻz strategiyangizga qoʻllash uchun ish asosan tasniflashdir — parametrlaringizni toʻgʻri oʻqqa saralash — soʻngra uyalangan tsikl:

  1. Har bir parametrni uni qayta hisoblashga majbur qiladigani boʻyicha belgilang. Agar uni oʻzgartirish indikator/xususiyat massivini oʻzgartirsa, u qimmat. Agar u faqat belgilangan massivlarga qoʻllaniladigan taqqoslash, threshold yoki oʻlchamlash qoidasini oʻzgartirsa, u arzon. Shubhalansangiz, soʻrang: bu parametr indikatorning taʼrifi ichida biror joyda uchraydimi? Agar yoʻq boʻlsa, u arzon.
  2. Keshni faqat qimmat oʻq boʻyicha kalitlang. Xususiyat qurilishini uning indikator parametrlari boʻyicha memoizatsiya qiling (SignalCache (period, hma_length) boʻyicha qilganidek). Indikator kombinatsiyasini boʻlishuvchi qoʻshni sinovlar keyin xuddi shu massivlarni bepul qayta ishlatadi.
  3. Arzon oʻqni keshlangan xususiyatlar boʻyicha batchlang. Threshold konfiguratsiyalarini toʻliq qayta baholashlar sifatida emas, balki oldindan hisoblangan signallar boʻyicha zich kompilyatsiya qilingan tsikl sifatida ishga tushiring. Sizning oʻtkazuvchanligingiz — va bizning holatimizda ~5,600 cfg/s — aynan shu yerdan keladi.
  4. Tsikllarni uyalang: qimmat tashqi, arzon ichki. Qimmat toʻrni kichik va ataylab tuting (qoʻpol, yoki qoʻpoldan-nozikka); arzon sweep'ni zich qiling. Byudjetni parametrlar nimagadir tushadigan joyga sarflang.
  5. Sinovlarni soatga qarshi emas, overfitting'ga qarshi byudjetlang. Endi soat chegara emas ekan, deflatsiya qilingan Sharpe / PBO chegara boʻlsin. Statistik jihatdan qancha arzon-oʻq sinovni koʻtara olishingizni hal qiling, va gʻolibni namunadan tashqarida validatsiya qiling.

Muhandislik samarasi va statistik himoya toʻsigʻi — bitta gʻoyaning ikki tomoni: oʻqlarni ajratish arzon oʻlchovlarni toʻliq qidirishga imkon beradi, va aynan shuning uchun siz keyin qanchalik toʻliq qidirganingizni chegirma qilishingiz kerak.

Xulosalar

  1. Barcha oʻlchovlar bir xil qimmatga tushmaydi. Strategiyaning parametrlari qimmat oʻqqa (indikatorlar — butun qator boʻyicha qayta hisoblanadi) va arzon oʻqqa (threshold'lar — oldindan hisoblangan signallar boʻyicha O(n) oʻtish) boʻlinadi. Bizning dvigatelimizda bu uch-TF uchun 6 qimmat + 12 arzon, ikki-TF uchun 4 + 8.
  2. Indikatorlar threshold'larga bogʻliq emas, va bu bogʻliq emaslik — butun optimizatsiya. Xususiyat qurilishi faqat indikator parametrlariga bogʻliq, shuning uchun siz bir marta quraysiz, (period, hma_length) boʻyicha keshlaysiz, va kombinatsiyani boʻlishuvchi har bir threshold konfiguratsiyasi boʻylab qayta ishlatasiz.
  3. Arzon oʻq ~1,600x arzonroq ishlaydi. Keshlangan signallar boʻyicha sekundiga ~5,600 threshold-konfiguratsiya (har biri ~180 µs), agar har safar indikatorlarni qaytadan qursangiz konfiguratsiyaga ~0.3 s ga qarshi. Bir xil aniqlik — yagona farq oʻzgarmasni qayta hisoblashdan bosh tortishdir.
  4. Oʻlchamlilik laʼnati aslida qimmat oʻlchamlilik laʼnatidir. Parametr sonining koʻpchiligi sweep qilish deyarli bepul boʻlgan oʻqda yashaydi. Qimmat toʻrni qoʻpol tuting; arzoniga saxovatli boʻling.
  5. Tezlik bogʻlovchi cheklovni hisoblashdan statistikaga siljitadi. Zich, tez sweep — koʻp-sinovlik mashinasi. Sinov soni uchun deflatsiya qiling, har bir fold uchun validatsiya qiling va choʻqqilardan koʻra platolarni afzal koʻring — bepul tushlik haqiqiy, ammo statistik hisob ixtiyoriy emas.

Toʻliq dvigatel — SignalCache, sweep_separations, sizishsiz koʻp-TF simulyatsiya va uni jonli ishlab turgan sham semantikasiga bogʻlaydigan paritet testi — bizning backtester'imizdagi scripts/engine_multitf.py (commit bfc8aaa)da yashaydi. Keyingi safar kimdir sizga 18 parametrli strategiya qidirish uchun juda katta desa, undan bu parametrlarning qanchasi aslida indikatorlarni harakatga keltirishini soʻrang. Odatda bu ularning uchdan biri, qolganlari esa deyarli bepul.

blog.disclaimer

Authors

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

Bozordan bir qadam oldinda bo'ling

Sun'iy intellekt savdo tahlillari, bozor tahlili va platforma yangiliklari uchun bizning xabarnomaga obuna bo'ling.

Biz sizning maxfiyligingizni hurmat qilamiz. Istalgan vaqtda obunadan chiqishingiz mumkin.