← Мақалаларға оралу
July 3, 2026
5 мин оқу

Екі осьті параметрлер кеңістігі: неге іздеуіңіздің көбі дерлік тегін болуға тиіс

Екі осьті параметрлер кеңістігі: неге іздеуіңіздің көбі дерлік тегін болуға тиіс
#алгоритмдік трейдинг
#бэктест
#параметрлерді іздеу
#оптимизация
#кэштеу
#өлшемділіктің қарғысы
Part 4 of 10 · Collection
High-Performance Backtest Engines

«Иллюзиясыз бэктестер» сериясының бөлігі.

Өлшемділіктің қарғысы әдетте ескерту ретінде айтылады: қосқан әрбір параметр іздеу кеңістігін көбейтеді, сондықтан 18 өлшемді стратегияны толық аралап шығу мүмкін емес сияқты көрінеді. Бұл тұжырымдама әрбір өлшемді бағалау бірдей құн тұратынын үнсіз болжайды. Бірақ бұл олай емес. Біздің қос/үш таймфреймді қозғалтқышымызда параметрлердің үштен екісі іздеуге дерлік тегін тұрады, ал үштен бірі есептеу шығынының дерлік барлығын алып жатыр. Осы бөлінуді байқаған соң, «іздеу кеңістігі тым үлкен» деген шағым дұрыс болмай қалады. Дұрыс сұрақ мынау: сіз қандай өлшемдер үшін төлеп жатырсыз?

Қайта есептеуді қажет етпеген өлшем

Біздің параметрлерді іздеу бенчмаркі көптаймфреймді импульстік стратегияны іске қосады: Hull жылжымалы орташасы және оның үш есе тегістелген нұсқасы (HMA3) екі немесе үш таймфреймде, әрі қиылысудың іс-қимыл жасауға жеткілікті «таза» екенін шешетін бағыттық-ажырау қақпасымен бірге жұмыс істейді. Үш таймфреймді нұсқа үшін толық іздеу кеңістігі он сегіз өлшемнен тұрады — әр таймфрейм үшін период пен HMA ұзындығы, сондай-ақ әрбір таймфреймде кіру мен шығуға арналған ажырау табалдырықтарының жиынтығы.

Мұны аралап шығудың қарапайым тәсілі — жалғыз цикл: параметрлер векторын таңдау, барлық индикаторды нөлден құру, симуляцияны жүргізу, бағалау, қайталау. Біз дәл осыдан бастадық. Бұл баяу болды, әрі баяулықтың себебі, оны атап шыққан соң, ұятты болып шықты: іргелес сынақтардың басым көпшілігі үшін біз өзгермеген индикаторларды қайта есептеп отырдық.

Кіру-ажырау табалдырығын 0.03-тен 0.035-ке жылжытып, қайта іске қосыңыз. Бір минуттық барлардың бір жылдық қатары бойынша есептелген Hull MA алдыңғы сынаумен биттен-битке дәл сәйкес келеді — табалдырық оның анықтамасында ешқандай жерде кездеспейді. Дегенмен қарапайым цикл оны бәрібір қайта құрастырады, жарты миллионнан астам бар бойынша, үш таймфрейм тереңдігінде, әр жолы. Біз есептеу бюджетіміздің дерлік барлығын нақты өзгертіп отырған параметрге тәуелсіз шамаларды қайта шығаруға жұмсап отырдық.

Осы байқау — мақаланың бүкіл мәні. Кейбір параметрлер индикаторларды өзгертетінін, ал кейбіреулері тек тұрақты индикаторларға қолданылатын шешім ережесін ғана өзгертетінін байқаған сәтте, параметрлер кеңістігі өлшемдердің жалпақ бұлты болудан қалып, бағасы мүлде әртүрлі екі қабатты құрылымға айналады.

Бір емес, екі ось

Әртүрлі баға деңгейіндегі параметрлер кеңістігінің екі осі: әр ұяшығы табалдырық конфигурацияларының тығыз әрі дерлік тегін парағын ашатын сирек әрі қымбат индикатор торы

Параметрлерді қайта бағалау не нәрсені қайта есептеуге мәжбүр ететініне қарай бөліңіз:

  • Қымбат ось — индикатор параметрлері. Таймфрейм периоды мен HMA ұзындығы. Екеуінің қайсысын өзгертсеңіз де, индикаторды бүкіл баға қатары бойынша қайта құруға тура келеді: жоғары таймфреймді қайта дискреттеу, Hull өлшеу-салмақтауын жүргізу, қиылысу қатары мен әр қиылыстағы ажырауды қайта есептеу. Бұл тарихтың әр бары үшін O(n) аралап шығу, әрі оны әрбір бөлек комбинация үшін толық төлейсіз. Үш таймфреймді стратегияда бұл ось алты параметрден тұрады: жоғарғы, ортаңғы және төменгі таймфреймдердің әрқайсысы үшін (period, hma_length).

  • Арзан ось — шешім табалдырықтары. Алдын ала есептелген қиылысу мен ажырау қатарына сүйене отырып, кіру керек пе, шығу керек пе екенін шешетін бағыттық-ажырау қақпалары. Табалдырықты өзгертсеңіз, ешбір индикатор қозғалмайды. Сіз тек алдын ала есептелген сигналдар бойынша бір ғана O(n) өтуді қайта іске қосасыз, қақпаларды тексеріп, толтыруларды тіркейсіз. Үш таймфреймді стратегияда бұл ось он екі параметрден тұрады (үш таймфреймнің әрқайсысында төрт ажырау табалдырығы — кіру-сатып алу, кіру-сату, шығу-сатып алу, шығу-сату). Қос таймфреймді нұсқада сегіз параметр бар (екі таймфреймнің әрқайсысында төрт табалдырық).

Сонымен, кеңістіктің нақты пішіні мынадай: үш таймфрейм үшін 6 қымбат + 12 арзан = 18, ал қос таймфрейм үшін 4 қымбат + 8 арзан = 12. Өлшемділіктің үштен екісі арзан оське тиесілі. Әрі екі ось тек санымен ғана емес — бірлік құны бойынша үш реттік шамадан астам ерекшеленеді, ал бұл мақаланың қалған бөлігі дәл осы санға арналған.

Құрылым қатаң түрде кірмелі. Қымбат оське жатқызылатын әрбір нүкте — әр таймфрейм үшін нақты бір (period, hma_length) — тұрақты сигнал массивтерінің жиынын анықтайды. Осы тұрақты негіздің үстінде арзан оське жататын тұтас бір парақ орналасады: сол бір массивтер бойынша жылдам өтетін мыңдаған табалдырық векторы. Сіз негізге бір-ақ рет төлейсіз де, оны бүкіл парақ бойынша амортизациялайсыз.

Неліктен индикаторлар табалдырықтарға тәуелсіз

Кэштеу тек математикалық фактінің арқасында жұмыс істейді, кездейсоқ іске асыру ерекшелігінің арқасында емес, әрі мұны нақты тұжырымдау маңызды, себебі бұл — барлығын ұстап тұратын болжам. Индикатор массивтері тек қана (period, hma_length) функциясы болып табылады. Ажырау табалдырықтары олардың анықтамасында ешбір жерде кездеспейді.

Нақтырақ айтсақ, әр таймфрейм үшін қозғалтқыш негізгі индекс бойынша теңестірілген төрт массивті алдын ала есептейді: Hull MA hma, оның үш есе тегістелген hma3, қиылысу қатары cross (+1 сатып алу / −1 сату / 0) және әр қиылыстағы separation пайызы. Осылардың әрқайсысы бағалар мен екі индикатор параметрінен туындайды. Табалдырық — separation-ды қарсы салыстыратын сан — кейінірек, шешім қабылдау сәтінде қолданылады. Ол массивтерге ешқашан тимейді.

Бұл — қарапайым қауіпсіз қайта құрылым емес. Ол тек біз ақпараттың қашан қолжетімді болатынына мұқият болғандықтан ғана қауіпсіз, ал бұл — осы серияның басқа бөлігіндегі look-ahead ауытқуы туралы жұмыстың мәселесі. Негізгі бардағы i жоғары таймфреймдік индикатор жабылған жоғары-ТФ шамдары мен ағымдағы жабылу бағасы негізгі close[i]-ге тең болатын, яғни i барында белгілі болатын, әлі қалыптасып жатқан шамнан есептеледі. Болашақтан ешнәрсе сыздамайды. Сондықтан i барындағы алдын ала есептелген сигнал нақты уақыттағы бот i барында көретін нәрсенің дәл өзі болып табылады, әрі ол кейін оған қарсы қандай табалдырықты тексерсеңіз де жарамды күйінде қалады. Сыздап тұрған сигналды кэштеу тек сыздауды кэштеу болар еді; себеп-салдарлы сигналды кэштеу нақты сауда жасай алатын нәрсені кэштеу болып табылады.

Бұл тәуелсіздік бізге факторизация береді. Толық параметр векторын θ = (indicator_params, threshold_params) бағалауды былай жазайық:

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-ды оқымайды. Дәл осы жалғыз факт кэштеуге рұқсат береді: indicator_params-ды тұрақты ұстап, threshold_params-ды еркін өзгертіңіз, сонда signals — сіз бір рет қана есептейтін тұрақты шама.

Архитектура: бір рет есепте, көп рет аралап шық

Индикатор параметрлері бойынша кілттелген сигнал кэші жылдам топтамалық аралап шығуды қоректендіреді: бір индикатор құрылымы бір кэштелген массивтерді ортақ пайдаланатын табалдырық бағалауларының кең қатарына тарайды

Қозғалтқыш (scripts/engine_multitf.py, біздің бэктестеріміздегі bfc8aaa commit) факторизацияны атаулары не істейтінін дәл сипаттайтын екі бөлікпен іске асырады.

SignalCache — мемоизацияланған қымбат ось. Бұл (period_bars, hma_length) бойынша кілттелген сөздік. Одан таймфреймнің сигналдарын сұрасаңыз, егер осы индикатор комбинациясы бұрын құрылған болса, кэштелген TFSignals-ты қайтарады, әйтпесе оларды бір рет құрып, сақтап қояды. Кілт тек индикатор параметрлері болғандықтан, индикатор комбинациясын ортақ пайдаланатын әрбір табалдырық конфигурациясы — ал тығыз табалдырық аралап шығуда бұл мыңдаған конфигурация — дәл сол кэш жазбасына тап болады. Бұл әсіресе жоғары таймфреймдерде тиімді: айталық, төрт кандидат период пен бірнеше HMA ұзындығының дөрекі торы — бөлек қымбат құрылымдардың саны аз дегенді білдіреді, әрі әрқайсысы оның үстіне қойылған бүкіл табалдырық парағы бойынша қайта пайдаланылады.

sweep_separations — топтамаланған арзан ось. Ол кэштелген сигнал массивтерін және табалдырық векторларының матрицасын (sps, пішіні [m, 12]) алып, олардың барлығын бір компиляцияланған ядро арқылы өткізеді. Әр жол — бір O(n) өту: барлар бойынша жүру, қақпаларды қолдану, open[i+1] бойынша сыздамайтын толтыруларды тіркеу, PnL мен позициядағы уақытты есептеу. Осы цикл ішінде ешбір индикатор қайта құрылмайды — ол cross пен separation-ды тікелей кэштен оқиды. Ішкі симуляция JIT-компиляцияланған (Numba), сондықтан жылынған соң әр конфигурацияның құны Python үстеме шығынымен емес, барлар бойынша жалғыз сызықтық өтумен анықталады.

Бұл екі бөлік табиғи кірмелі іздеуге бірігеді: сыртқы цикл қымбат осьті аралайды (әр итерация бір индикатор комбинациясын құрып, кэштейді), ал ішкі цикл сол кэштелген массивтер бойынша арзан ось арқылы кең топтаманы тарата өтеді. Кодта пішін дәл осылай көрінеді — кең арзан топтаманы қоршап тұрған кішкентай қымбат цикл:

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)

Сіз қымбат құрылымдаушыға индикатор торы рұқсат ететіндей аз рет қана тиесіз, ал көлемді арзан аралап шығуға тапсырасыз — ешқашан қозғалмайтын массивтерге қарсы мыңдаған sps жолы. Бүкіл оптимизация осында — жуықтау жоқ, дәлдіктен айырылу жоқ, тек өзгермеген нәрсені қайта есептеуден бас тарту ғана.

«Тегіннің» шын бағасы қанша: сандар

Конфигурация басына кететін құнды салыстыратын бағаналы диаграмма: конфигурация сайын қайта есептеуге арналған биік баған, оның жанында кэштелген табалдырық өтуіне арналған жіңішке жолақ, шамамен 1,600 есе айырмашылықпен белгіленген

Біз екі осьті демо-жүктемеде өлшедік: 1 минуттық ETHUSDT барларының толық бір жылы (~527k бар), үш таймфрейм, индикаторлар жылытылған әрі JIT компиляциясы уақыт өлшеуден тыс қалдырылған.

Арзан оста sweep_separations секундына шамамен 5,600 табалдырық-конфигурацияны ұстап тұрады. Бұл — әр конфигурация үшін толық симуляция (қақпалар, толтырулар, PnL, экспозиция), жарты миллионнан астам бар бойынша, шамамен конфигурация басына 180 микросекунд. Мұның осынша жылдам болу себебі — ол мүлде индикатор жұмысын істемейді: әр конфигурация сол бір кэштелген cross пен separation массивтерін оқиды.

Енді балама нұсқаның бағасын есептейік. Үш таймфреймді индикатор жиынын бір рет құру бірнеше жүз миллисекунд шамасында уақыт алады (~0.3 с) — үш таймфреймді қайта дискреттеу, Hull өлшеу-салмақтауы, бүкіл жыл бойы қиылысу мен ажырауды алу. Егер сіз индикаторларды конфигурация циклінің ішінде қайта есептесеңіз — қарапайым жалғыз-циклді дизайн — секундына 5,600 конфигурацияның әрқайсысы толық индикатор құрылымын төлер еді. Конфигурация басына кететін құн ~180 микросекундтан ~0.3 секундқа дейін өсіп кетеді:

Конфигурация басына құн Конфигурация/сек
Арзан ось (кэштелген сигналдар) ~180 µs ~5,600
Индикаторларды конфигурация сайын қайта есептеу ~0.3 с ~3.4

Арақатынасы — ~1,600 есе. Кэштелген сигналдар бойынша арзан осьті аралап шығу әр табалдырық векторы үшін индикаторларды қайта құратын қарапайым дизайннан шамамен үш реттік шамаға арзан. Нақтырақ айтқанда: кэштелген жол бойынша бір секундтан аз уақытта аяқталатын бірнеше мың табалдырық конфигурациясынан тұратын топтама, егер әр конфигурация өз индикаторларын қайта құрса, сағаттың жартысынан көбін алар еді. Нәтижелер бірдей, дәлдік бірдей, математикада ешбір қысқарту жоқ — жалғыз айырмашылық: біреуі тұрақты шаманы қайта есептейді, ал екіншісі есептемейді.

Бұл — соңында үстінен себе салатын микро-оптимизация емес. Ол қандай іздеулердің мүмкін екенін өзгертеді. 5,600 cfg/с жылдамдықта табалдырық осі дұрыстап зерттеуге жеткілікті тығыз — әр индикатор комбинациясына нәзік тор немесе ұзақ random/QMC үлгісін алуға болады — ал қымбат ось әдейі дөрекі, аз ғана құрылымдардан тұрып қала береді. Есептеу бюджеті нақты құны бар параметрлерге қарай ағады.

Өлшемділіктің қарғысы: қайта бағаланды

Параметрлердің жалпақ біркелкі торы екі деңгейлі баға картасына қайта белгіленген: бірнеше қымбат ұяшық қалың контурмен ерекшеленген, қалғаны дерлік тегін ретінде көмескі боялған

Осы мақала басталған тұжырымдамаға қайта оралайық. Өлшемділіктің қарғысы бойынша іздеу кеңістігі параметрлер санына қарай экспоненциалды түрде өседі, сондықтан көбірек өлшем санатты түрде нашарлау дегенді білдіреді. Бұл тордың көлеміне қатысты рас. Бірақ оны толық қамтудың құнына қатысты жаңылыстырады, себебі ол әрбір өлшемге бірдей баға қояды.

Осьтерді бөлген соң, сан мүлде басқаша оқылады. Үш таймфреймді стратегия 18 өлшемді, бірақ солардың тек 6-уы ғана қымбат. Қалған 12-і — есептеу шығынын елеулі түрде ұлғайтпай-ақ торды кеңейтетін арзан-ось өлшемдері — оларға тиындай құнмен мыңдаған конфигурация лақтыруға болады. Қос таймфреймді стратегия 12 өлшемді, оның тек 4-і ғана қымбат, ал 8-і арзан. Екі жағдайда да «қарғыстың» басым бөлігі аралап шығуға дерлік ешнәрсе тұрмайтын оське шоғырланған.

Сондықтан іздеу құны туралы адал ойлау тәсілі — «қанша параметр бар» емес, «қанша қымбат параметр бар, әрі олардың торы қаншалықты дөрекі бола алады». Экспонента нақты зиян тигізетін жер — қымбат ось, әрі сізге дәл сол жерде шағын, мұқият таңдалған тор керек — бірнеше кандидат период, HMA ұзындығының ықшам ауқымы — мүмкін, біз басқа жерде қолданатын бейімделгіш-рұқсаттылықпен тереңдету рухында дөректен нәзікке қарай нақтыланған. Арзан ось — сіз мырза бола алатын жер, себебі әрбір қосымша табалдырық конфигурациясы небәрі 180 микросекунд тұрады.

Бұл қайта бағалау біздің HMA стратегиямыздан әлдеқайда әрі қарай жалпыланады. Үлгі — кейбір параметрлер белгілерді өзгертеді, ал көпшілік параметрлер тұрақты белгілерге қолданылатын ережені өзгертеді — жүйелі саудада барлық жерде қайталанады. Индикатор ұзындықтары, қайта дискреттеу жиіліктері мен ретроспективті терезелер қымбат; кіру/шығу табалдырықтары, стоп қашықтықтары, позиция көлемін реттеу көбейткіштері мен растау қақпалары арзан. Параметр тек алдын ала есептелген сигналдар үстінде шешім шекарасын ғана қайта пішіндейтін болса, ол арзан оське жатады, әрі оны сол жерде аралап шығу керек. Осы отбасынан туындайтын ұқсас кэштеу жеңістері көптаймфреймді parquet кэштеуде және кеңірек қозғалтқыш жылдамдық баспалдағында көрінеді.

Тегін түскі астың да есебі бар жер

Арзан ось есептеу тұрғысынан арзан. Бірақ ол статистика тұрғысынан арзан емес, әрі осы екеуін шатастыру өнімділік жеңісін қайта-бейімделу машинасына айналдырудың дәл өзі.

Сіз бағалайтын әрбір табалдырық конфигурациясы — бір сынау, ал бір деректер жиынында мыңдаған сынау жүргізгенде, олардың ең жақсысы ішінара сәттіліктің арқасында жақсы көрінеді. Осы сынауларды 1,600 есе арзандату сәттілікті жоғалтпайды — керісінше, оны жинақтауды жеңілдетеді. Тығыз табалдырық аралап шығу — көп рет тестілеу инфляциясы ең қатты тиетін дәл сол жағдай: көп кандидат, бір тарих, әрі максимумды хабарлайтын таңдау ережесі. Әлемдегі ең жылдам қозғалтқыш сізге тест терезеңіздің шуын әдемілеп сәйкестендіретін, бірақ үлгіден тыс сәтсіздікке ұшырайтын табалдырық векторын тартынбай ұсынады.

Сондықтан тәртіп жылдамдықпен бірге өсуі керек. Сынаудың есептеу құны нөлге қарай төмендеген сәтте, статистикалық есеп байланыстырушы шектеуге айналады, әрі оны ашық түрде төлеуге тура келеді:

  • Сынау санына қарай дефляциялаңыз. Жеңімпазды нөлге қарсы емес, қанша конфигурация сынағаныңызға қарсы бағалаңыз. Дефляцияланған Шарп коэффициенті мен бэктест қайта-бейімделу ықтималдығы дәл осы үшін бар — олар «біз 4,000 табалдырық векторын сынадық» дегенді хабарланған артықшылықтан кесілетін жеңілдікке айналдырады.
  • Үлгіден тыс, әр фольд бойынша тексеріңіз. Арзан аралап шығу да адал walk-forward бөлінуінің ішінде жүргізілуі керек; тек үлгі ішінде ғана жеңетін табалдырық, оны қаншалықты жылдам тапсаңыз да, еш құнды емес. Біздің қозғалтқыш толтыруларды сыздамайтын күйде ұстайды (open[i+1]) дәл арзан ось алдын ала қарап өнімділікті сатып ала алмауы үшін.
  • Шыңдардан гөрі үстірттерге басымдық беріңіз. Табалдырық осі тығыз әрі жылдам болғандықтан, тек оның argmax-ын ғана емес, оның жауап бетін толықтай картаға түсіре аласыз. Барлығы жұмыс істейтін кең табалдырық аймағы — нағыз артықшылық; жалғыз үшкір максимум — бейімделген артефакт — біз сипаттап отырған дәл осы жылдамдықтың арқасында қолжетімді болған үстірт пен шың айырмашылығы.

Екі осьті құрылымды дұрыс түсініңіз: ол сізге көбірек сенімділік сатып әкелмейді, ол сізге сынау басына бірдей сенімділік құнымен көбірек сынау сатып әкеледі. Бұл шынымен де құнды — арзан осьті тығыз қамту сізге үстірттерді табуға және бетті сипаттауға мүмкіндік береді — бірақ тек статистикалық есеп кітабын адал ұстасаңыз ғана. Жылдамдық мұқият іздемеу үшін есептеу сылтауын жояды; ол мұқият іздеу тапқанды дисконттау міндетін жоймайды.

Өз іздеуіңізді қалай құрылымдау керек

Мұны өз стратегияңызға қолдану үшін жұмыстың негізгі бөлігі — жіктеу, яғни параметрлеріңізді дұрыс оське бөлу — одан кейін кірмелі цикл келеді:

  1. Әр параметрді не нәрсені қайта есептеуге мәжбүр ететініне қарай белгілеңіз. Егер оны өзгерту индикатор/белгі массивін өзгертсе, ол қымбат. Егер ол тек тұрақты массивтерге қолданылатын салыстыруды, табалдырықты немесе көлем ережесін ғана өзгертсе, ол арзан. Күмәнданған кезде мынаны сұраңыз: бұл параметр индикатордың анықтамасының ішінде қайда да болса кездесе ме? Кездеспесе, ол арзан.
  2. Кэшті тек қымбат ось бойынша кілттеңіз. Белгі құрылымын оның индикатор параметрлері бойынша мемоизациялаңыз (SignalCache (period, hma_length) бойынша істейтіндей). Индикатор комбинациясын ортақ пайдаланатын іргелес сынаулар сол бір массивтерді тегін қайта пайдаланады.
  3. Арзан осьті кэштелген белгілер бойынша топтамалаңыз. Табалдырық конфигурацияларын толық қайта бағалау ретінде емес, алдын ала есептелген сигналдар бойынша тығыз компиляцияланған цикл ретінде іске қосыңыз. Дәл осыдан сіздің өткізу қабілетіңіз — біздің жағдайда ~5,600 cfg/с — келіп шығады.
  4. Циклдерді кірмелеңіз: сыртта қымбат, ішінде арзан. Қымбат торды шағын әрі әдейі сақтаңыз (дөрекі немесе дөректен нәзікке); арзан аралап шығуды тығыз болсын. Бюджетті параметрлер нақты бір нәрсеге тұратын жерге жұмсаңыз.
  5. Сынауларды сағатқа қарсы емес, қайта-бейімделуге қарсы бюджеттеңіз. Енді сағат шектеу болмағандықтан, дефляцияланған Шарп / PBO шешсін. Арзан-ось сынауларын статистикалық тұрғыдан қанша көтере алатыныңызды шешіңіз де, жеңімпазды үлгіден тыс тексеріңіз.

Инженерлік пайда мен статистикалық қорғаныс — бір идеяның екі жағы: осьтерді бөлу сізге арзан өлшемдерді толықтай іздеуге мүмкіндік береді, әрі дәл осы себептен сіз қаншалықты толықтай іздегеніңізді кейін дисконттауыңыз керек.

Түйін

  1. Барлық өлшем бірдей құн тұрмайды. Стратегия параметрлері қымбат оське (индикаторлар — бүкіл қатар бойынша қайта есептеледі) және арзан оське (табалдырықтар — алдын ала есептелген сигналдар бойынша O(n) өту) бөлінеді. Біздің қозғалтқышта бұл үш таймфрейм үшін 6 қымбат + 12 арзан, қос таймфрейм үшін 4 + 8.
  2. Индикаторлар табалдырықтарға тәуелсіз, әрі осы тәуелсіздік — бүкіл оптимизацияның өзі. Белгі құрылымы тек индикатор параметрлеріне ғана тәуелді, сондықтан сіз бір рет құрасыз, (period, hma_length) бойынша кэштейсіз және комбинацияны ортақ пайдаланатын әрбір табалдырық конфигурациясында қайта пайдаланасыз.
  3. Арзан ось ~1,600 есе арзан жұмыс істейді. Кэштелген сигналдарда секундына ~5,600 табалдырық-конфигурация (әрқайсысы ~180 µs), ал әр жолы индикаторларды қайта құрсаңыз, конфигурация басына ~0.3 с. Дәлдігі бірдей — жалғыз айырмашылық: тұрақты шаманы қайта есептеуден бас тарту.
  4. Өлшемділіктің қарғысы шын мәнінде қымбат өлшемділіктің қарғысы. Параметр санының көбі аралап шығуға дерлік тегін оське тиесілі. Қымбат торды дөрекі ұстаңыз; арзанында мырза болыңыз.
  5. Жылдамдық байланыстырушы шектеуді есептеуден статистикаға ауыстырады. Тығыз, жылдам аралап шығу — көп рет тестілеу қозғалтқышы. Сынау санына қарай дефляциялаңыз, әр фольд бойынша тексеріңіз және шыңдардан гөрі үстірттерге басымдық беріңіз — тегін түскі ас нақты, бірақ статистикалық есеп міндетті түрде төленуге тиіс.

Толық қозғалтқыш — SignalCache, sweep_separations, сыздамайтын көп-ТФ симуляциясы және оны нақты уақыттағы қалыптасып жатқан шам семантикасына бекітетін паритет тесті — біздің бэктестеріміздегі scripts/engine_multitf.py файлында (commit bfc8aaa) орналасқан. Келесі жолы біреу сізге 18 параметрлі стратегияны іздеу үшін тым үлкен деп айтса, одан сол параметрлердің қаншасы нақты индикаторларды қозғайтынын сұраңыз. Әдетте бұл олардың үштен бірі ғана, ал қалғаны дерлік тегін.

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

Нарықтан бір қадам алда болыңыз

AI сауда талдаулары, нарық аналитикасы және платформа жаңалықтары үшін біздің ақпараттық бюллетеньге жазылыңыз.

Біз сіздің жекелігіңізді құрметтейміз. Кез келген уақытта жазылымнан шығуға болады.