Прогноз знака изменения High,Low на один бар вперед

Тема в разделе "Математика трейдинга.", создана пользователем askrotov, 17 мар 2012.

  1. askrotov

    askrotov Новичок

    Уважаемый форум,

    Перечитал я недавно дипломную работу Д. Иванова, посвященную применению нейронных сетей для прогнозирования финансовых рынков. Хорошая квалификационная работа. Особенно понравился процент правильно угаданного знака изменения High и Low дневных баров USDJPY (77.27% и 72.73% соответственно (параграф 2.4.5)). Для прогноза использовалось две трех-слойных нейронных сети с 160 синапсами каждая для прогноза High и Low на сутки вперед.

    Меня смутило количество данных в обучающей выборке: 347. И решил я сравнить этот метод решения, предложенный в работе Д. Иванова по проценту совпадения знака изменения High и Low на один бар вперед с методом, опирающимся на понятие классической точки разворота (pivotpoint).

    Введем обозначения:

    PP=(H[i-1]+L[i-1]+C[i-1])/3, R1=2*PP-L[i-1], S1=2*PP-H[i-1],

    где PP - точка разворота, R1 - первый уровень сопротивления, S1 - первый уровень поддержки на i-ом баре; H[i-1], L[i-1], C[i-1] - High, Low и Close на предыдущем баре (i-1). Видно, что PP, R1, S1 зависят от значений High, Low, Close только предыдущего бара (i-1).

    Базу котировок (с 2001 по 2012) я взял с Forexite. Из 1-минутных котировок я нарезал часовки, 4-часовки и дневки EURUSD, GBPUSD и USDJPY своей программкой :). У меня получилось 68708 часовок, 17748 4-часовок и 3257 дневок по каждой валютной паре со своими (Open, High, Low, Close).

    Чтобы получить процент совпадения, нужно знать реальное изменение на i-й момент времени:

    d1H=H-H[i-1] (High), d1L=L-L[i-1] (Low) и d1C=C-C[i-1] (Close),

    где H,L,C - значения High,Low,Close для i-го бара; H[i-1],L[i-1],C[i-1] - значения High, Low, Close предыдущего бара (i-1), а также разности

    d1RH[i]=R1[i]-H[i-1], d1SL[i]=S1[i]-L[i-1], d1PC[i]=PP[i]-C[i-1].

    Далее мы сравниваем знаки изменения d1H[i] и d1RH[i]. Если знаки совпадают, то z1RH[i]=1 ([b]profit[/b]); если не совпадают или d1H[i]=0, то z1RH[i]=-1 ([b]fail[/b]); если d1RH[i]=0, то z1RH[i]=0 ([b]empty[/b]) (аналогично для Low (z1SL[i]) и Close (z1PC[i])). Далее подсчитываем количество -1,0,1 и находим проценты:

    PRP_X=(количество 1 по параметру Х)/(общее число случаев),
    PR0_X=(количество 0 по параметру Х)/(общее число случаев),
    PRN_X=(количество -1 по параметру Х)/(общее число случаев),
    PRP0_X=(количество 1 по параметру Х)/(общее число случаев - количество случаев, когда X = 0),
    PR00_X=(количество 0 по параметру Х)/(общее число случаев - количество случаев, когда X = 0),
    PRN0_X=(количество -1 по параметру Х)/(общее число случаев - количество случаев, когда X = 0),

    X - это наши z1RH, z1SL, z1PC.

    Получилась следующая таблица (см. прикрепленное изображение)

    [u]Пояснения к таблице:[/u]

    [b]Period:[/b] период в минутах 60 — часовки, 240 — 4-часовки, 1440 — сутки.

    [b]Score:[/b] порядок численной разности:
    1: d1X[i]=X[i]-X[i-1];
    2: d2X[i]=d1X[i]-d1X[i-1];
    3: d3X[i]=d2X[i]-d2X[i-1];
    4: d4X[i]=d3X[i]-d3X[i-1];
    где X это High, Low, Close.

    [b]Rates:[/b] понятно, обозначения пар.

    [b]Var:[/b] исследуемые величины, zuh – процент совпадения знака dkH[i] и dkRH[i], где k – порядок численной разности, аналогично zdl – процент совпадения знака dkL[i] и dkSL[i] и zpc – процент совпадения знака dkC[i] и dkPC[i]. Видно, что с ростом порядка численной разности процент совпадения знака реального изменения параметра (High, Low, Close) и предсказанного R1,S1,PP растет для всех пар и для всех периодов. Здесь проценты считались от всей базы выборки.

    Теперь самое интересное. Оставшиеся значения колонки [b]Var:[/b] pdl – процент совпадения знака d1L[i] с величиной d1DL[i], восстановленной с участием k-й численной разности dkSL[i]. В случае k=1: d1DL[i]=d1SL[i]. Тоже самое puh - процент совпадения знака d1H[i] с величиной d1UH[i], восстановленной с участием k-й численной разности dkRH[i] (k=1: d1UH[i]=d1RH[i]) и ppc - процент совпадения знака d1C[i] с величиной d1QC[i], восстановленной с участием k-й численной разности dkPC[i] (k=1: d1QC[i]=d1PC[i]). Здесь проценты считались от числа случаев без учета случаев ([b]empty[/b]) (см. выше).

    [u]Промежуточные выводы:[/u] сравним значения процента совпадения знака изменения High, Low для дневок USDJPY, предложенных Д. Ивановым ([b]77.27%[/b] и [b]72.73%[/b] соответственно (параграф 2.4.5)), полученных с использованием [b]160[/b] подгоночных параметров на базе [b]347[/b] образцов и выделенные желтым цветом ячейки приведенной таблицы (High - [b]67.22%[/b] и Low – [b]67.10%[/b]), полученных на базе [b]3257[/b] дневок [u]без единого подгоночного параметра[/u], опираясь только на известный алгоритм точки разворота.

    Если данный пост будет интересен уважаемому форуму, то в следующий раз я постараюсь объяснить остальные ячейки таблицы.

    С уважением,
    Анатолий[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
     

    Вложения:

    1 человеку нравится это.
  2. Aalex

    Aalex Новичок

    мне интересно, жду продолжения.
    подозреваю, что в ячейках первых столбцов, где получились значения больше 67%, вкралась опечатка в формулах.
     
  3. askrotov

    askrotov Новичок

    Aalex, спасибо за интерес.

    Продолжим,

    Из приложенной к первому сообщению таблицы видно, что с повышением порядка численной разности (Score) для High (zuh), Low (zdl) или Close (zpc) (колонка Var) процент совпадения знака численной разности (High, Low, Close) и предсказанной на основании алгоритма PivotPoint растет. Например, для суточных котировок USDJPY High (zuh) 1: 67.94%, 2: 78.72%, 3: 88.05%, 4: 93.33% (последняя строчка в подгруппе 1440 таблицы). То есть, 4-ые численные разности

    d4RH=R1-4*H[i-1]+6*H[i-2]-4*H[i-3]+H[i-4] и d4H=H-4*H[i-1]+6*H[i-2]-4*H[i-3]+H[i-4]

    более чем в 90 случаев из 100 имеют один и тот же знак.

    Посмотрим, как это использовать на примере 2-ой численной разности (для простоты изложения):
    d2H=d1H-d1H[i-1]=H-2*H[i-1]+H[i-2] (High)
    d2L=d1L-d1L[i-1]=L-2*L[i-1]+L[i-2] (Low)
    d2C=d1C-d1C[i-1]=C-2*C[i-1]+C[i-2] (Close)
    d2RH=d1RH-d1H[i-1]=R1-2*H[i-1]+H[i-2]
    d2SL=d1SL-d1L[i-1]=S1-2*L[i-1]+L[i-2]
    d2PC=d1PC[i]-d1C[i-1]=PP[i]-2*C[i-1]+C[i-2]
    где

    d1H[i]=H[i]-H[i-1] (High), d1L[i]=L[i]-L[i-1] (Low) и d1C[i]=C[i]-C[i-1] (Close),

    где H[i],L[i],C[i] - значения High,Low,Close для i-го бара; H[i-1],L[i-1],C[i-1] - значения High, Low, Close предыдущего бара (i-1), а также разности

    d1RH[i]=R1[i]-H[i-1], d1SL[i]=S1[i]-L[i-1], d1PC[i]=PP[i]-C[i-1].

    Далее мы сравниваем знаки изменения d2H[i] и d2RH[i]. Если знаки совпадают, то z2RH[i]=1 ([b]profit[/b]); если не совпадают или d2H[i]=0, то z2RH[i]=-1 ([b]fail[/b]); если d2RH[i]=0, то z2RH[i]=0 ([b]empty[/b]) (аналогично для Low (z2SL[i]) и Close (z2PC[i])). Далее подсчитываем количество -1,0,1 и находим проценты как в первом сообщении и получаем в колонке [b]Var[/b] строчки zuh (High), zdl (Low), zpc (Close) для разных степеней численных разностей ([b]Score[/b]). В данном случае Score=2. Повторю - это проценты совпадения знаков именно 2-ой численной разности.

    [u]Далее тонкий момент[/u]: Я фильтрую историю закрытых котировок (i-1). Рассмотрим на примере High:

    Я выбираю моменты истории, когда выполняются [b]два[/b] условия ((d1H[i-1]>0) [b]и[/b] (d2RH[i]>0)), тогда определяю z1d2RH[i]=1 (предполагаемое [b]повышение[/b] High), [b]иначе[/b] два условия ((d1H[i-1]<0) [b]и[/b] (d2RH[i]<0)), тогда определяю z1d2RH[i]=-1 (предполагаемое [b]понижение[/b] High), в остальных случаях z1d2RH[i]=0 (нет предположений об изменении High). Точно также определяем предполагаемый знак изменения z1d2dl (Low), z1d2pc (Close) на основании предполагаемого знака 2-ой численной разности по данным величинам.

    Далее мы сравниваем знаки изменения d1H[i] и z1d2RH[i]. Если знаки совпадают, то p1d2RH[i]=1 ([b]profit[/b]); если не совпадают или d2H[i]=0, то p1d2RH[i]=-1 ([b]fail[/b]); если z1d2RH[i]=0, то p1d2RH[i]=0 ([b]empty[/b]) (аналогично для Low (p1d2SL[i]) и Close (p1d2PC[i])).

    Затем подсчитываем количество -1,1 и находим проценты и получаем в колонке [b]Var[/b] строчки puh (High), pdl (Low), ppc (Close) для разных степеней численных разностей ([b]Score[/b]). В данном случае Score=2. Здесь подсчитаны только случаи [b]profit[/b], [b]fail[/b] из предыдущего параграфа:

    High 2: puh=[b]profit[/b]/([b]profit[/b]+[b]fail[/b]), то есть, в подсчете не участвуют случаи [b]empty[/b] (неопределенность).

    В прикрепленной к этому сообщению таблице появились новые строчки:

    [b]Count[/b] - общее количество баров;
    [b]CN0[/b] - количество случаев за исключением случаев [b]empty[/b] в определении знака изменения High, Low, Close на один бар вперед;
    [b]PRC[/b]=CN0/Count - процент определения знака по данной методике
    [b]PR0P[/b]=profit/CN0 - процент правильного определения знака изменения High, Low, Close на фильтрованной базе.

    [u]Предварительные итоги[/u]: Даже знание знака изменения 2-ой численной разности восстанавливает знак изменения High, Low на один бар вперед с процентом, сопоставимым с результатами работы Д. Иванова (голубые ячейки) на [u]сопоставимой[/u] базе [b]416[/b] случаев (CN0) против [b]347[/b]. High: [b]79.33%[/b] против [b]77.27%[/b] и Low: [b]81.55% [/b]против[b] 72.73%[/b] на базе [b]412[/b] случаев.

    С уважением,
    Анатолий[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
     

    Вложения:

  4. askrotov

    askrotov Новичок

    А поставлю-ка я на этой ветке вот такой крест (рис.1)

    [sharedmedia=core:attachments:65527]

    , где
    темно-синяя линия - это прямая y=0.618*k, красная: y=-0.618*k,
    зеленая: y=-0.6814*k (от -100 до 0) и y=0.6817*k (от 0 до 100),
    желтая: y=0.6831*k (от -100 до 0) и y=-0.6817*k (от 0 до 100).

    0.618 - это коэффициент золотого сечения - просто контрольные линии (темно-синяя и красная), а зеленая и желтая - это огибающие серии кривых (рис.2).

    [sharedmedia=core:attachments:65528]

    Кривые - это последовательные конечные суммы и разности величин, модули которых прологарифмированы. Каждая кривая - это один бар допустим EURUSD Daily. Величина - это z=(Close-Open)/(High-Low) или z=0, если High=Low, где Open,High,Low,Close - это величины одного дневного бара EURUSD.

    Конечные суммы - это s[sup]k[/sup]z[sub]i[/sub]=(s[sup](k-1)[/sup]z[sub]i[/sub] + s[sup](k-1)[/sup]z[sub]i-1[/sub])/C, (k=1..100), где i - момент времени, k - номер конечной суммы, С=1 - константа, s[sup]1[/sup]z[sub]i[/sub]=(z[sub]i[/sub] + z[sub]i-1[/sub])/C.
    Конечные разности - это d[sup]k[/sup]z[sub]i[/sub]=(d[sup](k-1)[/sup]z[sub]i[/sub] - d[sup](k-1)[/sup]z[sub]i-1[/sub])/C, (k=1..100), где i - момент времени, k - номер конечной разности, С=1 - константа, d[sup]1[/sup]z[sub]i[/sub]=(z[sub]i[/sub] - z[sub]i-1[/sub])/C.
    (Так исторически сложилось у меня, что от 0 до -100 идут конечные суммы, а от 0 до 100 конечные разности)

    Если на эти конечные суммы и разности посмотреть в исходном виде, то мы получим рис.3, где ничего не видно.

    [sharedmedia=core:attachments:65529]

    Поэтому прологарифмируем конечные суммы (y(k)=sgn(s[sup]k[/sup]z[sub]i[/sub])*ln(abs(s[sup]k[/sup]z[sub]i[/sub])), k=-100..-1) (где sgn(x)=1, если х>0, sgn(x)=0, если х=0, sgn(x)=-1, если х<0; abs(x) - модуль х; ln(x) - натуральный логарифм от х) и разности (y(k)=sgn(d[sup]k[/sup]z[sub]i[/sub])*ln(abs(d[sup]k[/sup]z[sub]i[/sub])), k=1..100) и y(0)=sgn(z[sub]i[/sub])*ln(abs(z[sub]i[/sub])). Вот таким способом мы получили рис.2.

    Огибающие из рис.1,2 я построил по формулам:
    y[sub]жел[/sub](k)=-ln(MIN(abs(s[sup]k[/sup]z[sub]i[/sub]))), k=-100..-1, y[sub]жел[/sub](k)=-ln(MIN(abs(d[sup]k[/sup]z[sub]i[/sub]))), k=1..100, (желтая линия рис.1)
    y[sub]зел[/sub](k)=ln(MAX(abs(s[sup]k[/sup]z[sub]i[/sub]))), k=-100..-1, y[sub]зел[/sub](k)=ln(MAX(abs(d[sup]k[/sup]z[sub]i[/sub]))), k=1..100, (зеленая линия рис.1)
    где MIN(x[sub]i[/sub]) и MAX(x[sub]i[/sub]), функции минимума и максимума массива {x[sub]i[/sub]}, где i=1..600 (в данном случае, для иллюстрации, участвуют 600 баров EURUSD Daily)

    Если же мы в уравнениях для конечных сумм и разностей в качестве константы С выберем 2, то получим рис.4 без логарифмирования

    [sharedmedia=core:attachments:65530]


    У меня несколько вопросов:
    1. Кто-нибудь этим занимался? Если да - откликнитесь, пожалуйста, или киньте в меня ссылками.
    2. Что это за коэффициент B=0.68.. из начала этого поста? (абсолютная погрешность вычисления коэффициента линейной регрессии y=B*k для каждого из 4-х случаев составляет 0.0003, Коэффициент детерминированности R[sup]2[/sup]=0.99997). Две значащие цифры В=0.68.. воспроизводятся для разных валютных пар и разных периодов. Все вычисления делал в Excel.

    [sharedmedia=core:attachments:65531]

    Рис.5 - это начало координат рис.3,

    [sharedmedia=core:attachments:65532]

    Рис.6 - это начало координат рис.4.

    Еще раз повторю, каждая кривая - это от одного до 100 баров в зависимости от величины k (-100..100).


    Анатолий
     

    Вложения:

  5. grener

    grener Новичок

    Жосткие расчеты.... но на мой взгляд рынок трудно вообще матиматически расчитать, так как там много других факторов которые явно не учитываются в ваших расчетах
     
  6. Андрей Мавр

    Андрей Мавр Активный пользователь

    бррр, я такого вообще не понимаю и, наверное, не пойму. там высшая математика))
     
  7. Lesnikov

    Lesnikov Активный пользователь

    Это больше похоже на опционные стратегии,хотя они связаны напрямую с валютными опционами.
     
  8. San4o

    San4o Новичок

    Красиво. Я б сюды теорию вероятности ещё добавил, и готова пища для ума ^nyam-nyam^
     

Поделиться этой страницей