--ВВЕДЕНИЕ--
Пост будет полезен только разработчикам алгоритмических стратегий. Здесь нет прорывных идей. На истории стратегия прибыльная, но опыт показывает, что эта прибыльность иллюзорна и не гарантирует успех в будущем. По любой стратегии можно найти комбинацию параметров, которая прибыльна на прошлых свечках. Но радоваться, что ты нашёл Грааль, рано. На будущих сделках эти параметры скорее всего будут убыточными.
Тем не менее, подгонка под исторические данные — штука интересная, поэтому пишу этот пост. В нём вы найдёте рабочий тестер для описанной стратегии, который можете использовать как захотите.
---ОПИСАНИЕ СТРАТЕГИИ---
Назовём её «Поплавок», потому что это стратегия выныривания из зоны перепроданности.
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). Но доверие к этим параметрам возросло. Основная замеченная тенденция: сделок стало меньше, но выросло их качество.
Буду продолжать анализ. Может, что-то и получится. Закручивать гайки, отбраковывать шлак — дело полезное.
---ЗАКЛЮЧЕНИЕ---
Согласно комментариям готов дорабатывать эту стратегию и доделывать тестер. Истина где-то рядом… но ещё не найдена.
--
Друг,
если тебе понравился этот пост, поставь ему плюс, добавь в избранное и оставь коммент!
Мой блог на Яндексе про Питон.
Как минимум, за труды
Albus (Игорь), да это целая алго-диссертация! :)
думаю, намного проще провести все тесты в том же ТСЛаб например
идея, колнечно, простая, но вполне в итоге может оказаться рабочей
такие посты гораздо лучше, чем о сотнях новых шиномонтажных заводов, уж извините )))
Есть и другие, эти лучшие. Не нужно крапать шедевры на коленке, все имеется в промышленном виде
15 мин =0.2%.Либо просто средний размах свечи тайма.
1. Работа по «индикатору RSI»
2. Подгонка праметров
3. Кривопизднутое воплощение
---СКАЧАТЬ СКРИПТ---
yadi.sk/d/zVPrSyP8qJ28jA
за работу над роботом лайк
www.finam.ru/cache/icharts/icharts.js
-Finam_parser.py — скрипт на Питоне, который качает свечи с Финама и записывает их в файл quotes.txt
например gbeced.github.io/pyalgotrade/
Вы тратите время на ерунду.
Если хотите посотрудничать, стучитесь в Скайп.