Albus
Albus личный блог
16 марта 2020, 19:49

Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.

--ВВЕДЕНИЕ--
Пост будет полезен только разработчикам алгоритмических стратегий. Здесь нет прорывных идей. На истории стратегия прибыльная, но опыт показывает, что эта прибыльность иллюзорна и не гарантирует успех в будущем. По любой стратегии можно найти комбинацию параметров, которая прибыльна на прошлых свечках. Но радоваться, что ты нашёл Грааль, рано. На будущих сделках эти параметры скорее всего будут убыточными.
Тем не менее, подгонка под исторические данные — штука интересная, поэтому пишу этот пост. В нём вы найдёте рабочий тестер для описанной стратегии, который можете использовать как захотите. 

---ОПИСАНИЕ СТРАТЕГИИ---
Назовём её «Поплавок», потому что это стратегия выныривания из зоны перепроданности.
1. Ждём, когда индикатор RSI сформирует двойное дно.
2. Оба дна должны быть ниже какого-то горизонтального порога по RSI, например 25.
3. Подъём (выныривание) выше этого порога мы считаем признаком разворота и покупаем.
4. Прибыль забираем, когда акция дорастёт до (к примеру) уровня 50 по RSI. Скрипт умеет подбирать и этот параметр. Часто наилучшим вариантом будет продавать при RSI = 70 или даже RSI = 80, то есть уже в состоянии сильной перекупленности. Но эту фразу не воспринимайте как рекомендательную, ведь все эти прогоны на истории ищут лучший вариант в прошлом, но это не гарантирует успеха в будущем.
Стоп лосс задаётся пользователем, например на уровне 1% от точки входа.
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
Важно: скрипт торгует виртуально на истории одной акцией (не путать с лотом!). Плечи не предусмотрены. 

---ПРО СКРИПТ---
Скрипт написан на двух языках программирования — Lua и Питон. У меня нет программистского образования, поэтому код не идеален. Но свою функцию он выполняет. Питон используется для того, чтобы скачать котировки с Финама. Их забирает скрипт, написанный на Луа, анализирует, находит лучшие варианты. Сделав это, скрипт нарисует в КВИКе сделки, заключённые по лучшим найденным параметрам. 
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
Весь процесс поиска наилучшей комбинации журналируется в специальных файлах. На каждую акцию заводится свой файл вида
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
туда записываются все полученные результаты.
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
Например, первая строчка читается так: 
период RSI=12,
горизонтальный порог перепроданности = 28,
прибыль забирается при RSI=50.
Это дало лося в размере -0.8174 процента годовых.
Эти данные легко копипастятся и забрасываются в эксель для анализа. 

---ПРИМЕР ИНТЕГРАЦИИ С ЭКСЕЛЕМ---
Допустим, вы сделали прогонку Газпрома (15-минутки) в поисках, какой период RSI лучший.
А именно:
-период RSI (rsi_period) меняется в интервале от 5 до 30
-горизонтальный порог RSI rsi_val (признак перепроданности) неподвижен на уровне 20 (он не меняется)
-акции продаются при RSI = 60 (tp = 60 и не меняется)
У вас получились такие строки:
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
То есть, вы изучали всего один параметр (rsi_period), а другие были неподвижны.
Этот список легко кидается в эксель через копи-паст. В экселе удаляете ненужные столбцы. Точку между дробной и целой частью (возможно) придётся заменить на запятую.
Огонь! В экселе строится приятный график:
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
График грустный: плюсовые исходы не велики. Ради такой доходности даже не хочется нагибаться. Эта фраза не ругает всю стратегию в целом, она лишь ругает исходы по данным комбинациям параметров.

---ЕЩЁ НЕМНОГО ПРО ИНТЕГРАЦИЮ С ЭКСЕЛЬ---
Торговля по лучшей из найденных комбинаций записывается в отдельный файл вида:
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
В нашем случае лучшим параметром оказался период RSI=21
Свечи прочёсывались слева направо, скрипт заключал виртуальные сделки на покупку и продажу.
Вот что он наколядовал по наилучшей комбинации параметров:
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
Это исходы сделок в рублях при торговле 1 акцией. Всего было 17 трейдов. Их тоже можно закинуть в эксель (мне приходится в экселе точку менять на запятую)
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.

---ЧТО ПИШЕТ РОБОТ В ОКНО СООБЩЕНИЙ КВИКА---

Запустив скрипт, в начале вы будете видеть нудноватый процесс скачивания свечек с Финама:
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
Затем начинается перебор разных комбинаций параметров в поисках лучшей. Во время поиска в КВИК выводятся такие сообщения:
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
Скрипт обычным брутфорсом гоняет параметры в цикле один за другим, и если видит, что с какой то комбинацией заработано больше денег, чем было ранее, то пишет в окошко сообщений КВИКа строчку типа
NewBest! SBER rsi_period=28 rsi=30 tp=80 money=106.06 tr=22 losses=19
Уточню, что rsi_period = 28 — это то, что мы пишем при настройке RSI вот здесь:
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
rsi = 30 — это горизонтальное значение RSI (критерий перепроданности)
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
tp = 80 — это значение RSI, при котором мы продадим акции 
money=106.06 — это сколько в рублях заработано
tr=22 — сколько заключено сделок
losses=19 — сколько из них было неудачных.
22 сделки заключено, из них 19 лосёвых — это признак того, что часто срабатывали стопы, но 3 прибыльные сделки вынесли результат в космос. Сами думайте, отфильтровывать такие сомнительные параметры или нет. Робот даёт возможность исключать исходы, где доля лосей превышает предельно допустимую. По умолчанию будет стоять критерий: "если убыточных сделок больше половины, значит этот исход отбраковываем".
Найдя лучшую комбинацию параметров, робот напишет:
GAZP best_res=5.12 year_%=0.4 rsi_per=21 rsi_val=20 rsi_tp=60
Это значит:
best_res=5.12 — результат в рублях
year_%=0.4 — доходность процентов годовых
rsi_per=21 — период индикатора RSI
rsi_val=20 — горизонтальный уровень RSI, который мы считаем критерием перепроданности (из-под него выныривает двойное дно)
rsi_tp=60 — при каком уровне RSI продаём ранее купленные акции

По лучшей комбинации вы увидите все заключённые сделки.
Они будут:
-выведены в КВИК, покуда хватит истории КВИКа. На звёздочку можно навести курсор и увидеть параметры сделки. У сделок, которые закрывают позицию, в конце выводится причина закрытия: стоп-лосс (sl), тейк профит (tp) или конец дня (end).
Важно:
-звёздочки попадают не точно на нужную свечку, а располагаются на 1 свечу левее, то есть слева от правильной.
-цена, на которой ставится звёздочка, чуть-чуть выше правильной.
На расчёты это не влияет, но если вы планируете вглядываться в эти звёздочки, это важно учитывать.
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.


Чтобы робот мог нанести на график эти звёздочки, нужно указать идентификатор в виде тикера:
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
-также сделки будут записаны в окне сообщений КВИКа вот так:
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
по чём вошли, по чём вышли, сколько заработали или потеряли.
Если сделок будут тысячи, и вы поймёте, что не хотите их видеть в окне сообщений, просто закомментируйте эту строчку:
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
Закомментировать — это означает превратить строку в комментарий через выставление двойного дефиса вот так:

было:
mm(y.stroka) --выводим сделку в окно сообщений КВИКа.
стало:
--mm(y.stroka) --выводим сделку в окно сообщений КВИКа.


По каждой бумаге робот выведет наилучшие для неё параметры, и сколько с ними удалось заработать.
ЛУЧШИЕ ИНДИВИДУАЛЬНЫЕ ПАРАМЕТРЫ:
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
Индивидуальные параметры очень разные. Глядя на них, нельзя найти никакой закономерности. А ведь акциями торгуют одни и те же люди/роботы. Это печалька. Значит мы занимаемся тупой подгонкой под результат. Поэтому я и написал в начале, что здесь нет грааля, а пост предназначен только для алготрейдеров.

---УНИВЕРСАЛЬНАЯ КОМБИНАЦИЯ---
Попробуем поискать универсальную «золотую» комбинацию, которая будет едина для торговли всеми акциями.
Такая комбинация тоже ищется скриптом и выводится в окошко сообщений:
---УНИВЕРСАЛЬНЫЕ ПАРАМЕТРЫ---
Проценты здесь не годовые, а общие за всю прогонку.
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
Золотые параметры отвечают на вопрос, «Если для всех акций использовать одни и те же параметры, то какие параметры будут лучшими?» При этом по отдельным акциям золотые параметры могут давать убытки. Главное, чтобы общий результат был самым прибыльным. При поиске золотой комбинации нет отсева по критерию "слишком много лосёвых сделок, значит эту комбинацию отвергаем", поиск рассматривает все исходы.

Мне кажется, что искать нужно именно единую для всех акций комбинацию параметров, а поиск индивидуальных параметров для каждой бумаги — путь в никуда. 

---ЧТО В АРХИВЕ?---

В архиве лежат:
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
-папка tmp_files техническая. Через неё скрипт на Луа общается со скриптом на Питоне.
-в папке zapis_rezultatov лежат файлы с результатами прогонов. Их удобно забрасывать в Эксель и анализировать. 
-файл _Start_poplavok.lua для вас главный. Его нужно открыть в КВИКе и запустить. В этом же файле — пользовательские настройки, которые можно и нужно менять.
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
Остальные файлы можно не открывать. Они интересны только программистам, которые захотят поковыряться в моём коде. Я снабдил код подробными комментариями.
-в файле finam_parser.lua лежит функция для загрузки и обработки свечек с Финама
-RSI.lua — код индикатора RSI. Я его скачал как есть с сайта разработчиков КВИКа: https://arqatech.com/upload/iblock/398/INDICATORS.zip
-service_functions.lua библиотека служебных функций на Луа типа округления и записи данных в файл.
-virtual_trading.lua — сердце робота. Вся торговая логика здесь.
-Finam_Big_Base.py  — скрипт на Питоне. Его вызывает Луа-скрипт, чтобы получить с Финама циферки, под которыми там лежат акции и другие инструменты. В результате его работы в файле IDs.lua из папки tmp_files сформируется строчка типа:
tickers_IDs={['ALRS']=81820,['AFLT']=29,['VTBR']=19043,['GAZP']=16842,['GMKN']=795,['LKOH']=8,['MTSS']=15523,['MGNT']=17086,['MOEX']=152798,['NLMK']=17046,['NVTK']=17370,['ROSN']=17273,['RTKM']=7,['HYDR']=20266,['SBER']=3,['SBERP']=23,['CHMF']=16136,['SNGS']=4,['SNGSP']=13,['TATN']=825,['TRNFP']=1012,['FEES']=20509,}
-Finam_parser.py — скрипт на Питоне, который качает свечи с Финама и записывает их в файл quotes.txt

---ПОЛЬЗОВАТЕЛЬСКИЕ ПАРАМЕТРЫ---
Пользовательские параметры задаются в самом начале файла _Start_poplavok.lua
Их можно менять.
ticker_list — перечень акций.
start_year  — с какого года качать котировки.
first_good_year[«какой-то тикер»] — первый год с нормальной ликвидностью по этой акции. Более ранние не качаем.
sl — стоп-лосс в процентах
dolya_losey  — если доля лосей больше этого значения, этот исход отбраковывается.
comiss_spot — брокерская и биржевая комиссия вместе. 
time_frame  — задаём таймфрейм.
end_day_close --закрываться ли в конце дня на мелких таймфреймах (младше часовика).
Также пользователь задаёт, с какого по какое значение прочёсывать каждый отдельный параметр:
start_rsi_period — ищем наилучший период RSI. С какого значения начинать поиск?
end_rsi_period — ищем наилучший период RSI. По какое значение проводить поиск?

start_rsi
— ищем наилучший порог RSI (перепроданность). С какого значения начинать поиск?
end_rsi — ищем наилучший порог RSI (перепроданность). По какое значение проводить поиск?

start_tp
— ищем, на каком уровне RSI лучше всего выходить. С какого значения начинать поиск?
end_tp — ищем, на каком уровне RSI лучше всего выходить. По какое значение проводить поиск?
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
Если русские буквы превратятся в кракозябры, выставьте кодировку Windows-1251

---ТЕХНИЧЕСКИЕ ДЕТАЛИ---
У вас должен быть установлен: 
-терминал КВИК. 
-Питон 3-й версии и выше. Качается с сайта https://www.python.org/
При установке Питона важно поставить птичку Add Python 3.8 to PATH.

Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
Иначе у вас не сработает строка на языке Луа в файле _Start_poplavok.lua:
os.execute("python.exe "..execute_string1)
Луа не поймёт, где у вас лежит Питон.
Если вы всё же столкнулись с этой проблемой (Луа не видит ваш Питон) её можно решить так: прописать полный путь к файлу python.exe:
os.execute("C:\\InstallPython\\python.exe "..execute_string1)
У вас python.exe будет лежать в какой-то другой папке, я просто привожу пример. Бэкслэши обязательно должны быть двойные: \\
Тогда будет работать и без птички возле Add Python to PATH.

В окно сообщений КВИКа выводится много полезной информации, поэтому оно должно быть открыто:
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.

Я кодю на Луа в блокноте Notepad++. Он красиво подсвечивает синтаксис, и в целом удобен.

---СКАЧАТЬ СКРИПТ---

yadi.sk/d/zVPrSyP8qJ28jA
Распакуйте архив где угодно. У вас появится папка poplavok с файлами, и действуйте дальше по инструкции. Напомню, что файл, который надо запускать в КВИКе, называется _Start_poplavok.lua

Ещё раз напомню: здесь нет грааля. Это промежуточная стадия поиска. Пользуйтесь скриптом, перестраивайте его под себя, пишите советы что можно допилить в стратегии или в алгоритме поиска лучших параметров.

---ПРИЛОЖЕНИЕ---
Результат прогона стратегии на 21 акции российского рынка. 

Тайм-фрейм — 15-минутки
Стоп-лосс = 1% от точки входа
dolya_losey = 0.5 (лосёвых сделок не больше половины)

start_rsi_period = 7 --ищем наилучший период RSI. С какого значения начинать поиск?
end_rsi_period = 20 --ищем наилучший период RSI. По какое значение проводить поиск?

start_rsi=7 --ищем наилучший порог RSI (перепроданность). С какого значения начинать поиск?
end_rsi=25--ищем наилучший порог RSI (перепроданность). По какое значение проводить поиск?

start_tp=50 --ищем, на каком уровне RSI лучше всего выходить. С какого значения начинать поиск?
end_tp=70 --ищем, на каком уровне RSI лучше всего выходить. По какое значение проводить поиск?
Сделка в конце дня не закрывается.
Скрипт обсчитывал все варианты ~50 минут, поэтому запасайтесь терпением.
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
Примеры сделок:
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
Скрипт нашёл лучшие индивидуальные параметры для каждой акции. Рост-падение доходности (грубо говоря, эквити), записалось в файлы с названием типа res_VTBR_equity.txt
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
В файлы записались результаты отдельных сделок (в процентах)
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
Запихиваем в эксель и видим плохое. Комбинация конечно прибыльная и дала наилучший результат, но кривая доходности не стабильна, и в конце завалилась вниз.
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
По СБЕРу вообще ужас. Почти всё время комбинация была убыточной, но последняя красивая сделка вывела торговлю в плюс, в результате комбинация стала самой лучшей:
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
Вот эта сделка на графике:
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
Поэтому к полученным результатам надо относиться критически. Скрипт ещё пилить и пилить. Поэтому я и приглашаю к обсуждению умных комментаторов.
А вот к Аэрофлоту претензий нет. Найденная комбинация дала прекрасную эквити:
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
А именно: AFLT rsi_per=8 rsi_val=23 tp=70 res=43.4 year_%=16.1
Восхитительно. Может быть торговать этими параметрами на всех акциях? Попробуем.
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
Увы, если гонять эту комбинацию на всех бумагах, депозит будет слит. Если суммировать процентный результат по всем сделкам (трейд за трейдом), получится убыток за всё время торговли -258,58%. Так что эта комбинация была хороша только для Аэрофлота.  

---ЕЩЁ ОДИН ПРОГОН НА ИСТОРИИ---
Чуть изменю одно условие. Все параметры прежние, кроме одного. Раньше я отбраковывал исходы, где лосёвых сделок было больше 50%. Теперь их не должно быть больше 33%
dolya_losey = 0.33
Итог сильно изменился
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
По Сберу и ВТБ уже не удаётся найти хороших комбинаций параметров. Суммарная доходность (если сложить доходность по каждой бумаге) уменьшилась вдвое до 49,1% (было 101,2% при dolya_losey = 0.5). Но доверие к этим параметрам возросло. Основная замеченная тенденция: сделок стало меньше, но выросло их качество.
Стратегия Поплавок. Робот-тестер на Луа и Питоне с описанием.
Буду продолжать анализ. Может, что-то и получится. Закручивать гайки, отбраковывать шлак — дело полезное.

---ЗАКЛЮЧЕНИЕ---
Согласно комментариям готов дорабатывать эту стратегию и доделывать тестер. Истина где-то рядом… но ещё не найдена.

--
Друг,
если тебе понравился этот пост, поставь ему плюс, добавь в избранное и оставь коммент!
Мой блог на Яндексе про Питон.

24 Комментария
  • pessimist
    16 марта 2020, 20:02
    Плюс поставил, в избранное добавил.
    Как минимум, за труды 
    • vito333
      17 марта 2020, 04:22
      pessimist, аналогично!

      Albus (Игорь), да это целая алго-диссертация! :)

      думаю, намного проще провести все тесты в том же ТСЛаб например

      идея, колнечно, простая, но вполне в итоге может оказаться рабочей

      такие посты гораздо лучше, чем о сотнях новых шиномонтажных заводов, уж извините )))
  • Пафос Респектыч
    16 марта 2020, 20:02
    Вот ведь не ленивый человек!
  • П М
    16 марта 2020, 20:41
    можно наверное кастомный индикатор сделать на lua, тогда свечки сами будут в код приходить  без финама и питона
  • s_mike@rambler.ru
    16 марта 2020, 20:42
    Google: amibroker, wealth-lab

    Есть и другие, эти лучшие. Не нужно крапать шедевры на коленке, все имеется в промышленном виде
  • ezomm
    16 марта 2020, 20:44
    стоп лосс зависит от тайма .1 день тайм 1.2%… 2часа  =0.6%… 1час =0.4%
    15 мин =0.2%.Либо просто средний размах свечи тайма.
  • ICWiener
    16 марта 2020, 20:47
    Выскажу такое мнение — что это и не алготрейдинг вовсе:
    1. Работа по «индикатору RSI»
    2. Подгонка праметров
    3. Кривопизднутое воплощение
  • Lord Barrington
    16 марта 2020, 21:12
    Спасибо, а где исходный код скачать?
  • Врач-бондиатОр
    16 марта 2020, 23:19
    а зачем гнать котировки из питона, когда их можно получать из квика?
    за работу над роботом лайк
      • Врач-бондиатОр
        17 марта 2020, 07:40
        Albus (Игорь Китаев), это, кстати, правильно, я это не учел. Как файл питона для скачки котировок называется? Finam_Big_Base.py?
          • Врач-бондиатОр
            17 марта 2020, 08:48
            Albus (Игорь Китаев), а какой скрипт питона делает txt файл с котировками?
  • Nepall
    17 марта 2020, 09:10
    где можно научится писать роботов на LUA?
  • Петрович
    17 марта 2020, 11:13
    Ни хрена не понимаю, но когда-нить разберусь) В сохры. Спасибо.
  • Beach Bunny
    17 марта 2020, 11:37
    Для тестирования стратегий на Python, есть готовые бесплатные библиотеки,
    например gbeced.github.io/pyalgotrade/
    Вы тратите время на ерунду.
  • Ilya
    17 марта 2020, 14:27
    любой индикатор работает при переподгонке. надо просто найти нужный период истории и нужные параметры. 
  • VladMih
    17 марта 2020, 15:10
    Неплохо знаю RSI и мне не повредил бы «лишний» робот.
    Если хотите посотрудничать, стучитесь в Скайп.
  • djannell
    17 марта 2020, 15:21
    Спасибо за интересную статью и приличный труд. Однозначно + !

  • Paulmarko
    19 марта 2020, 22:35
    Что-то не хватает. Нужен \\tmp_files\\tmp.txt. в файле — done

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

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