← Мақалаларға оралу
August 6, 2026
5 мин оқу

Параметрлік емес бағаларды модельдеуге арналған Гаусс процестері

Параметрлік емес бағаларды модельдеуге арналған Гаусс процестері
#bayesian
#gaussian-process
#kernel
#uncertainty
#non-parametric

"Classic ML baselines" сериясының бөлігі.

Екі нәрсе Гаусс процесін осы блогта бөлек мақалаға лайық етеді және олардың ешқайсысы «бұл сізге белгісіздік береді» емес.

Біріншісі - ядро дизайны. Дәрігердің бүкіл индуктивті ауытқуы бір функцияда өмір сүреді k(x,x)k(x, x'), және бұл функция - сіз әдейі жазатын нәрсе: жол қаншалықты өрескел, ол қайталанады ма, қайталау ыдырай ма. Стандартты құралдар жинағындағы басқа ешнәрсе нарық динамикасы туралы құрылымдық гипотезаны нақты түрде айтып, содан кейін оған сәйкес келтіруге мүмкіндік береді. Екіншісі – шекті ықтималдық — күтілген жиынтықтан емес, үлгінің өзінен алынған күрделілік айыппұлы бар жаттығу мақсаты. Осы блогтағы артық сәйкестік доғасындағы кез келген басқа мақала (плато талдауы, PBO, deflated Sharpe бірнеше рет іздеу жүйесі жарамды емес. Дәрігер қажет емес деп мәлімдейді. Бұл шағымды тексеруге болады және оны сынау белгісіздік өлшемін анықтауға арналған басқа оқулыққа қарағанда қызықтырақ.

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

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

Гаусс процесі дегеніміз не?

Дәрігерлер осы блогта Bayesian-оңтайландыру суррогаты ретінде Optuna vs. coordinate descent, бірдей белгілеумен және бірдей төмен өлшемді ескертумен әлдеқашан пайда болды. Мұнда GP гиперпараметрді іздеу бетіне емес, нарықтық деректерге арналған модельдің өзі болып табылады, сондықтан емдеу тереңірек болады.

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

Формальды түрде функция f:XRf: \mathcal{X} \to \mathbb{R} кез келген соңғы кірістер жиыны үшін GP-ден алынады {x1,x2,,xn}X\{x_1, x_2, \ldots, x_n\} \subset \mathcal{X}:

(f(x1)f(x2)f(xn))N((m(x1)m(x2)m(xn)),(k(x1,x1)k(x1,xn)k(xn,x1)k(xn,xn)))\begin{pmatrix} f(x_1) \\ f(x_2) \\ \vdots \\ f(x_n) \end{pmatrix} \sim \mathcal{N}\left(\begin{pmatrix} m(x_1) \\ m(x_2) \\ \vdots \\ m(x_n) \end{pmatrix}, \begin{pmatrix} k(x_1, x_1) & \cdots & k(x_1, x_n) \\ \vdots & \ddots & \vdots \\ k(x_n, x_1) & \cdots & k(x_n, x_n) \end{pmatrix}\right)

қайда m(x)=E[f(x)]m(x) = \mathbb{E}[f(x)] орташа функция және k(x,x)=Cov(f(x),f(x))k(x, x') = \text{Cov}(f(x), f(x')) коварианттық (ядро) функциясы болып табылады. Біз оны ықшам түрде жазамыз:

fGP(m(),k(,))f \sim \mathcal{GP}(m(\cdot), k(\cdot, \cdot))

Орташа функция орташа мінез-құлық туралы алдын ала сенімді кодтайды ff. Сауда-саттықта біз әдетте орнатамыз m(x)=0m(x) = 0, бізде кірістер бойынша алдын ала бағыттылық жоқ деген болжамды кодтау. Барлық құрылым ядроға енеді.

Неліктен Параметрлік емес?

5 мүмкіндігі бар сызықтық регрессия моделінің 6 параметрі бар. 64 бірліктен тұратын екі жасырын қабаты бар нейрондық желіде мыңдаған. GP-де белгіленген параметрлер саны жоқ — модельдің күрделілігі деректермен бірге өседі. 10 бақылау арқылы GP 10 өлшемді Гауссты анықтайды. 10 000 бақылау арқылы ол 10 000 өлшемді Гауссты анықтайды.

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

Қаржылық модельдеу үшін бұл құнды. Нарықтар өзгереді. Мүмкіндіктер мен қайтарымдар арасындағы байланыс сызықты емес, стационарлық емес және режимге тәуелді. Параметрлік модельдер шындыққа сәйкес келмейтін құрылымды жүктейді. Дәрігерлер деректерді айтуға мүмкіндік береді.

Ядро функциялары: нарық құрылымын кодтау

Ядро функциясы k(x,x)k(x, x') Гаусс процесінің жаны болып табылады. Ол кез келген екі кіріс нүктелеріндегі функция мәндері арасындағы ковариацияны көрсету арқылы қандай функциялардың априори ықтимал екенін анықтайды. Әртүрлі ядролар тегістік, мерзімділік және ұзақ мерзімді мінез-құлық туралы әртүрлі болжамдарды кодтайды.

Радиалды негіздік функция (RBF) / квадраттық экспоненциалды

RBF ядросы ең көп тараған бастапқы нүкте болып табылады:

kRBF(x,x)=σ2exp(xx222)k_{\text{RBF}}(x, x') = \sigma^2 \exp\left(-\frac{\|x - x'\|^2}{2\ell^2}\right)

қайда σ2\sigma^2 сигнал дисперсиясы (шығыс шкаласы) болып табылады және \ell ұзындық шкаласы болып табылады. RBF ядросы бар GP-ден алынған функциялар шексіз дифференциалданады — өте тегіс.

Сауданы түсіндіру: Ұзындық шкаласы \ell екі деректер нүктесінің ара қашықтығын және әлі де корреляциялануын басқарады. Қысқа ұзындық шкаласы модельдің жергілікті үлгілерге әрекет ететінін білдіреді; ұзын шкаласы оның кең тенденцияларды қамтитынын білдіреді. Сигналдың ауытқуы σ2\sigma^2 функцияның амплитудасын басқарады — болжанған қайтарулар қаншалықты үлкен болуы мүмкін.

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

Аналық ядро

Аналық сынып тегістік параметрін енгізу арқылы RBF жалпылайды ν\nu:

kMatern(x,x)=σ221νΓ(ν)(2νxx)νKν(2νxx)k_{\text{Matern}}(x, x') = \sigma^2 \frac{2^{1-\nu}}{\Gamma(\nu)} \left(\frac{\sqrt{2\nu}\|x - x'\|}{\ell}\right)^{\nu} K_{\nu}\left(\frac{\sqrt{2\nu}\|x - x'\|}{\ell}\right)

қайда KνK_{\nu} екінші түрдегі өзгертілген Бессель функциясы болып табылады. ретінде ν\nu \to \infty, Аналық ядро ​​RBF-ге жақындайды. Жалпы таңдаулар:

  • ν=1/2\nu = 1/2: Орнштейн-Уленбек процесіне тең. Функциялар үздіксіз, бірақ дифференциалданбайды — дөрекі, броундық қозғалыс сияқты.
  • ν=3/2\nu = 3/2: Функциялар бір рет дифференциалданады. Тегістік пен икемділік арасындағы жақсы теңгерім.
  • ν=5/2\nu = 5/2: Функциялар екі рет дифференциалданады. қарағанда тегіс 3/23/2 бірақ RBF қарағанда қаттырақ.

Сауда-саттықты түсіндіру: Ана-3/23/2 ядросы қаржылық уақыт қатарлары үшін ең жақсы әдепкі болып табылады. Бұл нақты баға жолдары сияқты қисық болмай көрсететін кедір-бұдыр түріне мүмкіндік береді ν=1/2\nu = 1/2. Бұл «құбылмалылық өрескел» әдебиетіне сәйкес келеді (Gatheral, Jaisson, & Rosenbaum, 2018), бұл эмпирикалық түрде құбылмалылық жолдарының айналасында Херст көрсеткіштері бар екенін көрсетеді. H0.1H \approx 0.1, броундық қозғалысқа қарағанда әлдеқайда өрескел.

Классикалық құбылмалылық модельдерін жеңетін аналық ядролардың негізгі жарияланған дәлелі Ризви және т.б. (2017), олар кездейсоқ серуенге қарағанда шамамен 20% жақсы MSE және GARCH-тен 50% жақсырақ — крипто емес, 2017 күндік валюта жұбы деректері бойынша және бұл жерде қайта шығарылмаған. Оны эталон ретінде емес, ядроны сынау үшін мотивация ретінде қарастырыңыз. Бұл блогтың Ljung-Box және ARCH-LM диагностикасы бар нақты BTC күнделікті деректеріне сәйкес келетін жеке GARCH(1,1) крипто үшін GARCH құбылмалылығын болжау; Дәл сол үлгідегі аналық дәрігермен бетпе-бет кездесу шынайы салыстыру болар еді және ол іске қосылмаған.

Мерзімді ядро

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

kPeriodic(x,x)=σ2exp(2sin2(πxx/p)2)k_{\text{Periodic}}(x, x') = \sigma^2 \exp\left(-\frac{2\sin^2\left(\pi|x - x'|/p\right)}{\ell^2}\right)

қайда pp кезең болып табылады. Осы ядродан алынған функциялар нүктемен қайталанады pp, ұзындық шкаласы арқылы модуляцияланған \ell ол корреляцияның кезең ішінде қаншалықты жылдам ыдырайтынын бақылайды.

Сауданы түсіндіру: Жиын p=24p = 24 (сағат) күндізгі үлгілерді түсіру үшін немесе p=5p = 5 (сауда күндері) апталық маусымдық үшін. Фурье мүмкіндіктерінен айырмашылығы, мерзімді ядро ​​гармоникалардың бекітілген санын қабылдамайды — GP деректерден циклдің пішінін біледі.

Ядроларды біріктіру: аддитивті және мультипликативті құрам

GP ядроларының нақты күші композицияда жатыр. Егер k1k_1 және k2k_2 жарамды ядролар болып табылады, сондықтан:

  • Қосынды: k1+k2k_1 + k_2 — функция тәуелсіз компоненттердің қосындысы (аддитивті ыдырау)
  • Өнім: k1×k2k_1 \times k_2 — компоненттер арасындағы өзара әрекеттесу (мысалы, жергілікті мерзімді мінез-құлық)

Қаржылық кіріс үшін пайдалы құрама ядро:

k(x,x)=kMatern-3/2(x,x)+kPeriodic(x,x)kRBF(x,x)k(x, x') = k_{\text{Matern-3/2}}(x, x') + k_{\text{Periodic}}(x, x') \cdot k_{\text{RBF}}(x, x')

Бұл сигналды келесіге бөледі:

  1. Тегіс емес, апериодтық тренд компоненті (Matern-3/2)
  2. Уақыт өте келе амплитудасы ыдырайтын периодтық компонент (Периодикалық ×\times RBF)

өнім kPeriodickRBFk_{\text{Periodic}} \cdot k_{\text{RBF}} жергілікті мерзімді ядро ​​жасайды: үлгі қайталанады, бірақ алыстағы қайталаулар жақындағыларға қарағанда азырақ әсер етеді. Бұл нарықтың микроқұрылымы дамыған сайын уақыт өте келе өзгеретін қаржылық маусымдық үшін дәл солай.

Спектрлік қоспаның ядролары

Максималды икемділік үшін спектрлік қоспа (SM) ядросы (Wilson & Adams, 2013) ядроның спектрлік тығыздығын Гаусстардың қоспасы ретінде параметрлейді:

kSM(x,x)=q=1Qwqexp(2π2xx2vq)cos(2πxxμq)k_{\text{SM}}(x, x') = \sum_{q=1}^{Q} w_q \exp\left(-2\pi^2 \|x - x'\|^2 v_q\right) \cos\left(2\pi \|x - x'\| \mu_q\right)

қайда wqw_q қоспа салмақтары, vqv_q спектрлік дисперсиялар болып табылады және μq\mu_q спектрлік құралдар (жиіліктер) болып табылады. Бохнер теоремасы бойынша кез келген стационарлық ядроны осылай көрсетуге болады. SM ядросы бір уақытта мерзімді құрамдастарды, ұзақ мерзімді трендтерді және қысқа ауқымды корреляцияларды таба алады — барлығы деректерден.

Сауданы түсіндіру: SM ядросы деректерде қандай үлгілер бар екенін білмесеңіз пайдалы. Ол қайтару серияларындағы жасырын кезеңділіктерді анықтай алады (мысалы, автоматтандырылған теңгерімдеуге негізделген крипто нарықтарындағы нәзік 4 сағаттық циклдар). Кемшілігі - гиперпараметрлердің көптігі және шағын деректер жиынтығымен шамадан тыс орнату қаупі.

Артқы қорытынды: алдын ала болжамға дейін

Жаттығу деректері берілген D={(xi,yi)}i=1n\mathcal{D} = \{(x_i, y_i)\}_{i=1}^n қайда yi=f(xi)+ϵiy_i = f(x_i) + \epsilon_i және ϵiN(0,σn2)\epsilon_i \sim \mathcal{N}(0, \sigma_n^2), сынақ нүктелеріндегі GP posterior XX_* жабық пішінді ерітіндісі бар. Бұл көптеген Байес үлгілерінен ЖПД-ның негізгі есептеу артықшылығы.

Артқы теңдеулер

Болсын K=k(X,X)K = k(X, X) болу n×nn \times n оқыту ковариация матрицасы, K=k(X,X)K_* = k(X_*, X) болу m×nm \times n кросс-коварианттық матрицасы, және K=k(X,X)K_{**} = k(X_*, X_*) болу m×mm \times m сынақ коварианттық матрицасы. Артқы жағы:

fX,y,XN(fˉ,Cov(f))f_* | X, y, X_* \sim \mathcal{N}(\bar{f}_*, \text{Cov}(f_*))

мұнда:

fˉ=K(K+σn2I)1y\bar{f}_* = K_* (K + \sigma_n^2 I)^{-1} y

Cov(f)=KK(K+σn2I)1KT\text{Cov}(f_*) = K_{**} - K_* (K + \sigma_n^2 I)^{-1} K_*^T

Артқы орта fˉ\bar{f}_* сынақ және жаттығу нүктелері арасындағы ядро ​​ұқсастығымен өлшенетін оқу мақсаттарының сызықтық комбинациясы. Артқы ковариация Cov(f)\text{Cov}(f_*) алдыңғы ковариациядан басталады KK_{**} және оқу деректерінен алынған ақпаратты алып тастайды. Жаттығу деректері тығыз болған жерде артқы дисперсия аз болады. Жаттығу деректері сирек болған жағдайда, кейінгі дисперсия алдыңғыға қайтады.

Шекті ықтималдық және тексеруге тұрарлық шағым

Ядроның гиперпараметрлері θ\theta (ұзындық шкалалары, дисперсиялар, шу деңгейі) журналдың шекті ықтималдығын барынша арттыру арқылы үйренеді:

logp(yX,θ)=12yT(K+σn2I)1y12logK+σn2In2log2π\log p(y | X, \theta) = -\frac{1}{2} y^T (K + \sigma_n^2 I)^{-1} y - \frac{1}{2} \log |K + \sigma_n^2 I| - \frac{n}{2} \log 2\pi

Бірінші термин деректерге сәйкес термин (бақылаулардан алыс болжамдарды жазалайды). Екінші термин - күрделілік жазасы (тым икемді үлгілерді жазалайды, яғни ядро ​​матрицасында үлкен детерминант бар). Үшінші мүше – нормалау тұрақтысы.

Бұл автоматты Occam ұстарасы және бұл GP сауда құбырына әкелетін ең қызықты нәрсе. Шағымның күшті нұсқасы - реттеу үшін жеке тексеру жинағы қажет емес — күрделілік айыппұлы мақсаттың ішінде, сондықтан модель икемділікпен фитнесті тегін сатып ала алмайды.

Бұл мәлімдеме осы блогта күмәндануға лайық. Плато талдауы бір ұпайлық валидация баллының таңдаудың нашар критерийі екенін және беріктіктің көрші пішінде өмір сүретінін көрсетеді; PBO үлгідегі жеңімпаздың үлгіден тыс жоғалту жиілігін сандық түрде көрсетеді; deflated Sharpe сынақтар санындағы бағалар. Шекті ықтималдық әлі де барынша ұлғайтылатын үлгідегі мақсат болып табылады θ\theta — Occam факторы көптеген орнатылған ядролар бойынша таңдауды емес, сыйымдылық үлгісін жазалайды. Егер сіз он екі кандидат ядросын орналастырсаңыз және ең жақсы шекті ықтималдығы бар біреуін таңдасаңыз, сіз бірнеше сынақ аймағына қайта ораласыз және дефляция логикасы өзгеріссіз қолданылады. Жалған нұсқа: шекті ықтималдықты таңдау бірдей деректерде және бірдей ядролар тобында валидация жиынын таңдауға қарағанда үлгідегі/үлгіден тыс алшақтықты тудырады ма? Бұл өлшенетін және төменде өлшенбейді.

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

Есептеу құны және масштабтау мүмкіндігі

Тығынның беті қайтып келеді (K+σn2I)(K + \sigma_n^2 I), бұл шығындар O(n3)O(n^3) уақытында және O(n2)O(n^2) жадында. Бұл блогта текше қабырға басқа жақтан айтылады: іздеу әдісі мен бағалау құны мақсат арзан болған кезде GP негізіндегі Bayesian оңтайландыруын бірден алып тастайды, себебі суррогат үнемдейтін бағалаулардан қымбатырақ. Мұндағы арифметика бірдей; қолданбасы басқаша. Нарық деректеріне бекітілген үлгі ретінде текше термин дисквалификация емес, бюджет болып табылады: ол жаттығу терезесінде қатаң төбені белгілейді.

Сауда қолданбалары үшін масштабтау стратегиялары:

  1. Сирек дәрігерлік дәрігерлер (индукциялық нүктелер). ауыстырыңыз n×nn \times n бар матрица m×mm \times m матрица мұнда mnm \ll n. Индукциялық нүктелер Z={z1,,zm}Z = \{z_1, \ldots, z_m\} жаттығу деректерін қорытындылайтын жалған кірістер болып табылады. Hensman және т.б. жасаған SVGP (Стохастикалық вариациялық GP) тұжырымы. (2013) құны бар шағын пакеттік оқытуға мүмкіндік береді O(nm2)O(nm^2) итерация бойынша. GPyTorch мұны жергілікті түрде қолдайды.

  2. Құрылымдық ядро ​​интерполяциясы (SKI/KISS-GP). Кірістер торда жатқанда ядро ​​матрицасында Kronecker және Toeplitz құрылымын пайдаланады. дейін шығындарды азайтады O(n+glogg)O(n + g \log g) қайда gg тор өлшемі болып табылады. Тұрақты таңдалатын уақыт қатарлары (мысалы, 1 минуттық жолақтар) үшін өте қолайлы.

  3. Жылжымалы терезелердегі жергілікті дәрігер. Жеке дәрігерді тек соңғы деректер бойынша оқытыңыз. Дәл осы жерде GP-ға тән шектеулер шағып кетеді: стандартты ядролар стационарлық (k(x,x)k(x,x') байланысты ғана xxx - x') және нарықтар жоқ, сондықтан әдеттегі жауап жылжымалы терезе — бірақ терезе ұзындығы жоғарыда шектелген O(n3)O(n^3), статистика бойынша ғана емес. Алға қарай жүруді оңтайландыру зәкірленген және жылжымалы терезелерді, пойыз/сынақ ұзындықтарын және жалпы қайта оңтайландыру жиілігін қамтиды; GP үшін терезе өлшемі статистикалық шешім сияқты есептеу шешімі болып табылады, ал анкерленген (үнемі өсіп келе жатқан) терезе жуықтаусыз бірнеше мың нүктеден кейін қол жетімді емес. Бұл қайта құру практикалық нәтиже болып табылады: дәрігермен бірге сіз «барлық тарихты пайдалануды» таңдай алмайсыз.

Қайтаруды болжауға арналған GP: Практикалық құрылым

Функция дизайны: Неліктен 500 емес, 5-20 мүмкіндік

ML нарықтық деректерінің жалпы таксономиясы — тапсырыс кітабының теңгерімсіздігі, кітап қысымы, VPIN, Кайл ламбдасы, жүзеге асырылған құбылмалылық мүмкіндіктері, циклдік уақытты кодтау, кросс-актив және қаржыландыру мөлшерлемесі сигналдары — қазірдің өзінде машиналық оқытумен тарату модельдеу көрсетілген; сол тізімді пайдаланыңыз.

GP-ға тән нәрсе - тізімнің өлшемі. Ядро әдістері жоғары өлшемдерде нашарлайды: қашықтықтар шоғырланады, ал стационарлық ядро ​​​​дискриминациясын жоғалтады. Қаржылық дәрігер үшін практикалық диапазон градиентті күшейтетін ағаш қуана жейтін жүздеген емес, 5-20 кірісті құрайды. Бұл өмір сүруге мүмкіндік беретін механизм ARD (Автоматты сәйкестікті анықтау): әрбір кіріс өлшеміне өз ұзындық шкаласын беріңіз. d\ell_d, және шекті ықтималдық жаттығулары d\ell_d \to \infty сигнал тасымалдамайтын өлшемдер үшін, өйткені шексіз ұзындық шкаласы ядро ​​бұл координатты елемейтінін білдіреді. Функцияларды таңдау сәйкестендірудің жанама өніміне айналады және үйренеді d\ell_d сәйкестік рейтингі ретінде тікелей оқуға болады — бұл сонымен қатар оны бұрмалануға мүмкіндік береді: құрама ядроны нақты жолақтарға орналастырыңыз, ұзындық шкалаларын басып шығарыңыз және сіз сенетін мүмкіндіктер модельде сақталған мүмкіндіктер екенін тексеріңіз.

Позиция өлшемі және қалыс қалу

Артқы дәрігер береді σ(x)\sigma_*(x) тікелей, сондықтан ол интервал ені бар Тәуекелді ескеретін позиция өлшеміне арналған конформальды болжау ішінде әзірленген жиектер арақатынасының өлшеміне және саудасыз сүзгіге тікелей түседі. wt=2κσ(x)w_t = 2\kappa\sigma_*(x). Айырмашылық тек қана шығу тегі: GP калибрлеу жинағынан емес, үлгінің өзінен енін шығарады, сондықтан ол өткен қалдықтардың жаһандық квантилімен емес, жаттығу деректеріне қатысты сынақ нүктесінің орналасқан жеріне байланысты өзгереді.

GPyTorch көмегімен жүзеге асыру

GPyTorch — масштабталатын GP қорытындысына арналған PyTorch негізіндегі кітапхана. Ол GPU жеделдетуін, автоматты дифференциацияны және қазіргі заманғы сызықтық алгебра әдістерін (конъюгаттық градиенттер, Lanczos декомпозициясы) GP-терді аңғалдан тыс масштабтау үшін пайдаланады. O(n3)O(n^3) шектеу.

Қайтаруды болжауға арналған негізгі нақты GP

import torch
import gpytorch
import numpy as np
from torch.utils.data import TensorDataset, DataLoader


class ExactGPModel(gpytorch.models.ExactGP):
    """Exact GP with a composite kernel for financial returns."""

    def __init__(self, train_x, train_y, likelihood):
        super().__init__(train_x, train_y, likelihood)
        self.mean_module = gpytorch.means.ZeroMean()

        self.covar_matern = gpytorch.kernels.ScaleKernel(
            gpytorch.kernels.MaternKernel(nu=1.5, ard_num_dims=train_x.shape[1])
        )
        self.covar_periodic = gpytorch.kernels.ScaleKernel(
            gpytorch.kernels.PeriodicKernel()
        )
        self.covar_rbf_decay = gpytorch.kernels.ScaleKernel(
            gpytorch.kernels.RBFKernel()
        )

    def forward(self, x):
        mean = self.mean_module(x)
        covar = self.covar_matern(x) + self.covar_periodic(x) * self.covar_rbf_decay(x)
        return gpytorch.distributions.MultivariateNormal(mean, covar)

ard_num_dims жоғарыда талқыланған өлшемдерге арналған ұзындық шкалаларына мүмкіндік беретін нәрсе. Жаттығудан кейін, model.covar_matern.base_kernel.lengthscale оқылатын вектор болып табылады.

Тренинг циклі

def train_gp(train_x, train_y, n_epochs=200, lr=0.05, device=None):
    """Train the GP by maximizing the marginal log-likelihood.

    Returns the device alongside the model so that callers move test
    tensors to the same place -- otherwise prediction crashes on GPU.
    """
    if device is None:
        device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

    train_x = train_x.to(device)
    train_y = train_y.to(device)

    likelihood = gpytorch.likelihoods.GaussianLikelihood().to(device)
    model = ExactGPModel(train_x, train_y, likelihood).to(device)

    model.train()
    likelihood.train()

    optimizer = torch.optim.Adam(model.parameters(), lr=lr)
    mll = gpytorch.mlls.ExactMarginalLogLikelihood(likelihood, model)

    losses = []
    for epoch in range(n_epochs):
        optimizer.zero_grad()
        output = model(train_x)
        loss = -mll(output, train_y)
        loss.backward()
        optimizer.step()
        losses.append(loss.item())

        if (epoch + 1) % 50 == 0:
            noise = likelihood.noise.item()
            print(
                f"Epoch {epoch+1}/{n_epochs} | "
                f"Loss: {loss.item():.4f} | "
                f"Noise: {noise:.6f}"
            )

    return model, likelihood, device, losses

Белгісіздікпен болжау

def predict_with_uncertainty(model, likelihood, test_x, device):
    """Generate predictions with uncertainty estimates."""
    model.eval()
    likelihood.eval()

    test_x = test_x.to(device)

    with torch.no_grad(), gpytorch.settings.fast_pred_var():
        posterior = likelihood(model(test_x))

        mean = posterior.mean
        variance = posterior.variance
        lower, upper = posterior.confidence_region()  # 2-sigma bounds

    return {
        "mean": mean.cpu().numpy(),
        "std": variance.sqrt().cpu().numpy(),
        "lower_2sigma": lower.cpu().numpy(),
        "upper_2sigma": upper.cpu().numpy(),
    }

The fast_pred_var() контекст менеджері болжамдық ауытқуларды есептеу үшін LOVE (Lanczos Variance Estimates) алгоритмін пайдаланады. O(n)O(n) орнына уақыт O(n2)O(n^2).

Үздіксіз сауда құбыры

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

import pandas as pd


def build_features(df: pd.DataFrame, lookback: int = 10) -> pd.DataFrame:
    """Build features for GP-based return prediction."""
    features = pd.DataFrame(index=df.index)

    for lag in range(1, lookback + 1):
        features[f"ret_lag_{lag}"] = df["close"].pct_change().shift(lag)

    ret = df["close"].pct_change()
    features["vol_ratio"] = (
        ret.rolling(10).std() / ret.rolling(50).std()
    )

    features["vol_zscore"] = (
        (df["volume"] - df["volume"].rolling(50).mean())
        / df["volume"].rolling(50).std()
    )

    if "bid_vol" in df.columns and "ask_vol" in df.columns:
        features["obi"] = (
            (df["bid_vol"] - df["ask_vol"])
            / (df["bid_vol"] + df["ask_vol"])
        )

    if hasattr(df.index, "hour"):
        hours = df.index.hour + df.index.minute / 60.0
        features["time_sin"] = np.sin(2 * np.pi * hours / 24)
        features["time_cos"] = np.cos(2 * np.pi * hours / 24)

    features.dropna(inplace=True)
    return features


def run_gp_strategy(
    df: pd.DataFrame,
    train_window: int = 500,
    retrain_every: int = 50,
    confidence_threshold: float = 1.0,
    risk_fraction: float = 0.02,
    max_leverage: float = 1.0,
):
    """Walk-forward GP trading strategy with uncertainty-based sizing."""
    features = build_features(df)
    returns = df["close"].pct_change().reindex(features.index)
    target = returns.shift(-1)  # predict next-bar return

    mask = features.notna().all(axis=1) & target.notna()
    features = features[mask]
    target = target[mask]

    positions = pd.Series(0.0, index=features.index)
    predictions = pd.DataFrame(
        index=features.index, columns=["mean", "std"], dtype=float
    )

    model = likelihood = device = None
    x_mean = x_std = y_mean = y_std = None

    for i in range(train_window, len(features)):
        if model is None or (i - train_window) % retrain_every == 0:
            train_x = torch.tensor(
                features.iloc[i - train_window : i].values,
                dtype=torch.float32,
            )
            train_y = torch.tensor(
                target.iloc[i - train_window : i].values,
                dtype=torch.float32,
            )

            x_mean, x_std = train_x.mean(0), train_x.std(0) + 1e-8
            y_mean, y_std = train_y.mean(), train_y.std() + 1e-8
            train_x_norm = (train_x - x_mean) / x_std
            train_y_norm = (train_y - y_mean) / y_std

            model, likelihood, device, _ = train_gp(
                train_x_norm, train_y_norm, n_epochs=100
            )

        test_x = torch.tensor(
            features.iloc[i : i + 1].values, dtype=torch.float32
        )
        test_x_norm = (test_x - x_mean) / x_std

        pred = predict_with_uncertainty(model, likelihood, test_x_norm, device)

        pred_mean = pred["mean"][0] * y_std.item() + y_mean.item()
        pred_std = pred["std"][0] * y_std.item()

        predictions.iloc[i] = [pred_mean, pred_std]

        z_score = abs(pred_mean) / (pred_std + 1e-8)
        if z_score > confidence_threshold:
            size = min(z_score * risk_fraction, max_leverage)
            positions.iloc[i] = np.sign(pred_mean) * size

    strategy_returns = positions.shift(1) * returns
    return strategy_returns, predictions, positions

Сирек GPs көмегімен үлкенірек деректер жиынына масштабтау

Жаттығу терезесі бірнеше мың ұпайдан асқанда, нақты GP тұжырымы баяу болады. Вариациялық сирек дәрігерге ауысу:

class SparseGPModel(gpytorch.models.ApproximateGP):
    """Sparse variational GP for large-scale return prediction."""

    def __init__(self, inducing_points):
        variational_distribution = (
            gpytorch.variational.CholeskyVariationalDistribution(
                inducing_points.size(0)
            )
        )
        variational_strategy = (
            gpytorch.variational.VariationalStrategy(
                self,
                inducing_points,
                variational_distribution,
                learn_inducing_locations=True,
            )
        )
        super().__init__(variational_strategy)
        self.mean_module = gpytorch.means.ZeroMean()
        self.covar_module = gpytorch.kernels.ScaleKernel(
            gpytorch.kernels.MaternKernel(nu=1.5)
        )

    def forward(self, x):
        mean = self.mean_module(x)
        covar = self.covar_module(x)
        return gpytorch.distributions.MultivariateNormal(mean, covar)


def train_sparse_gp(train_x, train_y, n_inducing=128, n_epochs=50, batch_size=256):
    """Train sparse GP with mini-batch stochastic variational inference."""
    indices = torch.randperm(train_x.size(0))[:n_inducing]
    inducing_points = train_x[indices]

    model = SparseGPModel(inducing_points)
    likelihood = gpytorch.likelihoods.GaussianLikelihood()

    model.train()
    likelihood.train()

    optimizer = torch.optim.Adam(
        [{"params": model.parameters()}, {"params": likelihood.parameters()}],
        lr=0.01,
    )
    mll = gpytorch.mlls.VariationalELBO(
        likelihood, model, num_data=train_y.size(0)
    )

    dataset = TensorDataset(train_x, train_y)
    loader = DataLoader(dataset, batch_size=batch_size, shuffle=True)

    for epoch in range(n_epochs):
        for x_batch, y_batch in loader:
            optimizer.zero_grad()
            output = model(x_batch)
            loss = -mll(output, y_batch)
            loss.backward()
            optimizer.step()

    return model, likelihood

128 индукциялық нүктемен бір партияның құны O(1282×batch_size)O(128^2 \times \text{batch\_size}) — бір партияға шамамен 4 миллион операция. Бұл бір графикалық процессордағы 100 000+ бақылаудан тұратын деректер жиынын оңай өңдейді.

Терең ядроны үйрену: GP нейрондық желілермен кездеседі

Енгізу кеңістігі үлкен өлшемді болғанда немесе мүмкіндіктер мен қайтарулар арасындағы қатынас өте сызықты емес болса, қарапайым ядро күресуі мүмкін. Терең ядроны оқыту (DKL) GP ядросын қолданбас бұрын кірістерді нейрондық желі арқылы өткізеді:

kDKL(x,x)=kbase(gϕ(x),gϕ(x))k_{\text{DKL}}(x, x') = k_{\text{base}}(g_\phi(x), g_\phi(x'))

қайда gϕg_\phi параметрлері бар нейрондық желі болып табылады ϕ\phi және kbasek_{\text{base}} стандартты ядро ​​болып табылады (мысалы, Matern-3/2). Желі GP ядросы ең тиімді болатын мүмкіндіктердің көрінісін үйренеді. Бүкіл модель — желі параметрлері және ядроның гиперпараметрлері — шекті ықтималдықты барынша арттыру арқылы соңына дейін оқытылады.

class DeepKernelGP(gpytorch.models.ExactGP):
    """GP with a neural network feature extractor."""

    def __init__(self, train_x, train_y, likelihood, input_dim):
        super().__init__(train_x, train_y, likelihood)
        self.mean_module = gpytorch.means.ZeroMean()

        self.feature_extractor = torch.nn.Sequential(
            torch.nn.Linear(input_dim, 8),
            torch.nn.ReLU(),
            torch.nn.Linear(8, 4),
            torch.nn.ReLU(),
            torch.nn.Linear(4, 2),
        )

        self.covar_module = gpytorch.kernels.ScaleKernel(
            gpytorch.kernels.MaternKernel(nu=1.5, ard_num_dims=2)
        )

    def forward(self, x):
        features = self.feature_extractor(x)
        mean = self.mean_module(features)
        covar = self.covar_module(features)
        return gpytorch.distributions.MultivariateNormal(mean, covar)

DKL нейрондық желілерді репрезентациялауды үйренуді GP-нің белгісіздік сандық көрсеткіштерімен біріктіреді. GP деңгейі жаттығу деректерінен алыс болжамдардың жоғары белгісіздікке ие болуын қамтамасыз етеді - бұл стандартты нейрондық желілер әйгілі түрде қамтамасыз ете алмайтын нәрсе. Сондай-ақ, DKL полицияға шекті ықтималдықтың икемділігін қайта енгізетінін ескеріңіз: Occam факторы ядроны жазалайды, бірақ оның алдындағы желіде мыңдаған бос параметрлер бар және мұндай жаза жоқ.

Людковски және Тәуекел (2025), Сандық қаржыландыруға арналған Гаусс процесінің үлгілері, опциондар бағасы мен портфельді оңтайландыруды қоса алғанда, кеңірек сандық-қаржылық контекстте DKL сауалнамасы; бұл нәтижелер олардың мәселелеріне қатысты және криптовалютаның қайтарылуын болжау туралы дәлел емес.

Диагностика және қателіктер

Калибрлеу

Жақсы калибрленген дәрігердің эмпирикалық қамтуға сәйкес келетін болжамды интервалдары бар. Тексеру Conformal Prediction ішінде қолданылғанмен бірдей — ол сондай-ақ шекті қамту неліктен шартты қамту емес екендігі туралы теорияны қамтиды, бұл шектеу GP интервалдарына қатысты:

from scipy.stats import norm

def calibration_report(predictions, actuals):
    """Check if GP uncertainty is well-calibrated."""
    z_scores = (actuals - predictions["mean"]) / (predictions["std"] + 1e-8)

    for sigma in [1, 2, 3]:
        expected_outside = 2 * (1 - norm.cdf(sigma))
        actual_outside = (np.abs(z_scores) > sigma).mean()
        print(
            f"{sigma}-sigma | Expected outside: {expected_outside:.3f} | "
            f"Actual outside: {actual_outside:.3f}"
        )

Күтілетін асып кету 1/2/3 сигмада 0,317 / 0,046 / 0,003 құрайды. Маңыздысы - бұл криптографиялық жолақтар арқылы нақты алға жүгіруде не басып шығаратыны және бұл кесте әлі бұл мақалада жоқ. Алдын ала болжам бойынша, дәрігер тым сенімді - майлы, стационарлы емес қайтарулардың Гаусс ықтималдығы 3 сигмада нашар жасырын болуы керек, бірақ «керек» өлшем емес.

Қалған тұзақтар

  1. Кіріс масштабтауы. Ұзындық шкалалары кіріс масштабына қатысты, сондықтан мүмкіндік ауқымы өзгерді [0,10000][0, 10000] және біреуі диапазонға шықты [0,1][0, 1] мағыналы бөлісе алмайды \ell; ARD - гетерогенді диапазондарды құтқаратын нәрсе, ал стандарттау - ARD инициализациясын ақылға қонымды етеді.

  2. Шекті ықтималдықты шамадан тыс орнату. Көптеген ядролық гиперпараметрлермен (әсіресе композиттік немесе спектрлік қоспа ядролары) шекті ықтималдық әлі де асып түсуі мүмкін. Алдыңғыларды пайдаланыңыз: орташа жұптық қашықтықта орталықтандырылған ұзындық шкаласындағы лог-қалыпты алдыңғы, дисперсиялар бойынша жартылай қалыпты алдыңғы.

  3. Коварианттық матрицаны шарттау. (K+σn2I)(K + \sigma_n^2 I) шу болған кезде сандық ерекшелікке айналуы мүмкін σn2\sigma_n^2 тым кішкентай немесе жаттығу нүктелері қайталануға жақын болғанда. GPyTorch қосады 10610^{-6} диагональға дірілдеу; нашар кондицияланған қаржылық деректер жиі көбірек қажет етеді.

  4. Алға қарауға бейімділік. Жоғарыда және өлшенген егжей-тегжейлі алға қарау таксономиясында қамтылған.

Басқа үлгілерге қарсы GPs қашан пайдалану керек

Критерий GP XGBoost Нейрондық желі
Кірістірілген белгісіздік Иә (құрылымдық) Жоқ (конформды/жүктеуді қажет етеді) Жоқ (MC оқудан шығу/ансамбль қажет)
Деректер тиімділігі Өте жақсы (<1000 үлгі) * *
Масштабтау Нашар дәл, жақсы сирек * *
Сызықты емес Ядроға тәуелді * *
Түсіндіру Ядроның ыдырауы + ARD ұзындық шкаласы * *
Стационарлық емес Жылжымалы терезе немесе DKL талап етеді * *

* XGBoost және нейрондық желі бағандары үшін мұнда жаңа бекітуге емес, жарияланған салыстыруларға жүгініңіз: машиналық оқытумен тарату модельдеу градиентті арттыруға қарсы терең оқытуға ие (қаржылық кестелер, қайта түсіндіруге арналған кестелер, түсіндірмелер). бейімделу, кідіріс) және уақытша синтез трансформаторлары TFT және LSTM және ванильді трансформаторға қарсы.

Дәрігерді келесі жағдайларда пайдаланыңыз:

  • Сізде шағын және орташа деректер жинақтары бар (бір оқу терезесінде ~10 000 бақылаудан аз)
  • Сіз сигнал туралы анық, тексерілетін құрылымдық гипотезаны қалайсыз (тренд + маусымдық + шу)
  • Белгісіздік тек жаһандық қалдық квантилмен емес, жаттығу деректерінен қашықтыққа байланысты өзгеруі керек

Төменгі жағдайларда дәрігерді пайдаланбаңыз:

  • Миллиондаған бақылаулар бойынша сізге миллисекундтық қорытынды қажет
  • Кіріс өлшемдері ~50-ден асады
  • Сигнал стационарлық ядролар көрсете алмайтын күрделі жоғары ретті мүмкіндіктердің өзара әрекеттесуінде өмір сүреді (DKL Occam қасиетінің құнына көмектеседі)

Бұл мақала әлі нені өлшемейді

Жоғарыда айтылғандардың бәрі үлгілі машиналар. Олардың ешқайсысы дәрігердің криптовалютада ақша жасайтынын дәлелдемейді және бұл блогтың стандарты - мақалада өз нөмірлері бар. Ашық элементтер, оларды орындау ретімен:

  1. Нақты BTCUSDT 1м жолақтарындағы ARD ұзындық шкаласы. Құрама ядроны орнатыңыз, басып шығарыңыз d\ell_d ерекшелігі бойынша. Бұл тікелей "ARD - кіріктірілген мүмкіндік таңдауы" шағымын тексереді және мүмкіндікке қатысты қателік рейтингін жасайды.
  2. Алға қарай жүгіруден калибрлеу кестесі. GP тым сенімді болып шыққан жағдайды қоса алғанда, анық көрсетілген 1/2/3 сигмадағы күтілетін және эмпирикалық асып кету.
  3. Сенімге негізделген стратегия, адал негатив сияқты бес мамандық бойынша, сынақ саны үшін дефляцияланған. Ол сәтсіз болса, ол басқа теріс нәтиже ретінде сол серияға енеді.
  4. Қабырға сағаты O(n3)O(n^3) қисығы үшін n=250/500/1000/2000/5000n = 250 / 500 / 1000 / 2000 / 5000, дәл және SVGP, сондықтан масштабтау бөлімі бекітудің орнына диаграммаға сүйенеді.

Қорытынды

Саудадағы Гаусс процестеріне қатысты жағдай «олар сізге қателік жолақтарын береді» емес — конформды болжау сізге аз үлестіру болжамдары бар қате жолақтарын береді және GP-де жоқ қамту кепілдігі. Жағдай мынада: GP сізді құрылымдық гипотезаны ядро ​​ретінде жазуға мәжбүр етеді, оны өз күрделілігінде бағаланатын мақсатқа сәйкес келтіреді, содан кейін ARD ұзындық шкаласы арқылы сіздің қандай мүмкіндіктеріңіздің нақты пайдаланғанын айтады. Бұл әдеттен тыс оқылатын үлгі.

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

Анықтамалар

  • Rasmussen, C. E., & Williams, C. K. I. (2006). Машиналық оқытуға арналған Гаусс процестері. MIT баспасөзі.
  • Уилсон, А. және Адамс, Р. (2013). Үлгілерді табу және экстраполяцияға арналған Гаусс процесінің ядролары. ICML.
  • Hensman, J., Fusi, N., & Lawrence, N. D. (2013). Үлкен деректерге арналған Гаусс процестері. UAI.
  • Gatheral, J., Jaisson, T., & Rosenbaum, M. (2018). Құбылмалылық өрескел. Сандық қаржы, 18(6).
  • Rizvi, S. A. A., Roberts, S. J., Osborne, M. A., & Nyikosa, F. (2017). Гаусс процесінің конверттері арқылы қаржылық құбылмалылықты болжаудың жаңа тәсілі. arXiv:1705.00891.
  • Ludkovski, M., & Risk, J. (2025). Сандық қаржыландыруға арналған Гаусс процесінің үлгілері. Springer.
  • Гарднер, Дж.Р., Плейс, Г., Биндель, Д., Вайнбергер, К.К., Уилсон, А.Г. (2018). GPyTorch: GPU жеделдетуімен Blackbox матрицасы-матрицалық Гаусс процесінің қорытындысы. NeurIPS.
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 сауда талдаулары, нарық аналитикасы және платформа жаңалықтары үшін біздің ақпараттық бюллетеньге жазылыңыз.

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