Блог им. kurd |Алготрейдинг. Об относительных приращениях

По мотивам напечатанного «Алготрейдинг. Как правильно склеивать фьючерсы»
smart-lab.ru/blog/1071687.php
Там, помимо прочего, упомянуто, что для обучения торговой системы лучше представлять историю котировок не абсолютными приращениями, а относительными.
Ну хотя бы для того, чтобы торговая система реагировала одинаково на изменение цены в 1%, независимо от текущего уровня в 1000 или в 2000 пунктов. Смысл не в доходе, а в доходности.
И предложены два варианта представления относительных приращений.
1) X[i]/X[i-1] — 1 и
2) ln (X[i]/X[i-1])

При отклонениях X[i] от X[i-1] в плюс или минус не более 10% различие этих вариантов в пределах 1%.
Алготрейдинг. Об относительных приращениях
Но при более значительных отклонениях X логарифмическое представление существенно меньше линейного.
Насколько оправдано логарифмическое преуменьшение?

Может где-то в других случаях логарифмическое представление имеет глубокий математический смысл.
Но в данном случае это ведёт к тому, что торговая система будет придавать большим отклонениям цены в минус другое значение, нежели таким же отклонениям в плюс. А ведь относительные приращения используются как раз для того, чтобы избежать подобных различий в работе торговой системы.

( Читать дальше )

Блог им. kurd |Алготрейдинг. Как правильно склеивать фьючерсы и зачем


Цены фьючерсов свободны от нерегулярностей, искажений, вносимых пред-дивидендным подъёмом и после-дивидендным провалом. Утренние гэпы у фьючерсов тоже меньше тех акций, что торгуются только в дневные сессии. Да и затраты на фьючерс, особенно в шорте, гораздо меньше акции. Так что для краткосрочной игры фьючерсы лучше подходят.

Вопрос склеивания возникает из неравенства цены фьючерса в день его исполнения (экспирации) с ценой следующей серии того же фьючерса на ту же дату. Эта разница возникает за счёт бэквордации или контанго, что гораздо чаще.
Теоретически, цена фьючерса в момент его исполнения должна сравняться с ценой базового актива.

В Quik'е и на разных сайтах склеивают истории предыдущих серий с последующими посредством плавного сращивания цены предыдущего фьючерса с последующим на коротком участке перед экспирацией. Таким образом, искажаются приращения цен на этом временном интервале.

Для выявления «закономерности» движения цен главное значение имеют именно их приращения. Чтобы избежать искажения приращений, надо просто сдвинуть все цены предыдущего фьючерса на величину разрыва его цены в момент экспирации с ценой последующей серии на тот же момент. Для склеивания нескольких серий, этот сдвиг надо повторять с каждым предыдущим фьючерсом, начиная от последнего в истории котировок.

( Читать дальше )

Блог им. kurd |Алготрейдинг с обезличенными сделками. С чего начать

Обезличенные сделки в Quik'е содержат информацию о направлении сделок — Buy и Sell. Теоретически, это даёт дополнительные возможности прогноза движения цены. На практике дело сразу упирается в громадный объём этих тиковых данных и недоступность их во всех широко известных источниках.
Запрос «smart-lab Обезличенные сделки» в Яндексе даёт подборку
smart-lab.ru/blog/583818.php?ysclid=l5rmqam0or156053926
smart-lab.ru/tag/%D0%BE%D0%B1%D0%B5%D0%B7%D0%BB%D0%B8%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D1%81%D0%B4%D0%B5%D0%BB%D0%BA%D0%B8/?ysclid=l5rmr8efkg459101185
Разговоры сводятся к откачивание данных из Quik'а с помощью QLua и манипуляциям в Excel. Подход беспомощный и бесперспективный.

Во-первых, держать Quik включённым целый день только для получения данных по обезличенным сделкам впрок, для дальнейшего анализа — испытание терпения, немногим по силам. Ведь для реалистичности тестирования нужны данные за много дней.
Во-вторых,  объёмы данных за один торговый день — сотни тысяч записей, до полутора миллиона и более. Никакой Excel или Python не справятся. Выход в использовании источника с готовыми данными и эффективного средства программирования вроде C++, C# или Java.

( Читать дальше )

Блог им. kurd |"Акела промахнулся" или "Мальчик Buybuy" слишком гениален, чтобы кто-то его мог понять?

По следам статей
«Рынок — это просто! Часть 3» 03 июня 2022, 01:12 «ВПК России — лучший»
smart-lab.ru/blog/808353.php
«грааль от BuyBuy» 05 июня 2022, 05:17 «Sergey Pavlov»
smart-lab.ru/blog/808971.php

Резюмируем сжато:
Цена актива в момент t — это x(t), приращение цены — d(t)=x(t)-x(t-1).
Индикатор id(t)=A*d(t-1)+B*d(t-2)
Покупка, когда id(t)>=0, продажа, когда id(t)<0.

Чтобы индикатор работал идеально на 2-х предыдущих барах, д.б.
d(t-1)=A*d(t-2)+B*d(t-3)
d(t-2)=A*d(t-3)+B*d(t-4)

Решение с точностью до множителя существует всегда:
A=d(t-1)*d(t-4)-d(t-2)*d(t-3)
B=d(t-2)*d(t-2)-d(t-1)*d(t-3)

Все это работает на таймфрейме 1 min и ниже.

И добавим однозначности:
Если считать, что d(t) = d(t-0) = x(t-0) — x(t-1),
то d(t-1) = x(t-1) — x(t-2) и т.д.

Скрипт C# на WealthLab
protected override void Execute()	{
    var d1 = (Close >> 1) - (Close >> 2);
    var d2 = (Close >> 2) - (Close >> 3);
    var d3 = (Close >> 3) - (Close >> 4);
    var d4 = (Close >> 4) - (Close >> 5);
    for (int i = 5; i < Bars.Count-2; i++) {
      double A = d1[i]*d4[i] - d2[i]*d3[i];
      double B = d2[i]*d2[i] - d1[i]*d3[i];
      double id = A*d1[i] + B*d2[i];
      int posDir = (! IsLastPositionActive) ? 0
        : LastPosition.PositionType == PositionType.Long ? 1 : -1;  
      if (id >= 0 && posDir != 1) {
        if (posDir == -1)
          ExitAtClose (i, LastPosition);
        BuyAtClose (i);
      } else if (id < 0 && posDir != -1) {
        if (posDir == 1)
          ExitAtClose (i, LastPosition);
        ShortAtClose (i);
      }
    } // for (int i
  } // Execute()
даёт результаты на минутках на 68 днях от 10:00 до 18:44 для сделок без комиссии и проскальзывания

( Читать дальше )

Блог им. kurd |История доходности вложений в биржу с 1995

За начало взял сентябрь 1995, т.к. для индекса РТС Финам не даёт более ранних дат. Но для долгосрочника этот индекс — отстой. Так что его смотреть не будем.
Для сравнения принята цена Close на 31.01.2022.
Начнём с недельных графиков SnP500. Правда, его Финам выдал только с февраля 2001.
На верхнем графике для каждой недели подсчитаны доходности покупки по Open в процентах относительно Close последнего бара. Для последних 365 дней доходность не считается. Последний год на жёлтом фоне. Средняя доходность без поледнего года показана красной горизонталью. На нижнем графике синяя горизонталь показывает Close последнего бара.
История доходности вложений в биржу с 1995
Таблица построена за тот же период.
StrategyName Growth
SANDP-500_010216_220131dayly Weekly
ini     1326.6100
fin     4546.5400
growth     3.4272
bars         1091
years     20.9699
year%      6.0498
mean%     12.3421
nn;HiIdx;HiMax     ; HiDate    ; LoIdx;LoMin     ; LoDate    ;Days ;Drawdown ;Pct>=20
 0;    0;   1326.61; 17.02.2001;    86;    768.63; 11.10.2002;  601;   557.98;  42.06
 1;  344;   1576.03; 13.10.2007;   417;    667.04; 07.03.2009;  511;   908.99;  57.68
 2;  530;   1370.58; 06.05.2011;   552;   1075.09; 07.10.2011;  154;   295.49;  21.56
 3;  915;   2940.91; 21.09.2018;   929;   2346.58; 28.12.2018;   98;   594.33;  20.21
 4;  989;   3393.52; 21.02.2020;   994;   2192.07; 27.03.2020;   35;  1201.45;  35.40
Самая долгая просадка
 0;    0;   1326.61; 17.02.2001;    86;    768.63; 11.10.2002;  601;   557.98;  42.06
Наибольшая абсолютная
 4;  989;   3393.52; 21.02.2020;   994;   2192.07; 27.03.2020;   35;  1201.45;  35.40
Наибольшая относительная
 1;  344;   1576.03; 13.10.2007;   417;    667.04; 07.03.2009;  511;   908.99;  57.68
Результаты по NASDAQ

( Читать дальше )

Блог им. kurd |"Усердие всё превозмогает. Иногда даже рассудок" (Козьма Прутков). О выявлении крупных сделок

В источнике smart-lab.ru/blog/760357.php код QLua и картинка из Quik'а.
Возможно, смысл в том, чтобы отловить сделки крупных игроков. Но склеивание в одну «крупную сделку» всех обезличенных сделок одного направления, пришедших в одну миллисекунду или несколько подряд, вряд ли служит цели. Это заявки разных игроков. Ведь уловка китов, прибегающих к «Айсберг-заявкам», в том и состоит, чтобы расщепить свою крупную заявку во времени.
Так что если кто хочет схватить такого кита за руку, может попробовать выявлять последовательности тиков одного объёма и направления через равные интервалы времени.
Но!
1) Точно ли  все «Айсберг-заявки» формируются равными объёмами и через равные интервалы времени? Это было бы довольно глупо.
2) Даже если такая глупость существует, к любому тику с заявкой кита может прилепиться много заявок мелкоты. Это сильно затруднит выявление регулярных «Айсберг-заявок».
3) Самые киты входят-выходят на рынке не одной «Айсберг-заявкой» и даже не в один день! А то и ещё и через день — по обстановке. Шансов опознать именно их заявки среди прочих — ноль.
4) В самом ли деле так важно знать сделки крупных игроков? Крупняк никогда не проигрывает?

NB Почему эти вопросы не пришли в голову никому из заинтересованных комментаторов?
Включая торговый терминал, не забудьте включить голову.
  • обсудить на форуме:
  • Quik Lua

Блог им. kurd |Какой риск в шорте недельных стрэддлов "30% годовых без рисков". Тестируем на истории 495 недель

Народ последние дни воодушевился открытием Грааля smart-lab.ru/blog/754088.php
Давайте разберёмся. Ставим эксперимент.

У меня в хозяйстве скачана с Финама минутная история 36 квартальных фьючерсов Si с 2013 по 2021 год. Разделяю кварталы на недели с четверга по четверг и в начале каждой недели в 19:01 регистрирую шорт кола и пута на центральном (ближайшем к цене фьючерса) страйке, а в конце этой же недели в 18:44 регистрирую откуп опционов.
Теоретические цены-премии опционов определяю по Блэку-Шоулзу. Волатильность в начале недели принимаю 15%, в конце — 20%. Проскальзывание на шорт принимаю 1% от теорцены. Комиссию на куплю+продажу одного опциона принимаю 8 руб. Это вполне оптимистично.
Логика видна в главном цикле скрипта WealthLab'а.
for (int i = i0; i < weeks.Count; ++i) {
  int idxIni = IndexOf (weeks[i][0]-1, entryTime);
  int idxFin = IndexOf (weeks[i][1], exitTime);
  double strike = mwu.RoundTo (Open[idxIni], strikeStep);
  double dura = (Date[idxFin] - Date[idxIni]).TotalDays;
  double calIni = OptPrice ('C', Open[idxIni], strike, dura, volaIni);
  double putIni = OptPrice ('P', Open[idxIni], strike, dura, volaIni);
  double calFin = OptPrice ('C', Close[idxFin], strike, 1e-6, volaFin);
  double putFin = OptPrice ('P', Close[idxFin], strike, 1e-6, volaFin);
  double win = (calIni+putIni) * (1-slpg) - (calFin+putFin) - 2*fee;
  PrintDebug (String.Format (fmt, i, Date[idxFin].ToShortDateString()
    ,calIni, putIni, calFin, putFin, win));
} // for (int i = i0
Вот выдача за первый квартал

( Читать дальше )

Блог им. kurd |Правда ли что биржа США так хороша? Оценка в рублях за 24 года

Залезаем на Финам и скачиваем историю индекса Дау-Джонса тикер D&J-IND
www.finam.ru/profile/mirovye-indeksy/d-j-ind/export/?market=6&em=91&token=&code=DJI&apply=0&df=13&mf=8&yf=2021&from=13.09.2021&dt=13&mt=8&yt=2021&to=13.09.2021&p=7&f=DJI_210913_210913&e=.txt&cn=DJI&dtf=1&tmf=1&MSOR=1&mstime=on&mstimever=1&sep=1&sep2=1&datf=1&at=1
Рост от 7651 до 35516.6 — в 4.697 раза.

Затем скачиваем «Курс рубля. USDRUB курс ЦБ» тикер USDCB
www.finam.ru/profile/kurs-rublya/usd-from-cb/export/?market=41&em=82485&token=03AGdBq26IJk6CztMjcUSh-HSEeCSnKqkyT4jKDa6_TRojZmdiXBAWUFTnHAjf8IoYvsI9W7MBFa2OzcIS9In75k55ReIhxIdMMWP4JNHDi1Io4Ry7qY0F4ZUO9H62M-P3dA_P0Noo2Zyx14Gq9uLNKVBye6PEbGMi9nTdOVnQLLdikrqG0YiS8ywMR6__e0Isc5QyyxOfni7PGoqibw4o1QLNDV-DxbQrN9ZN-qswsG5U5-wSlKYLlI96ZkPKU7ZbHi92dV9pw5CEaQIqJaYP2NlhMmXtwiUpVkXFcSrI_3DS_TxZwovaitoqSCo-K_7wXhpFwj-mM4tDcFJH6ld0rHV6QoCbVZZv_nRVYpEEN3t34by4IPO3LoWBoACzBlLUTxN99HLEL6K5eegZNdJ3yVztZmFLzxKIi9Tm9UD6W3-7QVDQGFMK1kXrfHJRQeul6omvIQm9TR-B&code=USDCB&apply=0&df=1&mf=8&yf=1997&from=01.09.1997&dt=13&mt=7&yt=2021&to=13.08.2021&p=8&f=USDCB_970901_210813&e=.csv&cn=USDCB&dtf=1&tmf=1&MSOR=0&mstime=on&mstimever=1&sep=3&sep2=1&datf=1&at=1
Рост от 5.832 (деноминировано) до 73.47 руб/длр — в 12.60 раза.
Перемножаем и получаем рост Дау-Джонса в рублях за 24 года в 58.19 раза.

Мой Quik показывает индекс ММВБ IMOEX на недельном тайм-фрейме от 100 в начале сентября 1997 до 3856.76 на 15.09.2021 — в 38.57 раза.

( Читать дальше )
  • обсудить на форуме:
  • QUIK

Блог им. kurd |Нужны ли тиковые данные для тестирования торговой стратегии?

Из общих соображений максимальной реалистичности тестирования ответ должен быть положительный. Но есть несколько «но».
Первое. Я не знаю примеров торговых стратегий на тиках. Только на свечах-барах — от минуток до дневок. Поэтому, сгрузив с qscalp.ru тики фьючерса на индекс РТС, я конвертировал их в секундные бары. И получил потрясающую доходность на простейшем алгоритме. Лонг по Close каждой чёрной свечи и шорт по Close каждой белой свечи. Увы, этот выигрыш виден только при нулевой комиссии. С комиссией выигрыш превращается в проигрыш.
Так что реагировать на движение цены не то что на тиках, но на секундах — пустой номер.

Второе. Если кто-то  для большей реалистичности захочет тестировать торговую стратегию не по ценам сделок, но по ценам очереди заявок, он может сгрузить эти тиковые данные с qscalp.ru
Но для ликвидных бумаг вроде фьючерса на индекс РТС это будет ловлей блох, т.к. спред очереди заявок таких бумаг равен шагу цены. Т.е. учесть этот спред можно, задав величину проскальзывания сделки.

( Читать дальше )

....все тэги
UPDONW
Новый дизайн