Так уж сложилось, что начинал я свои исследования рынков с попытки построить HFT робот еще 10 лет назад.  Сейчас даже забавно  вспоминать.

До настоящего времени я использую тайм в 5 минут.

Но вот наступила пора нового HFT робота строительства.

Исходные данные – тиковая история сделок акции Сбербанка обычка за 2011 и 2012  годы.

Очередь заявок пока не используется.

В 2011 году всего 1 миллион 358 тысяч сделок.

В 2012 году к настоящему моменту 220 тысяч сделок.

Робот как и я сам, постоянно делает все наоборот, когда все покупают, робот продает, а когда все продают – он покупает.

Такая стратегия называется антитрендовая.

Робот работает без плеч и не реинвестирует полученную прибыль в дальнейшую торговлю, а тратит ее на собственные нужды.

Для начала, робот не имеет каких-либо настраиваемых параметров.

Вот что получилось в результате.

Так как показать график,  на котором 1.3 миллиона сделок не представляется возможным, то привожу лишь фрагмент.

Таблицы результатов:

2011

……………………………..  All trades                   Long trades              Short trades

Net Profit %                                         660.72 %                    319.48 %                    341.24 %
Exposure %                                        32.21 %                      16.03 %                      16.18 %
Annual Return %                                 715.05 %                    340.43 %                    364.08 %


All trades                                            52611                         26305 (50.00 %)        26306 (50.00 %)


Winners                                              31131 (59.17 %)       15512 (29.48 %)        15619 (29.69 %)
Avg. Profit %                                      0.09 %                        0.09 %                         0.09 %
Max. Consecutive                              30                                16                                17
# bars in largest win                          63                                56                                63


Losers                                                21480 (40.83 %)       10793 (20.51 %)        10687 (20.31 %)
Avg. Loss %                                       -0.09 %                       -0.09 %                       -0.10 %
Max. Consecutive                              13                                16                                10
# bars in largest loss                         30                                36                                30


Max. trade % drawdown                    -3.48 %                       -2.98 %                       -3.48 %
Max. system % drawdown                 -4.04 %                       -4.58 %                       -3.86 %
Recovery Factor                                 30.55                           22.44                           27.15
Profit Factor                                        1.33                             1.32                             1.33
Payoff Ratio                                        0.91                             0.92                             0.91
Risk-Reward Ratio                             37.86                           37.13                           34.02
Ulcer Index                                          0.64                             0.87                             0.68
Sharpe Ratio of trades                      17.86                           17.38                           18.33
K-Ratio                                                0.0091                        0.0089                         0.0082

Январь 2012
………………………………. All trades                  Long trades             Short trades
Net Profit %                                            73.24 %                     42.74 %                     30.50 %
Exposure %                                           74.20 %                     37.05 %                     37.16 %
Net Risk Adjusted Return %                 98.70 %                     115.37 %                   82.08 %


All trades                                               4696                           2348 (50.00 %)         2348 (50.00 %)


Winners                                                 2936 (62.52 %)         1472 (31.35 %)         1464 (31.18 %)
Avg. Profit %                                         0.07 %                       0.07 %                        0.06 %
Max. Consecutive                                 19                               16                               16
# bars in largest win                             183                             183                             37


Losers                                                   1760 (37.48 %)         876 (18.65 %)           884 (18.82 %)
Avg. Loss %                                          -0.07 %                      -0.06 %                      -0.07 %
Avg. Bars Held                                     28.75                          28.69                          28.80
Max. Consecutive                                 8                                 8                                  6
# bars in largest loss                            31                               69                               31


Max. trade % drawdown                       -1.64 %                      -1.04 %                      -1.64 %
Max. system % drawdown                    -1.70 %                      -1.57 %                      -2.26 %
Recovery Factor                                    26.60                          24.42                          10.53
Profit Factor                                           1.62                            1.79                            1.48
Payoff Ratio                                           0.97                            1.06                            0.89
Standard Error                                       1822.40                     1156.31                     1284.21
Risk-Reward Ratio                                525.94                       463.52                        329.00
Ulcer Index                                             0.48                            0.34                            0.66
Sharpe Ratio of trades                         35.24                          41.83                          28.88
K-Ratio                                                   0.0334                       0.0294                        0.0209

Февраль 2012
………………………………….  All trades                  Long trades             Short trades
Net Profit %                                            45.46 %                     27.78 %                     17.68 %
Exposure %                                           82.01 %                     41.11 %                     40.91 %
Net Risk Adjusted Return %                 55.42 %                     67.57 %                     43.22 %


All trades                                               3757                           1879 (50.01 %)         1878 (49.99 %)
Avg. Bars Held                                     27.04                          27.16                          26.92


Winners                                                 2370 (63.08 %)         1197 (31.86 %)         1173 (31.22 %)
Avg. Profit %                                         0.05 %                       0.06 %                        0.05 %
Avg. Bars Held                                     25.41                          25.78                          25.03
Max. Consecutive                                 15                               16                               12
# bars in largest win                             126                             126                             67


Losers                                                   1387 (36.92 %)         682 (18.15 %)           705 (18.76 %)
Avg. Loss %                                          -0.06 %                      -0.06 %                      -0.06 %
Max. Consecutive                                 8                                 5                                  6
# bars in largest loss                            15                               10                               15


Max. trade % drawdown                       -1.43 %                      -1.43 %                      -1.34 %
Max. system % drawdown                    -1.94 %                      -1.74 %                      -1.66 %
Recovery Factor                                    19.78                          13.20                          8.92
Profit Factor                                           1.55                            1.72                            1.40
Payoff Ratio                                           0.90                            0.98                            0.84
Risk-Reward Ratio                                553.47                       501.41                        428.24
Ulcer Index                                             0.49                            0.40                            0.49
Sharpe Ratio of trades                         29.88                          36.01                          24.03
K-Ratio                                                   0.0322                       0.0292                        0.0249
 

This entry was posted on Понедельник, 27 февраля, 2012 at 00:48 and is filed under QUIK и Amibroker, Интеллект, торговые роботы (МТС). You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.

30 comments so far

genom
 1 

Здравствуйте, Николай!
Поздравляю с исполнением мечты!
Я так понял, что это тест истории, но уже очень не плохо — стабильный профит присутствует. Пугает только отношение среднее W/L и как оно покажет себя на реальных торгах. Принципы в роботе такие же как и в роботе на пятиминутном фрейме?

27 февраля, 2012 at 12:46
Kamynin
 2 

Добрый день!
Это пока проба пера. Результат на истории.
Вдохновляет то, что нет никакой оптимизации.

27 февраля, 2012 at 14:52
SeaShaman
 3 

«Робот работает без плеч и не реинвестирует полученную прибыль в дальнейшую торговлю, а тратит ее на собственные нужды.»
А какие основные нужды у робота? )

27 февраля, 2012 at 14:20
Kamynin
 4 

Добрый день!
Он мне не рассказывает

27 февраля, 2012 at 14:51
genom
 5 

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

27 февраля, 2012 at 15:05
SeaShaman
 6 

Рисковано! ) А «опасные» нужды блокируются на низком уровне?

27 февраля, 2012 at 16:04
Mr. Foggs
 7 

Впечатляет, что сказать! Поздравляю! Особенно впечатляет и то, что опыты начались 10 лет назад. Небыстрый путь, я скажу…
P.S. Николай, а ваш робот, работающий на 5-минутках — совершает сделки внутри свечи или по ее окончанию? Где-то вы писали, что решение принимается за 5 сек. до окончания свечи.

27 февраля, 2012 at 23:03
Kamynin
 8 

Добрый день!
1)Первую книгу о предсказании рынков я прочитал еще при социализме, когда обучал машины мыслить.
Так, что можно считать, что началось это более 20 лет назад.
2) в окне в 10 секунд до закрытия свечи формируется торговый сигнал.

27 февраля, 2012 at 23:27
Ford
 9 

а в чем смысл вашего алгоритма?

29 февраля, 2012 at 09:52
Kamynin
 10 

Не понял вопрос.

29 февраля, 2012 at 13:47
Ford
 11 

Перефразирую.

Что используете для определения точек для входа, выхода? Ключей от квартиры мне не надо) просто расскажите что анализируете.

29 февраля, 2012 at 14:09
Kamynin
 12 

Добрый день!
Использую уровни сопротивления и поддержки. На графике все видно.

29 февраля, 2012 at 19:04
genom
 13 

Здравствуйте, Николай!
Спасибо за ответ в соседней теме. Раз тут зашел разговор про алгоритм HFT робота, попробую угадать — это, судя по графику, уровни сопротивления и поддержки? Возможно это осреднение тех и других, а точки входа и выхода — это отношение цены в момент времени к значениям осреднения — возможно обычное пересечение. Что то такое точно здесь есть. Мне кажется здесь не через чур должен быть заложен алгоритм принятия решения.
Николай! Не нашел в тексте упоминания про комиссию и проскальзывание. Они есть тут?

29 февраля, 2012 at 16:35
Kamynin
 14 

Добрый день!
Реализован простейший алгоритм принятия решения ( 3 оператора if) Осреднения нет.
Проскальзывания нет так как считаем что заявки лимитированные выставляются по уровням поддержки и сопротивления.
комиссия 0.001% ( предполагается либо фьючерс, либо маркет-мейкер)

29 февраля, 2012 at 19:04
Alexander
 15 

Добрый Вечер!

Посмотрел график. Навеeрное всё же параметр для оптимизации есть — это уровень, при котором цена должна отойти от экстремума. Или время за которое она не пробивает экстремум? И что это за зелёные и синие чёрточки на самом графике? Хотя. возможно я не так понял стратегию….

29 февраля, 2012 at 22:56
Kamynin
 16 

ДОбрый день!
черточки — это уровни поддержки и сопротивления.
Про остальное:
Если Вы думаете что что-то есть, а Вам говорят, что этого нет — продолжайте думать.

1 марта, 2012 at 08:27
FVV76
 17 

Здравствуйте Николай ! Вы часто упоминаете уровни поддержки и сопротивления, в Инете много вариаций на тему их расчета начиная с: расчет на основе Hi Low Close предыдущего дня + вариации с Open сегодня, кто-то использует Фракталы, а у Вас собственный алгоритм их расчета или на основе общеизвестных формул ? Подскажите пожалуйста, где рыть …

1 марта, 2012 at 09:35
Kamynin
 18 

Добрый день!
Вот мое определение:
Уровни поддержки и сопротивления — это уровни локальных экстремумов.

1 марта, 2012 at 12:06
Alexander
 19 

Добрый день, Николай!

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

И эти чёрточки — уровни поддержки и сопротивления, почему они синие и зелёные и в чём разница между ними.

Благодарю за ответ, возможно вопрос первый не очень точно написал.

1 марта, 2012 at 17:37
Kamynin
 20 

Добрый вечер,Alexander!
1) Посмотрите в справочнике по математике определение экстремума.
Там не никакой постоянной и загадочной константы.
2) черточки — это уровни поддержки с сопротивления.
Названия разные, поэтому и цвет у них разный.

1 марта, 2012 at 19:05
Alexander
 21 

Посмотрел конечно:

http://ru.wikipedia.org/wiki/%D0%AD%D0%BA%D1%81%D1%82%D1%80%D0%B5%D0%BC%D1%83%D0%BC

Здесь хорошо написано. Та все равно нам нужно определить хоть как назовите — окрестность, или отклонение от максимума, но некотрую величину для условия pricePrev (до priceMin) > priceMin && priceCurrent (после priceMin) > priceMin. Тогда priceMin будет экстремумом (поддержкой в данном случае. Вопрос — на сколько больше? на любую сколь угодно малую величину? Если для сбербанка, то это 1 копейка. Или на другую величину? Учитываю сколь угодно малую окрестность (это из определения по справочнику) — получается 1 копейка и мы фиксируем все- все экстремумы, либо берём только более существенные провалы. Скажем на 2 копейки? А провалы на 1 копейку тогда игнорируем. Это уже касательно работы роботы, а не математического определения экстремума как такового. Вот в чём вопрос.

1 марта, 2012 at 20:05
Kamynin
 22 

Добрый вечер,Alexander!
Если Вы используете некоторую величину, то это Ваша стратегия.
Я не использую.

1 марта, 2012 at 20:53
Alexander
 23 

Я почему об этом спрашиваю — потому что сам получил плохой результат, когда делалробот по стакану. Там тоже после провала на один шаг цены делалась покупка, после пика на один шаг цены продажа. Прибыль на тестовых данных огромна. да вот незадача — комиссия должна быть 0.0001 (это верно), но ещё и скорость выставления заявки астрономической. Увы не то, ни другое нереализуемо для меня по крайней мере. Более того, ещё проблемы исполнения заявки и появления этого факта в QUIK — самое медлительное действо. Поэтому и спрашиваю. Прошу прощения за надоедливость.

1 марта, 2012 at 20:30
Kamynin
 24 

Добрый вечер,Alexander!
Все правильно.
Поэтому HFT -Это очень дорогое удовольствие.

1 марта, 2012 at 20:56
Alexander
 25 

Меня не столь HFT волнует, а экстремумы. Любые локальные экстремумы, или только, так назовём, более глобальные экстремумы (ну скажем на когда минимум на 2 или 3 копейки?). или же рассматриваются все пики в падины подряд не зависимо от глубины. Ведь Ваша фраза «Я не использую» говорит о том, что используются все возможные экстремумы. Это же наверное касается и робота по 5-минутным свечкам? Если это так, то условием экстремума (рассмотрим минимум) будет low(prev) > low(extr) и low(current) > low(ext). При этом может подряд встретиться несколько значений low(extr). Я правильно понимаю? Пока я придумал использовать такие штуки в качестве стопа, немного отступив вниз. На четверть от разницы между верхним экстремумом и нижним. Это защитный стоп на случай, если всё зависнет и перестанет работать.

Спасибо.

1 марта, 2012 at 21:45
Kamynin
 26 

Доброй ночи,Alexander!
Правильно понимаете,все экстремумы используются,но каждый из них содержит различную информацию.
Я не использую абсолютные значения цен.
Основа моей стратегии заключается в том, что у робота стопов нет.
Стоп — это сделка закрывающая существующую позицию или переворачивающая ее.
Но это делает алгоритм робота.
Если Вы еще и стопы ставите, то получается масло масленное.
Вы пишите алгоритм торговли и еще алгоритм антиторговли.
Стопы нужны при торговле руками, чтобы не прозевать разворота рынка.
Роботу стопы не нужны, он следит за рынком всегда.

1 марта, 2012 at 23:46
Alexander
 27 

Здраствуйте Николай,

Вроде бы с экстремумами разобрались, но
«Чем дальше в лес, тем больше дров….»
«Я не использую абсолютный значения цен». А какие? В процентном приращении? Что это даёт?
«Каждый содержит различную информацию». Какую? Идля какого использования?
Что касается стопа — я писал — «Защитный стоп». На случай, если робот по какой-то причине перестанет работать. Очень просто — кошка провод выдернула. Сам стоп в алгоритм как таковой не входит.

Извините, что Вас пытаю. У меня нет цели скопировать Ваш робот, я хочу его понять, чтобы сделать свой. Всё равно я всё следаю как обычно по-своему. Вот сегодня уже DDE сервер закончил, осталость причёску программе сделать. Всего-то два листика печатного текста, а разговоров…. Кто программировал под windows 20 лет назад, для тех это не проблема, у кого же забита голова всякими там С шаре, java и прочим интернетом им конечно трудно понять, что вся windows это один цикл Message Loop (в рамках одного Thread, оговорюсь, а то закритикуют).

Спасибо,
Медунов А.Л.

2 марта, 2012 at 14:04
Kamynin
 28 

Добрый день,Alexander!
1) Ответы на Ваши вопросы, прямо или косвенно, есть на сайте.
Так как я использую Fibo, то это процентное отношение цен.
2) DDE сервер это не только прием таблиц, но и работа с ними из внешних приложений.
Поэтому первичная обработка таблиц (Колбек функция и открытие и закрытие канала)
это примерно 10% сервера доступа к данным из КВИК.
Когда закончите DDE сервер, хотел бы узнать полученные скоростные характеристики обработки данных.
Успехов

2 марта, 2012 at 14:53
Alexander
 29 

Добрый день Николай!

Сервер DDE работает очень быстро. Да и чего ему медленно работать? По мене поступления сообщения от QUIK программа перехватывает эти данные и записывает в массив структур. Для сделок структура такая:

struct AlmTradesData
{
long m_nOrderNo;
time_t m_nTime;
double m_nPrice;
unsigned long m_nVolume;
char m_chDirection;
};

Ну а заполнение структуры вообще «копейки»

/* Порядковый номер для проверки */
nType = *((WORD*)(p));
p += 4;
pTrade->m_nOrderNo = (long) *((double*)(p));
p += 8;

/* Дата и время */
p += 5;
strncpy(strBuffer, (LPCTSTR) p , 20);
strBuffer[10] = »;
strBuffer[19] = »;
fTM.tm_mday = atoi(strBuffer);
fTM.tm_mon = atoi(strBuffer+3)-1;
fTM.tm_year = atoi(strBuffer+6)-1900;
fTM.tm_hour = atoi(strBuffer+11);
fTM.tm_min = atoi(strBuffer+14);
fTM.tm_sec = atoi(strBuffer+17);
pTrade->m_nTime = mktime(&fTM);
p += 19;

/* Код бумаги (пока одна) */
nLen = *p;
// fprintf(file, «%.*s;», nLen, (LPCTSTR) ++p);
// strncpy(str2, (LPCTSTR) ++p, nLen);
p += nLen + 1;

/* Купля или продажа */
pTrade->m_chDirection = *(p+2);
if (pTrade->m_chDirection == ‘ó’)
pTrade->m_chDirection = ‘B’;
if (pTrade->m_chDirection == ‘ð’)
pTrade->m_chDirection = ‘S’;
p += (((int)(*p))+5);

/* Цена и объём */
pTrade->m_nPrice = *((double*)(p));
pTrade->m_nVolume = (unsigned long) *((double*)(p+8));
p += 16;

++nTradesReceivedCount;

OrderNo оставил для проверки, чтобы ничего не терялось. Каждый следующий на единичку больше.

С остальными таблицами то же самое. Кстати, на тиковом графике время рисуется с миллисекундами, а при экспорте в DDE я что-то миллисекунд не наблюдаю. Вы этим не интересовались? Оно вообще-то не очень-то и надо, но тем не меннее.

Хочу пояснить, что кроме как с QUIK, ни с каками другими приложениями эта программа, частью которой является сервер DDE взаимодействовать не собирается. Она получает данные из QUIK, она же их призвана анализировать, она же будет оправлять заявки в QUIK. Она же сохраняет данные в БД или просто файлы, как хотите так и назовите. Она же экспортирует мне некоторые данные в текстовые файлы для того, чтобы поиграться с ними скажем в wealth-lab, но это уже процесс разработки робота, а не сам робот. Поскольку код написан на C и в результате имее исполняемый непосредственно процессором компьютрера модуль (а не модуль, играемый некоторой средой, которая в свою очередь только играется процессором), быстродействие тут мгновенное. 49481 сделок за 24 миллисекунды проходит. Это ещё я их на диск писал, правда без flush. Замерил.

Что касается Fibo. Вы берёте стандарные уровни или подгоняете по факту? Я как-то этим занимался и заметил, что в некоторых случаях их можно, так скажем подкорректировать….

Спасибо. Хороших Выходных.

2 марта, 2012 at 18:46
Alexander
 30 

Перечитал, стыдно стало, расхвалил себя. 44000 сделок это имеется конечно экпортируется из таблицы сделок QUIK в DDE сервер, а тоо подумают, что я с такой скоростью на бирже торгую, посадят же ведь.

2 марта, 2012 at 18:51