Riskplayer
Riskplayer личный блог
Вчера в 19:49

О применимости или неприменимости ARIMA

Пока рыночек пилит, мы тоже попилим чего-нибудь. Данная статься написана по мотивам главы 3 «Time-Series Analysis» из книги «Machine trading» E.Chan.
Все расчеты сделаны на matlab.
Первым делом, берем 5-минутки нашего любимого Сбербанка и разделим на две набора данных, первый набор 01.01.2020-01.01.2024 для тренировки нашей модели ARIMA(p, 0, 0), а второй набор с 01.01.2024г. — 08.11.2024г. для проверки модели.
Для тренировки модели используется средняя цена, т.е. 0.5*(High + Low). Для нахождения оптимального числа p (лаг) на тренировочных данных используем цикл, где перебираются p от 1 до 60 и определяем для каждого лага Байесовский информационный критерий (BIC). Оптимальный лаг будет иметь минимальный BIC.
В нашем случае получилось, что оптимальное p = 41 с такими параметрами: 

 

ARIMA(41,0,0) Model (Gaussian Distribution):
 
                   Value       StandardError    TStatistic      PValue   
                ___________    _____________    __________    ___________

    Constant      0. <a name="cut"></a> 0044119       0.003667         1.2031         0.22893
    AR{1}            1.2416     0.00038211         3249.4               0
    AR{2}          -0.31171     0.00067491        -461.86               0
    AR{3}          0.050585      0.0010332         48.961               0
    AR{4}          0.022658      0.0012971         17.468      2.4899e-68
    AR{5}          -0.05493       0.001379        -39.833               0
    AR{6}           0.04739      0.0014496         32.692     2.0322e-234
    AR{7}         -0.018811      0.0015392        -12.221      2.3964e-34
    AR{8}          0.021583      0.0016458         13.114      2.7354e-39
    AR{9}          0.014553      0.0017273         8.4251      3.6049e-17
    AR{10}         0.028344      0.0016042         17.669      7.3227e-70
    AR{11}        -0.016945       0.001519        -11.155      6.7466e-29
    AR{12}        0.0011352      0.0011099         1.0228         0.30639
    AR{13}        -0.014298     0.00072126        -19.823      1.8809e-87
    AR{14}        -0.013205     0.00091651        -14.408      4.6262e-47
    AR{15}        -0.005481       0.001332        -4.1149      3.8736e-05
    AR{16}       -0.0060875      0.0013819        -4.4053      1.0565e-05
    AR{17}         -0.00308      0.0015478        -1.9899        0.046604
    AR{18}         0.022897      0.0015615         14.664      1.0998e-48
    AR{19}      -0.00057571       0.001496       -0.38484         0.70036
    AR{20}        0.0074662      0.0014159         5.2731      1.3415e-07
    AR{21}        -0.024364       0.001357        -17.954      4.4415e-72
    AR{22}         0.032438      0.0012885         25.175     7.5672e-140
    AR{23}        -0.015657      0.0010254        -15.269      1.2215e-52
    AR{24}        0.0031435      0.0008982         3.4998      0.00046566
    AR{25}       -0.0036452      0.0010939        -3.3323      0.00086145
    AR{26}        0.0036641      0.0014248         2.5717        0.010121
    AR{27}        -0.018374      0.0015304        -12.006      3.2975e-33
    AR{28}         0.013843      0.0014963         9.2514      2.2154e-20
    AR{29}        -0.018975      0.0015305        -12.398      2.6793e-35
    AR{30}         0.028452      0.0012616         22.553     1.2418e-112
    AR{31}        -0.019905      0.0013221        -15.055      3.1791e-51
    AR{32}         0.021178      0.0014053          15.07      2.5648e-51
    AR{33}        -0.018781      0.0015817        -11.874       1.625e-32
    AR{34}        0.0053725      0.0016047          3.348      0.00081383
    AR{35}        -0.020494      0.0013739        -14.916      2.5938e-50
    AR{36}         0.030063      0.0015222          19.75      8.0827e-87
    AR{37}       -0.0025714      0.0016767        -1.5336         0.12512
    AR{38}       -0.0039149      0.0018077        -2.1657        0.030333
    AR{39}        0.0058523      0.0016222         3.6076      0.00030904
    AR{40}        -0.034314      0.0015485        -22.159     8.5091e-109
    AR{41}          0.02384     0.00098174         24.284     2.9093e-130
    Variance        0.13025     3.7647e-05         3459.8               0

Система всегда в рынке, и простая как пять копеек. Если прогнозируемая цена больше, чем текущая цена, то входим в лонг, и наоборот, если прогнозируемая цена меньше текущей, то идем в шорт.
И последний шаг, имея модель, строим доходность нарастающим итогом на проверочных данных.

О применимости или неприменимости ARIMA
Вот такой красивый график получился на проверочном наборе данных ( OOS), т.е. данные с 01.01.2024г. Проблема только в том, что в реальности, такое торговать не получится, т.к. предполагается, что сделки идут по средним ценам, тогда как после формирования бара вряд ли можно войти по средней цене.

Ну и сам код в конце.
data = readtimetable(..\\sber5min.csv');
LOGL = zeros(60,1);
P = zeros(size(LOGL,1),1);
data.mid = (data.High + data.Low)*0.5;
fullset = timerange('2020-01-01 00:00:00','inf'); 
trainset = timerange('2020-01-01 00:00:00','2024-01-01 00:00:00');
testset = timerange('2024-01-01 00:00:00','inf');

data = data(fullset, :);

for p = 1:length(P)
    model = arima(p,0,0)
    [~,~,logL] = estimate(model,data.mid(trainset))
    LOGL(p) = logL;
    P(p) = p;
end

[~,bic] = aicbic(LOGL, P+1, length(data.mid(trainset)));
[~,pMin] = min(bic)
model = arima(pMin,0,0)
fit = estimate(model, data.mid(trainset));
yF = nan(size(data,1),1);
data = addvars(data,yF);
for t = size(data.mid(trainset)):size(data.mid)
    [y,~] = forecast(fit, 1, 'Y0', data.mid(t - pMin + 1:t));
    data.yF(t) = y(end);
end
data.deltaYF = data.yF - data.mid;
data.pos = zeros(size(data,1),1);
data.pos(data.deltaYF > 0) = 1;
data.pos(data.deltaYF < 0) = -1;
diff1 = diff(data.mid);
diff1(size(diff1,1)+1) = 0;
data = addvars(data, diff1);
data.proc_chg = data.diff1./data.mid;
data.proc_profit = data.proc_chg.*data.pos;
data.cum_p = cumsum(data.proc_profit);
plot(data.cum_p(testset))


14 Комментариев
  • bohemian rhapsody
    Вчера в 19:58
    Проблема только в том, что в реальности, такое торговать не получится
  • SergeyJu
    Вчера в 20:29
    ARIMA — система авторегрессии (AR) и скользящего среднего (MA), да еще и с наворотом I. 
    Вижу к-ты авторегрессии. А q=0 и I=0. Это просто подгонка к-тов авторегрессионного фильтра? 
    Если взять цены закрытия и заложить транзакционные издержки, что-то вообще получится, интересно. Не пробовали, или не работает.

  •  Проблема только в том, что в реальности
    … существуют комиссии брокера и биржи. и проскальзывание.
    • Виктор Громов
      Вчера в 20:37
      Дмитрий Овчинников, и деградация коэф. шарпа)))) зайду с козырей
      • Виктор Громов, 
        надо строить кроме графика эквити еще график коэф. шарпа, наблюдать за его деградацией. теоретически я согласен с вами, он должен деградировать.
        • Виктор Громов
          Вчера в 20:52
          Дмитрий Овчинников, выходит хорошая система такая, где шарп деградирует медленнее. 
    • SergeyJu
      Вчера в 20:37
      Дмитрий Овчинников, обычно такие простые заходы по книжке вообще не работают.
      • SergeyJu, 
        только по книжке как раз такие заходы и работают. то есть теоретически, если не вдаваться в нюансы. 
  • Хм… зачем изучать стратегию с нереальным входом по середине бара?
  • Replikant_mih
    Вчера в 21:12

    О, интересные посты подъехали).

    А чё правда какая-то средняя цена, а не клоуз?

     

    >> такое торговать не получится

    Что-то мне подсказывает, что проблема тут не в средней цене, по которой то ли дадут то ли не дадут и т.д., там ещё какой-то bias заложен явно, ARIMA ж это цикличность, трендовость, шум — график цены вот так легко на эти компоненты не раскладывается, чтобы модель вот такую OOS эквити просто так выдавала.

  • svgr
    Вчера в 23:55
    Так и надо сразу строить проверочную на следующей свече, в чём сложность?
  • svgr
    Сегодня в 00:02
     Со стороны незнакомого с подходом выглядит как:
    переложили гадание о направлении цены на веру в волшебные коэффициенты модели, которая вывезет. Но зерна в них нет, просто в другую обёртку завернули 50/50.
    Ну, и сразу не верится, что в (p, 0, 0) что-то можно новое получить, отличное от шума.
    Если по какой-то идее модель составить, да разности брать не нулевого порядка, то может быть что-то и зацепится.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн