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

Нейрондық ODE: үздіксіз уақыт Delta-Time мүмкіндігін жеңе ме?

Нейрондық ODE: үздіксіз уақыт Delta-Time мүмкіндігін жеңе ме?
#deep-learning
#neural-ODE
#continuous-time
#SDE
#dynamics

Нейрондық қарапайым дифференциалдық теңдеулер (Chen және т.б., NeurIPS 2018) нейрондық желімен жасырын күйдің туындысын параметрлейді және ODE шешушісіне шығысты есептеуге мүмкіндік береді. Модель үздіксіз тереңдікке айналады және нарықтар үшін пайдалырақ, үздіксіз-уақыт: жасырын күйді кез келген уақытта бағалауға болады. tt, деректеріңіз орын алатын тор нүктелерінде ғана емес.

Бұл сипаттың кездейсоқ аралықтарда келетін қаржылық деректерге арналған айқын қадамы бар. Бірақ алаң көрінгеннен әлдеқайда әлсіз талапты жасырады. Қарапайым GRU қосымша енгізу мүмкіндігін берді — log(Δt)\log(\Delta t) алдыңғы бақылаудан бері — қанша уақыт өткенін де «біледі». Нақты сұрақ үздіксіз уақыт үлгілері тұрақты емес деректерді қабылдай алады ма емес. Бұл бақылаулар арасындағы үздіксіз динамиканың дельта-уақыт мүмкіндігі сізге бере алмайтын кез келген нәрсені шығара ма, жоқ па, бұл қорытынды құнынан он-жүз есе жоғары.

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

Сынақтағы шағым

Үздіксіз уақыт нарығын модельдеуге арналған үш кірістірілген гипотеза

Үш кірістірілген гипотеза, әрқайсысы соңғысынан әлдеқайда күшті:

  1. H1 — өңделмеген тұрақты емес BTC сауда ағынындағы ODE-RNN фиткасы уақыт туралы мүлдем ақпаратсыз бір ағындағы GRU сәйкестігін жеңеді. Бұл дерлік сенімді және дерлік түкке тұрғысыз: ODE-RNN-де базалық ақпарат жоқ.
  2. H2 — GRU берілгеннен кейін ODE-RNN бірдей GRU-ны жеңеді log(Δt)\log(\Delta t) енгізу мүмкіндігі ретінде. Бұл адал сынақ. Бұл нейрондық ODE әдебиеті әдетте жасау ретінде оқылады және қаржылық деректерде ешқашан көрсетілмеген талап.
  3. H3 — H2 артықшылығы кідіріс бюджетінен аман қалады, яғни ол ODE-RNN адаптивті емес, тікелей қорытынды шығару үшін жеткілікті жылдам бекітілген қадамды шешушімен орналастырылған кезде сақталады. dopri5.

Эксперимент хаттамасы

Бірдей белгі ағыны, бірдей мақсат, екі қол үшін бірдей баптау бюджеті. 1 м жолақтарға қайта сынама алу жоқ — қайта сынамалау сыналған нақты құрылымды бұзады.

Параметр
Деректер BTC сауда басып шығарулары, ауыспалы келу уақыты, қайта үлгіленбеген
Қару-жарақ ODE-RNN; GRU + log(Δt)\log(\Delta t); Уақыт мүмкіндігі жоқ GRU
Мақсат Барлық қарулар үшін бірдей; сәйкестігімен белгіленеді
Көрсеткіштер RMSE, кідіртілген журнал ықтималдығы, әр дәуірдегі қабырға сағаты, әр қадамдық қорытынды кідірісі
Шешуші сыпыру dopri5 (rtol 1e-5) және бекітілген қадамды Эйлер, жаттығу дәлдігі бойынша сәйкес келеді
Сызат Алға қарай жүріңіз, тек үлгіден тыс
Қол RMSE Лог-лик с/дәуір Қорытынды кідіріс/қадам
GRU (уақыт мүмкіндігі жоқ)
GRU + журнал(dt)
ODE-RNN (dopri5)
ODE-RNN (бекітілген қадамды Эйлер)

H2 бойынша теріс нәтиже толығымен жариялануы мүмкін және ең құнды нәтиже — осы стандартта қолданылатын бірдей стандарт. шынайы теріс нәтиже және бірнеше сынақтан өткен Sharpe дефляциясы.

Екінші эксперимент: CNF vs Student-t

Егер ODE-RNN салыстыру тым қымбат болса, арзанырақ эмпирикалық якорь дистрибуциялық болып табылады: нақты BTC күнделікті кірістеріне үздіксіз нормаланатын ағынды сәйкестендіріңіз және оның бекітілген тығыздығын Student-t сәйкестігімен және эмпирикалық құйрықпен салыстырыңыз, 1% және 5% деңгейлерінде құйрық-квантильдік қателерді хабарлаңыз. Бұл қазірдің өзінде өлшенген тарату жұмысына тікелей қосылады GARCH құбылмалылығын болжау және асимметриялық GARCH.


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

Фон: ResNets-тен үздіксіз динамикаға дейін

Қалдық желі үздіксіз динамикалық өріске айналуда

Қалдық желі есептейді ht+1=ht+f(ht,θt)h_{t+1} = h_t + f(h_t, \theta_t). Қадам өлшемін кішірейтіңіз және қабаттар санын көбейтіңіз және үздіксіз шекке жақындайсыз:

dh(t)dt=f(h(t),t,θ)\frac{dh(t)}{dt} = f(h(t), t, \theta)

Орнына TT жеке параметрлері бар дискретті қабаттар, бір желі ff лездік өзгеру жылдамдығын анықтайды. Уақыт бойынша шығыс TT бастапқы мән мәселесін шешеді:

h(T)=h(0)+0Tf(h(t),t,θ)dth(T) = h(0) + \int_0^T f(h(t), t, \theta) \, dt

Қара жәшік шешушісі (Эйлер, Рунге-Кутта, Дорманд-Принс) интегралды сандық түрде есептейді, жергілікті қате бағалауларынан қадам өлшемдерін адаптивті түрде таңдайды.

Қосалқы әдіс

Әрбір шешуші қадам арқылы кері таралу барлық аралық күйлерді сақтайды, жад құны қадамдар санына пропорционалды. Чен және т.б. орнына кері ODE шешіңіз O(1)O(1) жады. Қосалқы күйді анықтаңыз a(t)=L/h(t)a(t) = -\partial L / \partial h(t), бұл қанағаттандырады

da(t)dt=a(t)Tf(h(t),t,θ)h\frac{da(t)}{dt} = -a(t)^T \frac{\partial f(h(t), t, \theta)}{\partial h}

және кері өту бойымен параметр градиентін жинақтаңыз:

dLdθ=T0a(t)Tf(h(t),t,θ)θdt\frac{dL}{d\theta} = -\int_T^0 a(t)^T \frac{\partial f(h(t), t, \theta)}{\partial \theta} \, dt

Кері өту кеңейтілген жүйелік есептеулерді шешеді h(t)h(t), a(t)a(t) және dL/dθdL/d\theta бір уақытта шешушіні кері бағытта іске қосу TT дейін 00.

Сауда: қайта құру h(t)h(t) кері қарай сандық қатені жинақтайды, бұл қатаң немесе хаотикалық динамика үшін нашар. Бақылау пункті - бұл дүкен h(t)h(t) бірнеше аралық уақытта олардың арасында қайта есептеңіз. Баға процестері үздіксіз semimartingales және қалыпты тегіс болып табылады, сондықтан қосымша әдетте дейін ұстайды; микроқұрылым оқиғаларының айналасындағы қаттылық бейімделгіш ерітінділерді немесе гибридтерді мәжбүрлеуі мүмкін.

ODE-RNN: бақылаулар арасындағы үздіксіз жасырын күй

Тұрақты емес бақылаулар арасында бірқалыпты дамып жатқан жасырын күй

ODE-RNN - негізгі эксперимент қосылатын архитектура. Бақылаулар арасында жасырын күй ODE астында дамиды:

h(t)=ODESolve(fθ,h(ti),ti,t)h(t) = \text{ODESolve}(f_\theta, h(t_i), t_i, t)

Бақылау кезінде xi+1x_{i+1} жетеді ti+1t_{i+1}, дискретті жаңарту іске қосылады:

h(ti+1+)=RNNCell(h(ti+1),xi+1)h(t_{i+1}^+) = \text{RNNCell}(h(t_{i+1}^-), x_{i+1})

Үстіңгі таңбалар бақылау алдындағы және дәл кейінгі күйді білдіреді. Бақылаулар арасында үздіксіз динамика үйренді; бақылаулар, жаңа мәліметтер.

H2 абляция зондтарының механизмі мынада: ұзақ саңылау жасырын күйдің ұзақ жолмен дамығанын білдіреді. fθf_\theta — базалық сызыққа қарай ыдырау немесе алшақтау — және бұл эволюцияның пішіні скаляр ретінде берілгеннен гөрі үйренілген. Бұл экспрессивтілік нақты сауда деректерінде өзін ақтайды ма, бұл өлшенбейтін нәрсе.

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

Нейрондық SDEs: Стохастикалық компоненттерді қосу

Басқарылатын стохастикалық диффузиясы бар үздіксіз динамика

Нейрондық ODE детерминирленген және баға жолындағы шуды көрсете алмайды. Классикалық емдеу - геометриялық броундық қозғалыс, тәуекелге бейтарап дрейф және тұрақты құбылмалылық жорамалдарының күлімсіреу кезінде сәтсіздікке ұшырау жолдары - мақалада қамтылған. Black-Scholes опцияларының бағасы. Нейрондық SDE параметрлік пішінді үйренген диффузиялық терминмен ауыстырады:

dh(t)=f(h(t),t,θ)dt+g(h(t),t,ϕ)dW(t)dh(t) = f(h(t), t, \theta) \, dt + g(h(t), t, \phi) \, dW(t)

ff дрейф болып табылады, gg диффузия, W(t)W(t) Винер процесі, екеуі де ff және gg нейрондық желілер.

Архитектура: Drift Net және Diffusion Net

  • Дрифт желісі fθf_\theta: күтілетін траектория — тренд, орташа реверсия, импульс. Болжам қатесін азайтуға үйретілген.
  • Диффузиялық тор gϕg_\phi: күй функциясы ретінде үйренген шу шамасы. Құбылмалы режимде жоғары, тыныш режимде төмен.

Бөліну классикалық кванттық қаржыны көрсетеді: дрейф – тәуекелге бейтарап (немесе P-өлшем) динамикасы, диффузия – құбылмалылық беті.

Нейрондық SDE жаттығулары

Стохастикалық интеграл gdW\int g\,dW классикалық түрде дифференциацияланбайды. Үш тәсіл:

  1. Жолды градиенттер: қайта параметрлеу трюкі — броундық жолдардың үлгісі, шуды бекітілген кіріс ретінде өңдейтін шешуші арқылы дифференциалдау.
  2. Ұпай сәйкестігі: бағалау hlogp(h)\nabla_h \log p(h) және деноизизациялау мақсаттары арқылы жаттықтыру — дәл сол техникада дербес генеративті модель ретінде пайдаланылады крипто болжау үшін диффузиялық модельдер, мұнда SDE үшін оқыту опциясына төмендетілді.
  3. Ақыр өлшемді үлестірімді сәйкестендіру: толық жол өлшемдерін емес, бақылау уақытындағы шеттерді сәйкестендіріңіз.

Pathwise практикалық әдепкі болып табылады. torchsde Autodiff қолдауымен Эйлер-Маруяма, Милштейн және стохастикалық Рунге-Кутта жүзеге асырады.

Құбылмалылық бетін үйрену

Классикалық модельдер (Heston, SABR) диффузия коэффициентіне параметрлік формаларды жүктейді. Нейрондық SDE үйренеді gϕ(S,t)g_\phi(S, t) ерікті функция ретінде:

dS(t)=μθ(S(t),t)dt+σϕ(S(t),t)S(t)dW(t)dS(t) = \mu_\theta(S(t), t) \, dt + \sigma_\phi(S(t), t) \, S(t) \, dW(t)

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

Жетіспейтін және асинхронды деректерге арналған жасырын ODE

Жетіспейтін асинхронды деректерді қалпына келтіретін жасырын үздіксіз күй

Жасырын ODE (Rubanova, Chen, Duvenaud, 2019) нейрондық ODE-ны VAE-мен жұптайды: қаржылық қатарлар - төменгі өлшемді жасырын кеңістікте үйренетін тегіс негізгі процестің шулы бақылаулары.

  1. Тану желісі: өндіру үшін бақылаулар арқылы кері жұмыс істейтін ODE-RNN q(z0x1:N)q(z_0 | x_{1:N}).
  2. Жасырын динамика: z(t)=z(t0)+t0tfθ(z(s),s)dsz(t) = z(t_0) + \int_{t_0}^{t} f_\theta(z(s), s)\, ds.
  3. декодер: x^(t)=Decoder(z(t))\hat{x}(t) = \text{Decoder}(z(t)), кез келген сұралған уақытта бағаланады.

Жоғалту стандартты ELBO болып табылады:

L=Eq(z0)[i=1Nlogp(xiz(ti))]KL(q(z0x1:N)p(z0))\mathcal{L} = \mathbb{E}_{q(z_0)} \left[ \sum_{i=1}^{N} \log p(x_i | z(t_i)) \right] - \text{KL}(q(z_0 | x_{1:N}) \| p(z_0))

Портфолио күйін бағалау: активтер бойынша сирек асинхронды бақылаулардан бірлескен динамикаға ие үздіксіз жасырын күйді шығарыңыз — негізінен Кальман сүзгісінің сызықты емес, үйренген нұсқасы.

Деректерді есептеудің жоқтығы: тоқтаулар мен демалыс күндері біркелкі интерполяцияланған жасырын траекторияға ие болады; декодер VAE артындағы белгісіздікпен саңылау арқылы мүмкін болатын жолдарды шығарады.

Көп жиілікті біріктіру: күнделікті жабылулар, күн ішіндегі VWAP және ортақ уақыт торынсыз бір үлгідегі деректерді белгілеу.

Қайтару үлестіріміне арналған үздіксіз нормалау ағындары

Ауыр құйрықты қайтарымды бөлуді қалыптастыратын үздіксіз ағын

CNF қарапайым базалық үлестіруді күрделі мақсатқа айналдыру үшін нейрондық ODE пайдаланады. Трансформация болып табылады dz(t)dt=f(z(t),t,θ)\frac{dz(t)}{dt} = f(z(t), t, \theta), және лог-тығыздығы айнымалылардың лезде өзгеруінен кейін келеді:

logp(z(t))t=tr(fz(t))\frac{\partial \log p(z(t))}{\partial t} = -\text{tr}\left(\frac{\partial f}{\partial z(t)}\right)

Күй мен журнал тығыздығын алға қарай біріктіру z(0)p0z(0) \sim p_0 алу z(T)z(T) және logp(z(T))\log p(z(T)). Якобиялық із масштабтылық үшін Хатчинсонның стохастикалық бағалаушысымен бағаланады.

Криптографиялық кірістер лептокуртикалық және теріс бұрмаланған — нақты деректермен өлшенеді. GARCH құбылмалылығын болжау және асимметриялық GARCH және левередж эффектісі — және CNF бұл пішінді қабылдаудың орнына үйренеді. Күй айнымалыларындағы ағынды шарттау пішіннің режиммен өзгеруіне мүмкіндік береді. Тығыздық шамамен емес, дәл болғандықтан, ол есептелген құйрық көрсеткіштерін бере алады. Монте-Карло және жүктейтін кері сынақтар және CVaR құрылысы HRP/CVaR портфолио құбыры; бірлескен құйрық құрылымы бөлек өңделеді бірлескен тәуекелге арналған копула модельдері.

Шартты тығыздықты бағалау

Пайдалы фрейм бір мәселеге жарияланған үш көзқарас арасындағы тікелей қарама-қайшылық болып табылады. TFT квантилдік шығыс қабатынан квантильдердің бекітілген жинағын береді. Конформды болжау қамту кепілдігімен калибрленген аралықтарды береді. Шартты CNF сізге дәл, дифференциалданатын тығыздық береді:

dz(t)dt=f(z(t),t,featurest,θ)\frac{dz(t)}{dt} = f(z(t), t, \text{features}_t, \theta)

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

Дискретті баламалармен салыстыру

Ортақ бақылаулар бойынша салыстырылған дискретті және үздіксіз модельдер

Меншік LSTM/GRU Трансформатор Нейрондық ODE Нейрондық SDE
Уақытты ретсіз өңдеу Нашар (толтырғышты қажет етеді) Позициялық кодтау Туған жер Туған жер
Есте сақтау (жаттығу) O(T)O(T) O(T2)O(T^2) O(1)O(1) іргелес O(1)O(1) іргелес
Белгісіздікті сандық анықтау Жоқ (детерминистік) Жоқ (детерминистік) Ансамбльдер арқылы Туған жер
Бақылаулар арасындағы интерполяция Жоқ Жоқ Иә Иә
Үздіксіз уақыт тығыздығы Жоқ Жоқ CNF арқылы Жол өлшемі арқылы
Есептеу құны Төмен Орташа Айнымалы (шешуші) Жоғары (SDE шешушісі)

Осы кестенің LSTM-назар аудару жартысы егжей-тегжейлі дәлелденген, эталондармен, TFT мақаласы — оның "TFT vs LSTM vs Vanilla Transformer" және "When LSTM Still Wins" бөлімдерін қараңыз. Мұндағы жаңа бағандар оң жақтағы екеуі, ал H2/H3 сұрақтарын шешетін жолдар соңғы екеуі.

Python torchdiffeq көмегімен іске асыру

Нейрондық дифференциалдық теңдеулерді шешуші дәл есептеу орбитасы ретінде

torchdiffeq ODE шешушілерін қосымша кері таралумен қамтамасыз етеді.

Баға динамикасы үшін негізгі нейрондық ODE

import torch
import torch.nn as nn
from torchdiffeq import odeint_adjoint as odeint

class PriceDynamics(nn.Module):
    """Neural network defining dh/dt = f(h, t)."""

    def __init__(self, hidden_dim: int = 64):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(hidden_dim, 128),
            nn.Tanh(),
            nn.Linear(128, 128),
            nn.Tanh(),
            nn.Linear(128, hidden_dim),
        )

    def forward(self, t, h):
        return self.net(h)


class NeuralODEPredictor(nn.Module):
    """
    Encode observed features -> latent state,
    evolve via Neural ODE,
    decode to price prediction.
    """

    def __init__(self, input_dim: int, hidden_dim: int = 64):
        super().__init__()
        self.encoder = nn.Linear(input_dim, hidden_dim)
        self.dynamics = PriceDynamics(hidden_dim)
        self.decoder = nn.Linear(hidden_dim, 1)

    def forward(self, x0, eval_times):
        """
        x0:         (batch, input_dim) features at t=0
        eval_times: (T,) times at which to evaluate the ODE
        Returns:    (T, batch, 1) predictions
        """
        h0 = self.encoder(x0)                          # (batch, hidden_dim)
        h_traj = odeint(self.dynamics, h0, eval_times,
                        method='dopri5', rtol=1e-5, atol=1e-7)
        return self.decoder(h_traj)

Тұрақты емес кене деректеріне арналған ODE-RNN

Бұл эксперименттік қол. Ол жеңуі керек негізгі сызық nn.GRUCell сол ағында log(t_next - t_prev) жалғанған x.

class ODERNNCell(nn.Module):
    """Single step: ODE-evolve, then RNN-update."""

    def __init__(self, input_dim: int, hidden_dim: int = 64):
        super().__init__()
        self.dynamics = PriceDynamics(hidden_dim)
        self.gru_cell = nn.GRUCell(input_dim, hidden_dim)

    def forward(self, h, x, t_prev, t_next):
        times = torch.tensor([t_prev, t_next], dtype=torch.float32)
        h_evolved = odeint(self.dynamics, h, times,
                           method='dopri5')[-1]  # state at t_next
        h_updated = self.gru_cell(x, h_evolved)
        return h_updated


class ODERNN(nn.Module):
    """Process irregularly-sampled sequence."""

    def __init__(self, input_dim: int, hidden_dim: int = 64):
        super().__init__()
        self.cell = ODERNNCell(input_dim, hidden_dim)
        self.decoder = nn.Linear(hidden_dim, 1)
        self.hidden_dim = hidden_dim

    def forward(self, observations, times):
        """
        observations: list of (batch, input_dim) tensors
        times:        list of floats, observation timestamps
        """
        batch_size = observations[0].shape[0]
        h = torch.zeros(batch_size, self.hidden_dim)

        outputs = []
        for i in range(len(observations)):
            t_prev = 0.0 if i == 0 else times[i - 1]
            h = self.cell(h, observations[i], t_prev, times[i])
            outputs.append(self.decoder(h))

        return torch.stack(outputs)  # (seq_len, batch, 1)

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

def train_neural_ode(model, train_loader, epochs=100, lr=1e-3):
    optimizer = torch.optim.Adam(model.parameters(), lr=lr)
    scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(
        optimizer, T_max=epochs
    )

    for epoch in range(epochs):
        epoch_loss = 0.0
        for batch in train_loader:
            features, times, targets = batch
            optimizer.zero_grad()

            predictions = model(features, times)
            loss = torch.nn.functional.mse_loss(predictions, targets)

            loss.backward()
            torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
            optimizer.step()

            epoch_loss += loss.item()

        scheduler.step()

        if (epoch + 1) % 10 == 0:
            avg_loss = epoch_loss / len(train_loader)
            print(f"Epoch {epoch+1}/{epochs}, Loss: {avg_loss:.6f}")

Қайтару үлестіріміне арналған үздіксіз нормалау ағыны

from torchdiffeq import odeint

class CNFDynamics(nn.Module):
    """Dynamics for continuous normalizing flow."""

    def __init__(self, dim: int = 1, hidden_dim: int = 64):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(dim + 1, hidden_dim),  # +1 for time
            nn.Tanh(),
            nn.Linear(hidden_dim, hidden_dim),
            nn.Tanh(),
            nn.Linear(hidden_dim, dim),
        )
        self.dim = dim

    def forward(self, t, state):
        z = state[..., :self.dim]
        t_expand = t.expand(z.shape[0], 1)
        zt = torch.cat([z, t_expand], dim=-1)
        dz = self.net(zt)

        e = torch.randn_like(z)
        e_dz = torch.autograd.grad(
            dz, z, e, create_graph=True
        )[0]
        trace_jac = (e_dz * e).sum(dim=-1, keepdim=True)

        return torch.cat([dz, -trace_jac], dim=-1)


class ReturnDistributionCNF(nn.Module):
    """Model return distributions with continuous normalizing flows."""

    def __init__(self, dim: int = 1):
        super().__init__()
        self.dynamics = CNFDynamics(dim)
        self.dim = dim

    def log_prob(self, x):
        """Compute log probability of observed returns."""
        log_p0 = torch.zeros(x.shape[0], 1)
        state0 = torch.cat([x, log_p0], dim=-1)
        state0.requires_grad_(True)

        times = torch.tensor([1.0, 0.0])  # backward
        state_T = odeint(self.dynamics, state0, times,
                         method='dopri5')[-1]

        z_T = state_T[..., :self.dim]
        delta_log_p = state_T[..., self.dim:]

        log_p_base = -0.5 * (z_T ** 2 + torch.log(
            torch.tensor(2 * torch.pi)
        )).sum(dim=-1, keepdim=True)

        return log_p_base + delta_log_p

    def sample(self, n_samples: int):
        """Generate samples from learned distribution."""
        z0 = torch.randn(n_samples, self.dim)
        log_p0 = torch.zeros(n_samples, 1)
        state0 = torch.cat([z0, log_p0], dim=-1)

        times = torch.tensor([0.0, 1.0])  # forward
        state_T = odeint(self.dynamics, state0, times,
                         method='dopri5')[-1]

        return state_T[..., :self.dim]

Практикалық жазбалар

Сандық дәлдік пен шығару жылдамдығы арасындағы теңдестірілген сауда

Бұл жоғарыдағы экспериментті орындау кезінде сізді тістейтін нәрселер.

Шешуші таңдау және жылдамдық

dopri5 дәлдікке кепілдік береді, бірақ айнымалы есептеу құнын береді, сондықтан H3 H2-ден бөлек гипотеза болып табылады: тек бейімделгіш шешуші астында болатын жиек тірі кідіріс бюджетінен аман қалмауы мүмкін. Бекітілген қадамды шешушілер (Эйлер, RK4) дәлдік құны бойынша болжамды кідіріс береді. Практикалық ымыраға келу: бірге жаттығу dopri5, репрезентативті деректердегі адаптивті шешушінің шығысымен сәйкестендіру үшін калибрленген бекітілген қадамды шешушімен орналастырыңыз және оны аз деп есептемей, алшақтықты өлшеңіз.

odeint(f, h0, t, method='dopri5', rtol=1e-6, atol=1e-8)

odeint(f, h0, t, method='euler', options={'step_size': 0.1})

Үзіліссіз секірулер жанында қатты проблемалар үшін, method='implicit_adams' немесе method='scipy_solver'.

Сандық тұрақтылық

Егер fθf_\theta күй алшақтайтын үлкен мәндерді шығарады. Жеңілдеткіштер:

  • Спектрлік нормалау қабаттарында fθf_\theta Липшиц тұрақтысын басқару үшін.
  • Жаттығу кезінде Градиентті кесу (жоғарыдағы жаттығу циклінде көрсетілген).
  • Уақытты қалыпқа келтіру: уақыт белгілерін масштабтау [0,1][0, 1].
  • Динамикалық норма бойынша реттеу: қосу λfθ(h,t)2\lambda \|f_\theta(h, t)\|^2 жоғалтуға.

Интеграция аралығы

Айлардағы деректер үшін біріктірмеңіз t=0t = 0 дейін t=10,000t = 10{,}000 минуттар:

t_normalized = (timestamps - timestamps[0]) / (timestamps[-1] - timestamps[0])

Бұл шешушіні сандық режимде сақтайды және үйренілген динамика масштабты инвариантты етеді. Бұл салыстыру үшін де маңызды: нормаланбаған ODE-RNN таза сандық себептерге байланысты GRU базалық сызығын жоғалтуы мүмкін, бұл табу емес, өлшеу артефакті болады.

Бірнеше уақыт шкалаларын өңдеу

Нарықтарда бірден микросекундтық, секундтық, минуттық және күнделікті шкалалардың динамикасы бар және бір нейрондық ODE олардың барлығын ұстау үшін күресуі мүмкін. Опциялар: әртүрлі уақыт шкалаларында бірнеше ODE блоктарын жинақтау; жылдам және баяу сыйымдылық үшін жасырын өлшемді кеңейту; немесе әрбір жиілік диапазонына және сақтандырғыш шығыстарына бөлек нейрондық ODE іске қосыңыз. (Бұл модель сыйымдылығы туралы сұрақ, бұл сұрақта кері тест-дәлдік сұрағынан ерекшеленеді адаптивті ажыратымдылықты жылжыту.)

Зерттеу бағыттарын ашыңыз

Бір үлгіден сәулеленетін ашық үздіксіз уақыт зерттеу траекториялары

Нейрондық секіру SDEs: кенеттен ауытқулар үшін үйренген секіру құрамдастарын қосыңыз (флэш апаттары, табыс күтпеген жағдайлар):

dh=fdt+gdW+Rγ(h,z)N~(dt,dz)dh = f \, dt + g \, dW + \int_{\mathbb{R}} \gamma(h, z) \, \tilde{N}(dt, dz)

қайда N~\tilde{N} компенсацияланған Пуассон кездейсоқ өлшемі және γ\gamma үйренген секіру ядросы.

Нейрондық басқарылатын дифференциалдық теңдеулер (нейрондық CDEs): Wiener процесін жалпы қозғаушы сигналмен ауыстырыңыз, бұл бақыланатын деректер ағындарының динамиканы басқаруына мүмкіндік береді. Сауда-саттық және баға белгілеулер ағыны жасырын нарық жағдайын басқаратын тапсырыс ағыны үшін табиғи.

Дифференциалданатын нарықты модельдеу: дифференциалданатын тренажер ішіндегі генеративті үлгі ретінде нейрондық SDE пайдаланыңыз және ол арқылы қосымша арқылы кері таралу арқылы стратегияларды соңына дейін оқытыңыз. Стратегия мен нарық моделі бірге дамиды.

Физикадан хабарланған нейрондық ODE: PINN жоғалтуға дифференциалдық теңдеу қалдығын енгізеді — техниканың өзі Навье-Стокс мақаласы. Қаржылық қолдану арбитражсыз, пут-колл паритеті және мартингал шарттарын жазалау шарттары немесе үйренілген динамикаға қатаң шектеулер ретінде енгізу болып табылады.

Қорытынды

Біркелкі үздіксіз динамика өлшенген қорытындыға айналады

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

Белгіленбеген нәрсе - бұлардың кез келгенінің өндіріс стекке жататынын шешетін бөлік. Құрылымдық дұрыстық болжамдық артықшылықтың дәлелі емес, ал тұрақты динамика үшін мәлімделген ерекше артықшылық log(Δt)\log(\Delta t) мүмкіндік мұнда нақты сауда деректерінде өлшенбеген. Жоғарыдағы H2 кестесі толтырылғанша, бүктеменің астындағының барлығын нәтиже ретінде емес, жұмыс орындауы қоса берілген нақты гипотеза ретінде қарастырыңыз.


Анықтамалар

  • Чен, R.T.Q., Rubanova, Y., Betancourt, J., Duvenaud, D. (2018). Жүйкелік қарапайым дифференциалдық теңдеулер. NeurIPS 2018. arXiv: 1806.07366
  • Рубанова, Ю., Чен, R.T.Q., Duvenaud, D. (2019). Тұрақсыз үлгіленген уақыт серияларына арналған жасырын ODE. NeurIPS 2019. arXiv: 1907.03907
  • Цзя, Дж., Бенсон, А.Р. (2019). Нейрондық секіру стохастикалық дифференциалдық теңдеулер. NeurIPS 2019.
  • Киджер, П., Моррил, Дж., Фостер, Дж., Лионс, Т. (2020). Тұрақты емес уақыт қатары үшін нейрондық басқарылатын дифференциалдық теңдеулер. NeurIPS 2020.
  • Хасан, А., Перейра, Дж.М., Фарсиу, С., Карин, Л. (2021). Қаржылық деректерді болжауға арналған қолданбалары бар нейрондық желілік стохастикалық дифференциалдық теңдеу үлгілері. arXiv: 2111.13164
  • torchdiffeq: github.com/rtqichen/torchdiffeq
  • UvA терең оқуға арналған оқулықтар — нейрондық ODE: uvadlc-notebooks.readthedocs.io
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 сауда талдаулары, нарық аналитикасы және платформа жаңалықтары үшін біздің ақпараттық бюллетеньге жазылыңыз.

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