Параметрдик эмес бааны моделдөө үчүн Гаусс процесстери
"Classic ML baselines" сериясынын бир бөлүгү.
Эки нерсе Гаусс процессин бул блогдо өзүнчө макалага татыктуу кылат жана алардын бири да "бул сизге белгисиздикти берет".
Биринчиси ядро дизайны. GP бүт индуктивдүү тенденциясы бир функцияда жашайт , жана бул функция сиз атайылап жазган нерсе: жол канчалык одоно, кайталанабы, кайталоо бузулабы. Стандарттык инструменттер топтомундагы башка эч нерсе рыноктун динамикасы жөнүндө түзүмдүк гипотезаны ачык айтып, анан ага ылайыктуу болууга мүмкүндүк берет. Экинчиси, чектүү ыктымалдуулук — кармалып турган топтомдон эмес, моделдин өзүнөн алынган татаалдык жазасы менен машыгуу максаты. Бул блогдогу ашыкча ылайыктуу жаадагы башка ар бир макала (плато анализи, PBO, deflated Sharpe үзгүлтүксүз изделүүдө. GP бир кереги жок деп ырастайт. Бул доомат сыналышы мүмкүн жана аны текшерүү белгисиздикти өлчөөчү башка окуу куралына караганда кызыктуураак.
Белгисиздиктин өзү боюнча: GP арткы дисперсиясы *структуралык * - ал кийинчерээк орнотулган моделдин айланасына оролгондун ордуна, ортону чыгарган ошол эле жыйынтыктан чыгат. Бул conformal prognoz менен чыныгы карама-каршылык, бул блогдо эмне үчүн белгисиздик позициянын өлчөмүн аныктоого туура кириши жана сизде болгондон кийин интервал менен эмне кылуу керек экендигин камтыйт. Бул макала ошол ишти кайра талашпайт; ал моделдин артынан барат.
Төмөндө ядро жана корутунду техникасы, GPyTorch ишке ашырылышы жана - аягында ачык айтылган - бул макалада азырынча өлчөөлөр жок.
Гаусс процесси деген эмне?
GPs мурунтан эле бул блогдо Bayesian-оптимизациялоонун суррогаты катары Optuna vs. coordinate descent, ошол эле белгилер жана бирдей төмөн өлчөмдүү эскертүү менен пайда болот. Бул жерде GP гиперпараметр издөө бетине эмес, рыноктук маалыматтарга жабдылган моделдин өзү, ошондуктан дарылоо тереңирээк болот.
Гаусс процесси – бул кокустук чоңдуктардын жыйындысы, алардын каалаган чектүү саны биргелешкен Гаусс бөлүштүрүүгө ээ. Бул функциялар боюнча бөлүштүрүү, параметрлер боюнча бөлүштүрүү эмес.
Формалдуу түрдө функция кандайдыр бир чектүү киргизүүлөр топтому үчүн болсо, GPден алынат :
кайда орточо функция болуп саналат жана ковариация (ядро) функциясы болуп саналат. Биз муну төмөнкүчө жазабыз:
Орточо функция орточо жүрүм-туруму жөнүндө алдын ала ишенимди коддойт . Соодада биз адатта орнотобуз , бизде кирешелер боюнча эч кандай алдын ала багыт жок деген божомолду коддоо. Бардык структура ядрого кирет.
Эмне үчүн Параметрдик эмес?
5 өзгөчөлүгү бар сызыктуу регрессия модели 6 параметрге ээ. 64 бирдиктин эки жашыруун катмары бар нейрон тармагында миңдеген бар. А GP параметрлердин белгиленген саны жок — моделдин татаалдыгы маалыматтар менен өсөт. 10 байкоо менен GP 10 өлчөмдүү Гауссты аныктайт. 10 000 байкоо менен 10 000 өлчөмдүү Гауссты аныктайт.
Бул дарыгерлердин гиперпараметрлери жок дегенди билдирбейт. Ядро функциясынын гиперпараметрлери (узундук шкалалары, амплитудалары, мезгилдүүлүктөрү) бар, алар мурункудан алынган функциялардын касиеттерин көзөмөлдөйт. Бирок функционалдык форманын өзү эч качан туруктуу эмес. Жетиштүү маалымат жана туура ядрону эске алганда, GP ар кандай үзгүлтүксүз функцияны көрсөтө алат. Бул "параметрдик эмес" дегенди билдирет - модель сызыктуу функциялар же көп мүчөлөр сыяктуу параметрдик үй-бүлө менен чектелбейт.
каржылык моделдөө үчүн, бул баалуу болуп саналат. Базарлар өзгөрөт. Өзгөчөлүктөрдүн жана кирешелердин ортосундагы байланыш сызыктуу эмес, стационардык эмес жана режимге көз каранды. Параметрдик моделдер чындыкка дал келбеген түзүлүштү таңуулайт. GPs маалыматтар сүйлөөгө мүмкүнчүлүк берет.
Ядро функциялары: Рыноктун структурасын коддоо
Ядро функциясы Гаусс процессинин жаны болуп саналат. Ал каалаган эки киргизүү чекиттеринде функциянын маанилеринин ортосундагы ковариацияны көрсөтүү менен кайсы функциялардын априори мүмкүн экенин аныктайт. Ар кандай ядролор жылмакайлык, мезгилдүүлүк жана узак аралыктагы жүрүм-турум жөнүндө ар кандай божомолдорду коддойт.
Радиалдык базалык функция (RBF) / квадраттык экспоненциалдык
RBF ядросу эң кеңири таралган баштапкы чекит:
кайда сигнал дисперсиясы болуп саналат (чыгаруу шкаласы) жана узундук шкала болуп саналат. RBF ядросу бар GPден алынган функциялар чексиз дифференциалданат - абдан жылмакай.
** Соода чечмелөө: ** Узундук масштабы эки маалымат чекитинин канчалык алыс болушун жана дагы эле корреляцияланышын көзөмөлдөйт. Кыска узундуктагы шкала моделдин жергиликтүү үлгүлөргө реакциясын билдирет; узун узундук масштабы ал кеңири тенденцияларды камтыйт дегенди билдирет. Сигналдын дисперсиясы функциянын амплитудасын көзөмөлдөйт — болжолдонгон кирешелер канчалык чоң болушу мүмкүн.
Каржы маселеси: Чексиз жылмакайлык реалдуу эмес. Каржылык кирешелер секириктерге, режимдин өзгөрүшүнө жана үзгүлтүккө ээ. RBF ядросу бул өзгөчөлүктөрдөн ашып, структуралык тыныгууларга жакын жерде өтө консервативдүү божомолдорду чыгара алат.
Эне ядросу
Матерн классы жылмакайлык параметрин киргизүү менен RBFти жалпылайт :
кайда экинчи түрдөгү модификацияланган Бессел функциясы. As , эненин өзөгү RBFга жакындайт. Жалпы тандоолор:
- : Орнштейн-Уленбек процессине барабар. Функциялар үзгүлтүксүз, бирок дифференциалданбайт — орой, Броун кыймылы сыяктуу.
- : Функциялар бир жолу дифференциалданат. Жылмакайлык менен ийкемдүүлүктүн ортосундагы жакшы баланс.
- : Функциялар эки жолу дифференциалданат. караганда жылмакай бирок RBF караганда катуураак.
Соода интерпретациясы: The Matern- ядро, балким, каржылык убакыт катар үчүн мыкты демейки болуп саналат. Бул реалдуу баанын жолдору сыяктуу тиштүү болбостон көрсөтө турган оройлукка мүмкүндүк берет . Бул "волатилдүүлүк орой" адабиятына (Gatheral, Jaisson, & Rosenbaum, 2018) дал келет, бул эмпирикалык түрдө туруксуздуктун жолдорунун Херст көрсөткүчтөрү бар экенин көрсөтүп турат. , Броун кыймылынан алда канча одоно.
Классикалык туруксуздук моделдерин сабап жаткан матерналдык ядролордун негизги жарыяланган далили Rizvi et al. (2017), алар туш келди басууга караганда болжол менен 20% жакшыраак MSE жана GARCHка караганда 50% жакшыраак деп эсептешет — 2017-жылы крипто эмес, валюта жуптарынын күнүмдүк маалыматтары боюнча жана бул жерде кайра чыгарылбайт. Аны эталон катары эмес, ядрону сынап көрүү үчүн мотивация катары караңыз. Бул блогдун өзүнүн GARCH(1,1) реалдуу BTC күнүмдүк маалыматтарына туура келет, Ljung-Box жана ARCH-LM диагностикасы менен Крипто үчүн GARCH туруксуздугун болжолдоо; ошол эле үлгүдөгү бир эненин GP каршы бетме-бет, чынчыл салыштыруу болмок, жана ал иштетилген эмес.
Мезгилдүү ядро
Финансы рынокторунун циклдик моделдери бар: бир күндүк көлөмдүн ийри сызыгы, жуманын күнүнүн эффектилери, ай сайын балансташтыруу агымы, кварталдык киреше мезгили. Мезгилдүү ядро буларды камтыйт:
кайда мезгил болуп саналат. Бул ядродон алынган функциялар чекит менен кайталанат , узундук шкаласы менен модуляцияланган бир мезгил ичинде корреляциянын канчалык тез бузулушун көзөмөлдөйт.
** Соода чечмелөө: ** Set (саат) бир күндүк үлгүлөрдү басып алуу үчүн, же (соода күндөрү) жумалык сезондук үчүн. Фурье өзгөчөлүктөрүнөн айырмаланып, мезгилдик ядро гармоникалыктардын белгиленген санын кабыл албайт — GP циклдин формасын маалыматтардан үйрөнөт.
Ядролорду бириктирүү: кошумча жана мультипликативдик курам
GP ядросунун чыныгы күчү курамында. Эгерде жана жарактуу ядролор, ошондой эле:
- Суммасы: — функция көз карандысыз компоненттердин суммасы (кошумча ажыратуу)
- Продукт: - компоненттердин ортосундагы өз ара аракеттенүү (мисалы, жергиликтүү мезгилдүү жүрүм-турум)
Каржылык кирешелер үчүн пайдалуу курама ядро:
Бул сигналды төмөндөтөт:
- Жылмакай эмес, апериоддук тренд компоненти (Matern-3/2)
- Убакыттын өтүшү менен амплитудасы бузулуучу мезгилдик компонент (Мезгил RBF)
продукт жергиликтүү мезгилдик өзөгүн түзөт: үлгү кайталанат, бирок алыскы кайталануулар жакындагыларга караганда азыраак таасир этет. Бул рыноктун микроструктурасынын өнүгүшүнө жараша убакыттын өтүшү менен өзгөрүп турган каржылык сезондук үчүн туура.
Спектралдык аралашма ядролору
Максималдуу ийкемдүүлүк үчүн, спектралдык аралашма (SM) өзөгү (Wilson & Adams, 2013) ядронун спектралдык тыгыздыгын Гаусстардын аралашмасы катары параметрлейт:
кайда аралашма салмагы болуп саналат, спектрдик дисперсиялар болуп саналат, жана спектрдик каражаттар (жыштыктар) болуп саналат. Бохнердин теоремасы боюнча, каалаган стационардык ядро ушундай түрдө көрсөтүлүшү мүмкүн. SM ядросу бир эле убакта мезгилдүү компоненттерди, узак аралыктагы тенденцияларды жана кыска аралыктагы корреляцияларды таба алат — бардыгын маалыматтардан.
** Соода чечмелөө: ** SM ядросу маалыматтарда кандай үлгүлөр бар экенин билбеген учурда пайдалуу. Ал кайтаруу сериясындагы жашыруун мезгилдүүлүктөрдү аныктай алат (мисалы, автоматташтырылган балансташтыруу менен шартталган крипто рынокторундагы 4 сааттык тымызын циклдер). Терс жагы - көбүрөөк гиперпараметрлер жана кичинекей маалымат топтомдорун ашыкча орнотуу коркунучу.
Арткы корутунду: алдын ала айтуудан
Тренинг маалыматтары берилген кайда жана , сыноо пункттарында GP posterior жабык формадагы чечими бар. Бул көпчүлүк Байезиан моделдерине караганда GPs негизги эсептөө артыкчылыгы болуп саналат.
Арткы теңдемелер
болсун болуу окутуу ковариация матрицасы, болуу кайчылаш ковариация матрицасы, жана болуу тест ковариация матрицасы. Арткы жагы:
кайда:
Арткы маани сыноо жана машыгуу пункттарынын ортосундагы ядро окшоштугу менен салмактанып алынган окутуу максаттарынын сызыктуу айкалышы. Арткы ковариация мурунку ковариациядан башталат жана окуу маалыматтарынан алынган маалыматты алып салат. Машыгуу маалыматтары тыгыз болгон жерде, арткы дисперсия аз. Машыгуу маалыматтары сейрек болгон жерде, арткы дисперсия мурункуга кайтып келет.
Чектүү ыктымалдык жана сыноого арзырлык доомат
Ядронун гиперпараметрлери (узундук шкалалары, дисперсиялар, ызы-чуу деңгээли) лог маргиналдык ыктымалдуулукту максималдаштыруу жолу менен үйрөнүлөт:
Биринчи термин маалыматка ылайыктуу термин (байкоодон алыс болгон божомолдорду жазалайт). Экинчи термин - татаалдык жазасы (өтө ийкемдүү моделдерди жазалайт - б.а., ядро матрицасында чоң детерминант бар). Үчүнчү мөөнөт - нормалдаштыруу константасы.
Бул автоматтык Occam устарасы жана бул GP соода түтүкчөсүнө алып келген эң кызыктуу нерсе. **Дооматтын күчтүү версиясы - регуляризациялоо үчүн өзүнчө валидация топтомунун кереги жок ** — татаалдык жазасы максаттын ичинде, андыктан модель ийкемдүүлүк менен фитсти бекер сатып ала албайт.
Бул доомат өзгөчө бул блогдо скептицизмге татыктуу. Плато анализи бир баллдык валидация упайы тандоонун начар критерийи экенин жана бекемдиктин айлананын формасында жашай турганын көрсөтөт; PBO үлгүдөгү жеңүүчү үлгүдөн тышкары канча жолу утулуп калганын сандык түрдө көрсөтөт; deflated Sharpe сыноолордун саны боюнча баалар. Чектүү ыктымалдуулук дагы эле максимизацияланган үлгүдөгү максат болуп саналат — Occam фактору көптөгөн орнотулган ядролордун үстүнөн тандоону эмес, мүмкүнчүлүктү жазалайт. Эгер сиз он эки талапкер өзөгүнө туура келсе жана эң аз ыктымалдуулугу бар бирин тандасаңыз, сиз бир нече тестирлөө аймагына кайтып келдиңиз жана дефляция логикасы өзгөрүүсүз колдонулат. Жалган версия: маргиналдык ыктымалдык тандоо бир эле маалыматтарда жана бир эле ядро үй-бүлөсүндө валидация топтомун тандоого караганда үлгүдөгү/үлгүдөн тышкаркы ажырымды жаратабы? Бул өлчөнөт жана төмөндө өлчөнбөйт.
Чектүү ыктымалдык бети да жергиликтүү оптимага ээ. Бир нече кокустан кайра баштоо же кылдат инициализация маселеси — узундук шкаласын машыгуу киргизүүлөрдүн медианалык жуп аралыкка чейин инициализациялоо жана ызы-чуунун дисперсиясын максаттардын үлгү дисперсиясына киргизүү акылга сыярлык баштапкы чекит болуп саналат.
Эсептөө наркы жана масштабдуулугу
Бүткүл бурулуп жатат , бул чыгымдар убагында жана эсинде. Бул блогдо кубдук дубал башка жактан буга чейин эле талашып-тартышып жатат: издөө ыкмасына каршы баалоо наркы максат арзан болгондо GP негизиндеги Байесиялык оптималдаштырууну түздөн-түз дисквалификациялайт, анткени суррогат ал үнөмдөгөн бааларга караганда кымбатыраак. Бул жерде арифметика бирдей; колдонмо башкача. Рыноктук маалыматтарга жабдылган модел катары, куб термин дисквалификация эмес, бюджет болуп саналат: ал машыгуу терезесинде катуу шыпты белгилейт.
Соода колдонмолору үчүн масштабдуулук стратегиялары:
-
Сейрек GP (индукциялоочу пункттар). алмаштырыңыз менен матрица матрица кайда . Индукциялоочу пункттар окутуу маалыматтарын жалпылоочу псевдо-киргизүүлөр болуп саналат. Хенсман жана башкалар тарабынан SVGP (Стохастикалык Variational GP) формуласы. (2013) наркы менен мини-партиялык окутууну берет итерация боюнча. GPyTorch муну жергиликтүү түрдө колдойт.
-
Структураланган ядро интерполяциясы (SKI/KISS-GP). Киргизүүлөр тордо жатканда ядро матрицасында Kronecker жана Toeplitz структурасын пайдаланат. Чыгымды азайтат кайда тордун өлчөмү болуп саналат. Дайыма тандалып алынган убакыт сериялары үчүн идеалдуу (мисалы, 1 мүнөттүк тилкелер).
-
Жергиликтүү дарыгерлер жылма терезелерде. Акыркы маалыматтар боюнча гана өзүнчө дарыгерди үйрөтүңүз. Бул жерде GP атайын чектөө тиштеп турат: стандарттуу ядролор стационардык ( гана көз каранды ) жана базарлар андай эмес, андыктан адаттагы жооп - жылма терезе - бирок терезенин узундугу жогоруда чектелет , статистика боюнча гана эмес. Алга карай оптималдаштыруу анкердик жана жылма терезелерди, поезд/сыноо узундугун жана жалпысынан кайра оптималдаштыруу жыштыгын камтыйт; GP үчүн терезенин өлчөмү статистикалык чечим сыяктуу эле эсептөө чечими болуп саналат, ал эми анкердик (ар дайым өсүп жаткан) терезе бир нече миң пункттан кийин жакындоосуз жеткиликтүү эмес. Бул рефреминг практикалык натыйжасы болуп саналат: GP менен сиз "бардык тарыхты колдонууну" тандай албайсыз.
Кайтарууну болжолдоо үчүн GP: Практикалык негиз
Функция дизайны: Эмне үчүн 500 эмес, 5-20 функция
Базар маалыматтарынын ML үчүн жалпы өзгөчөлүк таксономиясы — буйрутма китебинин дисбаланс, китеп басымы, VPIN, Кайлдын ламбдасы, ишке ашкан өзгөрүлмөлүүлүк өзгөчөлүктөрү, циклдик убакытты коддоо, кайчылаш активдер жана каржылоо курсунун сигналдары — буга чейин машина үйрөнүү менен жайылган моделдештирүү-да баяндалган; ошол тизмени колдон.
Эмне GP конкреттүү тизменин * өлчөмү болуп саналат. Ядронун ыкмалары жогорку өлчөмдөрдө начарлайт: аралыктар топтолот, ал эми стационардык ядро дискриминациясын жоготот. Финансылык GP үчүн практикалык диапазон градиентти көтөргөн жүздөгөн дарак бактылуу жеген эмес, 5-20 киргизүү болуп саналат. Бул аман калуу механизми ARD (Автоматтык тиешелүүлүгүн аныктоо): ар бир киргизилген өлчөмгө өзүнүн узундук шкаласын бериңиз , жана маргиналдык ыктымалдуулук тренинг түртөт эч кандай сигнал алып келбеген өлчөмдөр үчүн, анткени чексиз узундук шкала ядро бул координатты этибарга албайт дегенди билдирет. Функцияны тандоо тууралоонун кошумча продуктусу болуп калат жана үйрөнгөн актуалдуу рейтинг катары түздөн-түз окууга болот - бул аны бурмалоого да мүмкүнчүлүк берет: курама өзөктү чыныгы тилкелерге тууралаңыз, узундук шкалаларын басып чыгарыңыз жана сиз ишенген өзгөчөлүктөр моделде сакталган өзгөчөлүктөрбү же жокпу, көрүңүз.
Позициянын өлчөмү жана калыс
GP арткы берет түздөн-түз, ошондуктан ал түз эле Тобокелдикти түшүнгөн позицияны өлчөө үчүн конформалык болжолдоо ичинде иштелип чыккан чет-катыштын өлчөмүнө жана соодасыз чыпкага түшүп, интервалдын туурасы менен . Бир гана айырмачылык - бул прованс: GP туурасын калибрлөө топтомунан эмес, моделдин өзүнөн чыгарат, андыктан тест чекити өткөн калдыктардын глобалдык квантилине караганда машыгуу маалыматтарына салыштырмалуу кайсы жерде жайгашканына жараша өзгөрөт.
GPyTorch менен ишке ашыруу
GPyTorch масштабдуу GP корутундусу үчүн PyTorch негизделген китепкана. Ал GPU тездетүүсүн, автоматтык дифференциацияны жана заманбап сызыктуу алгебра ыкмаларын (конъюгациялык градиенттер, Lanczos декомпозициясы) колдонот. чектөө.
Кайтарууну болжолдоо үчүн негизги так 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) алгоритмин колдонот. ордуна убакыт .
Соода түтүгү
Төмөнкү өзгөчөлүк куруучуга эскертүү: ар бир жылдыргыч статистика толугу менен артка каралышы керек жана киргизүү стандартташтыруу окутуу кесимине гана орнотулушу керек. Бул экинчи пункт жалпы гигиена эмес — бул так * нормалдаштыруу агып чыгуу* каналы [алдыга көз салуу таксономиясында] (/ky/blog/post/look-ahead-bias-taxonomy) бөлүнгөн жана өлчөнгөн, Шарп инфляциясынын ар бир түрү чыгарган. 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
Сейрек GP менен чоңураак маалымат топтомуна масштабдоо
Окутуу терезеси бир нече миң упайдан ашканда, так GP корутундусу жай болуп калат. Вариациялуу сейрек 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 индукциялоочу пункттары менен, бир партия үчүн наркы болуп саналат — бир партияга болжол менен 4 миллион операция. Бул бир GPUдагы 100 000+ байкоолордун маалымат топтомун оңой иштетет.
Deep Kernel Learning: GP Нейрондук тармактар менен жолугушат
Киргизүү мейкиндиги чоң өлчөмдүү болгондо же функциялар менен кайтарымдардын ортосундагы байланыш өтө сызыктуу эмес болсо, жөнөкөй ядро күрөшүшү мүмкүн. Терең ядрону үйрөнүү (DKL) GP өзөгүн колдонуудан мурун нейрондук тармак аркылуу киргизүүлөрдү өткөрөт:
кайда параметрлери бар нейрон тармагы болуп саналат жана стандарттуу ядро болуп саналат (мисалы, 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 катмары окутуу маалыматтарынан алыс болгон божомолдор жогорку белгисиздикке ээ болушун камсыздайт - бул стандарттуу нейрондук тармактар белгилүү түрдө камсыз кыла албаган нерсе. Эскерте кетсек, DKL полицияга эң аз ыктымалдык болгон ийкемдүүлүктү кайра киргизет: Occam фактору ядрону жазалайт, бирок анын алдындагы тармак миңдеген эркин параметрлерге ээ жана андай жаза жок.
Ludkovski жана Risk (2025), Сандык каржылоо үчүн Гаусс процессинин моделдери, опциондор баасын жана портфелди оптималдаштырууну камтыган кененирээк сандык-финансылык контекстте сурамжылоо DKL; бул натыйжалар алардын көйгөйлөрү боюнча жана крипто кайтарымын алдын ала айтуунун далили эмес.
Диагностика жана тузактар
Калибрлөө
Жакшы калибрленген GP эмпирикалык камтууга дал келген прогноздук интервалдарга ээ. Текшерүү conformal prognoz ичинде колдонулган бир эле - бул эмне үчүн маргиналдык камтуу шарттуу камтуу эместигинин теориясын камтыйт, бул чектөө 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 болуп саналат. Маанилүү сан - бул криптовалюта тилкелерин басып өткөндө эмнени басып чыгарары жана ал таблица азырынча бул макалада жок. Алдын ала күтүлгөн нерсе, GP өзүнө ашыкча ишенет - майлуу, стационардык эмес кирешелердин Гаусс ыктымалдыгы 3 сигмада начар жашырылышы керек, бирок "керек" өлчөө эмес.
Калган тузактар
-
Киргизүү масштабы. Узундук шкалалары киргизүү шкаласына салыштырмалуу, ошондуктан функция диапазондо жана бири аралап маанисин бөлүшө албайт ; ARD - бул гетерогендик диапазондорду куткарат, ал эми стандартташтыруу - ARD инициализациясын акылга сыярлык кылат.
-
Чектүү ыктымалдуулукту ашыкча тууралоо. Көптөгөн өзөктүн гиперпараметрлери (айрыкча, композиттик же спектралдык аралашма өзөктөрү) менен, чектүү ыктымалдуулук дагы эле ашып кетиши мүмкүн. Принтерди колдонуңуз: орточо жуп аралыкта борборлоштурулган узундук шкалаларында лог-нормалдуу мурда, дисперсиялардан жарым нормалдуу мурун.
-
Ковариация матрицасын шарттоо. ызы-чуу болгондо сан жагынан жекече болуп калышы мүмкүн өтө кичинекей же машыгуу пункттары дээрлик кайталанганда. GPyTorch кошумчалайт диагональга силкинүү; начар шартталган каржылык маалыматтар көп талап кылынат.
-
Алдыга көз салуу. Жогоруда жана өлчөнгөн майда-чүйдөсүнө чейин алдыга көз салуу таксономиясында камтылган.
Башка моделдерге каршы GP колдонсо болот
| Критерий | GP | XGBoost | Neural Network |
|---|---|---|---|
| Камтылган белгисиздик | Ооба (структуралык) | Жок (конформалдуу/жүктөө керек) | Жок (MC таштап/ансамбли керек) |
| Берилиштердин натыйжалуулугу | Мыкты (<1000 үлгү) | * | * |
| масштабдуулугу | Начар так, жакшы сейрек | * | * |
| Нелинардуулук | ядро-каранды | * | * |
| Interpretability | Ядронун ажыроосу + ARD узундуктарынын масштабы | * | * |
| Стационардык эмес | Жылдыруучу терезени же DKL | талап кылат * | * |
* XGBoost жана нейрон-тармак тилкелери үчүн бул жерде жаңы ырастоону эмес, жарыяланган салыштырууларды кийинкиге калтырыңыз: машина үйрөнүү менен жайылган моделдөө градиентти жогорулатууга-vs-deep-learning'ге ээ (финансылык таблицалар, кайра чечмелөө, чечмелөө үчүн таблицалар) адаптация, күтүү) жана убактылуу синтез трансформаторлору TFT vs. LSTM vs. vanilla Transformer бар.
Төмөнкү учурларда GP колдонуңуз:
- Сизде чакан жана орто маалымат топтомдору бар (бир окуу терезесинде ~10 000 байкоодон төмөн)
- Сиз сигнал жөнүндө ачык, текшерилүүчү структуралык гипотезаны каалайсыз (тенденция + мезгилдүүлүк + ызы-чуу)
- Белгисиздик глобалдык калдык квантил менен эле эмес, машыгуу маалыматтарынын алыстыгына жараша өзгөрүшү керек
Төмөнкү учурларда GP колдонбоңуз:
- Сиз миллиондогон байкоолордун үстүнөн суб-миллисекунддук тыянак керек
- Киргизүү өлчөмү ~50дөн ашат
- Сигнал стационардык ядролор билдире албаган татаал жогорку тартиптеги функциялардын өз ара аракеттенишинде жашайт (DKL Occam мүлкүнүн баасы менен жардам берет)
Бул макала эмнени өлчөй элек
Жогорудагылардын бардыгы үлгүлүү машиналар. Мунун эч бири GP криптодо акча табаарын далилдей албайт жана бул блогдун стандарты макалада өзүнүн номерлери бар. Ачык элементтер, аларды иштетүү керек:
- Чыныгы BTCUSDT 1м тилкелериндеги ARD узундугу таразалары. Курама ядрону тууралап, басып чыгарыңыз өзгөчөлүгү боюнча. Бул түздөн-түз "ARD камтылган өзгөчөлүк тандоо" дооматын сынайт жана бурмалануучу өзгөчөлүктөргө тиешелүү рейтингди чыгарат.
- Алга басуу боюнча калибрлөө таблицасы. Күтүлгөн жана 1/2/3 сигмадагы эмпирикалык ашуулар, ачык айтылган, анын ичинде GP ашыкча ишенимдүү болуп чыккан учур.
- Ишенимдүүлүк менен корголгон стратегия, алдыга карай, чынчыл терс сыяктуу беш негизги багыт боюнча, сыноолордун саны үчүн дефляцияланган. Эгер ал ишке ашпай калса, ал дагы бир терс натыйжа катары ошол серияга кирет.
- **Дубал сааты ийри ** үчүн , так жана SVGP, ошондуктан масштабдуулук бөлүмү ырастоонун ордуна диаграммага таянат.
Корутунду
Соодадагы Гаусс процесстери "алар сизге ката тилкелерин беришет" эмес - конформдук болжолдоо сизге азыраак бөлүштүрүү божомолдору менен ката тилкелерин берет жана GPде жок камтуу кепилдиги. Кептин баары GP сиздин структуралык гипотезаңызды өзөк катары жазууга мажбурлайт, аны өзүнүн татаалдыгы боюнча баалаган максатка ылайык келтирет, андан кийин ARD узундугу таразасы аркылуу сиздин кайсы функцияңызды колдонгонун айтып берет. Бул адаттан тыш окула турган модель.
Чыгымдар бирдей конкреттүү: машыгуу терезеңизди жаап турган куб масштабы, жылма терезе жарым-жартылай гана оңдолот деген стационардык божомолдор, май куйруктуу кайтып келүү бузулат деген Гаусс ыктымалдыгы жана - терең өзөктү үйрөнүүгө жеткенде - эң биринчи кезекте маргиналдык ыктымалдуулукка түрткү болгон Оккам касиетинин тынч жоготуусу. Калган нерсе соодалоого болобу же жокпу - бул эмпирикалык суроо жана жогоруда саналып өткөн төрт өлчөө ага жооп берет.
Шилтемелер
- Rasmussen, C. E., & Williams, C. K. I. (2006). Машиналарды үйрөнүү үчүн Гаусс процесстери. MIT басмасы.
- Wilson, A., & Adams, R. (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: Blackbox Matrix-Matrix Gaussian Process Inference GPU Acceleration менен. NeurIPS.
Authors
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.