Блог им. 3Qu

Прогнозирование котировок.

    • 30 ноября 2022, 00:04
    • |
    • 3Qu
  • Еще

Сижу как-то раз за рюмкой чая (это было за год, два или три до моего прихода на Smart-Lab} и приходит мне в голову мысль — а почему бы не попробовать прогнозировать котировки.
Прогноз, естественно, на ТФ 1м, который я использую. Время прогноза пусть будет — 5 минут — вполне достаточное для моих сделок, а недостаточно, так прогноз можно и повторить на следующие 5 минут. Архивы котировок по фьючерсам SBRF и GAZR тоже имеются, минимум за год-два за последние 3 месяца перед экспирацией — хватит и на отладку и на проверку.
Все есть, только как реализовать прогнозирование? — ни одной мысли.
Собственно, не особо мне это было и нужно, рабочая система у меня уже была и меня она вполне устраивала, но мысль о прогнозировании засела, и я время от времени ее думал.
Ничего сколь-нибудь конструктивного в голову не приходило, и было решено для прогнозирования использовать нейросеть, тем более, незадолго до того я немного занимался машинным обучением и нейросетями в том числе.
От использования каких-либо предикторов сразу отказался. Плюс 2-3 слоя к нейросети, и если в данных есть какие-либо взаимосвязи, НС сама внутри себя построит нужные ей предикторы. В общем, подаем на НС поток цен 15-20 отсчетов Vc={C(t0-20),C(t0-19),...C(t0)}, нормируем их к динам диапазону НС — Vcn={c(t0-20),c(t0-19,… c(t0-1), 0} — c(t0) у нас всегда = 0, и пусть НС сама мучается с прогнозированием и поиском c(t0+5). И еще, у всякого метода есть область применимости, потому нельзя учить чему попало. Для этого из обучающей и проверочных последовательностей по возможности исключаем области истории, где прогнозирование невозможно. Иначе получим нечто такое.

Прогнозирование котировок.
По Х — прогноз значения цены С(t0+5),
по У — реальное значение цены С(t0+5)
Т.е., не получили ничего

Для реализации прогнозирования была выбрана распространенная и не самая сложная библиотека Python scikit-learn, обычный многослойный перцептрон, где-то ~150 нейронов. Обучаем на истории 3 месяца до экспирации фьючерса SBRF или GAZR — это где-то не более 15 минут, проверяем на тех же фьючерсах с другой датой экспирации. Получаем прогноз нормированного значения цены через 5 минут — c(t0+5).

 Прогнозирование котировок.
По Х — прогноз нормированного значения цены c(t0+5),
по У — реальное нормированное значение цены с(t0+5)

Прогноз в области нуля для сделок нас не интересует. Прогноз же в области отличной от нуля вполне удовлетворителен и может быть использован для открытия и закрытия сделок. В ходе сделки прогноз может быть повторен для дальнейшего продолжение сделки.
Что же мы имеем. Мы видим, что для прогноза на 5 мин уже вполне достаточно жалких 150 нейронов. У таракана около 1 млн. нейронов.
Оказывается, для прогнозирования котировок и трейдинга мозгов нужно много меньше чем у таракана. Как-то даже обидно. Хотя, кому как.

★5
61 комментарий
Полная шняга

Данные для графика 2 в студию, плз. 2 инструмента, 1 линейный прогноз и 1 временной интервал.

С уважением
avatar
Мальчик buybuy, коли «шняга», то и данные вам ни к чему.))
avatar
Бектест стратегии на истории сделок с учетом комиссии и проскальзывания на выборке за пределами обучаемой будет?
avatar
dnmsk ☮,  не делал на этом стратегии.
avatar
Прогнозирование никогда не будет работать. Можете и поколдовать ради разнообразия.

Вчера прогнал свою ТС ку — как часы, риски вижу заранее, понятен потенциал движения, знаю где ждать и какой сценарий. Соотношение риск к профиту можно брать 1 к 5, 1 к 20 и даже выше — нет предела.

Вам CashKing просто так писал что ли? Я вот его читал внимательно, все по делу.

smart-lab.ru/mobile/topic/690717/

smart-lab.ru/r.php?u=https%3A%2F%2Fm.lenta.ru%2Fnews%2F2021%2F04%2F15%2Fphysics%2Famp%2F&s=1491763882
avatar
Vladimir N., мне без разницы, что писал CashKing. Как выяснилось, он у меня в ЧС, куда я отправляю всех идиотов (оценочное суждение).)
Вы, кстати, противоречите сами себе.)
avatar
3Qu, вот и зря, бред он не писал, как раз) 
avatar
3Qu, кстати, дайте ссылку почитать) любопытно)
avatar
А где-то можно посмотреть как закодено? Можно без конкретных параметров.
avatar
darkcorp, можно и код посмотреть. Вот здесь.
smart-lab.ru/blog/723802.php
Получите первую картинку.
avatar
3Qu, Спасибо. 
Почему решили использовать лог.регрессию, а не линейную?
avatar
darkcorp, не оч понял вопрос. НС по определению нелинейна.
Если по входам — убрать выбросы.
avatar
3Qu, я к тому, что в модели увидел использование сигмоида, а эта функция применяется для классификации, а не прогнозирования. Могу ошибаться.
avatar
darkcorp, сигмоид везде применяется. Если в НС не применять, то двух слоев достаточно, и огород городить не надо.) Без сигмоида НС превращается в обычный линейный фильтр.
avatar
3Qu, Спасибо, я еще только учусь. На курсе по МЛ по теме НС изучали пока только классификацию изображений, а с временными рядами я работать еще не пробовал, хотя желание есть.
avatar
darkcorp, если хотите что почитать, то Хайкин Нейронные сети. В инете есть.
Книга старая, возможно и устаревшая. Хотя, основы не стареют.
Хорошо и понятно написана.
avatar
Кто нибудь делал сравнение прогноза и реальное его исполнение для нейронных сетей? Обратная связь результата и прогноза насколько точна? Не является ли нейронная сеть просто модным словом? Что нибудь типа такого анализа habr.com/ru/post/671142/ но для нейросетей?
Вопрос 2: насколько быстро модели обучаются? Для режима реального времени подойдет ли?
Какие конкретно модели нейросетей на Ваш взгляд лучше подойдут для алготрейдинга?
Константин Чащегоров, 15:02 если хочешь выжать всё возможное в реальном времени — рули на «C++ AMP. Построение массивно параллельных программ с помощью Microsoft Visual C++», «C++ AMP. Accelerated Massive Parallelism with Microsost Visual C++». На мощный графический процессор GPU. Из Quik'а связь через Lua C API.
avatar
Rostislav Kudryashov, Мне нравится 1С. Общий смысл:
Там есть так называемая 3х звенная архитектура. Если коротко:
Есть сервер БД: это либо бесплатный PostgreeSQL  либо платный Microsoft SQL. Операции в нем делает так называемый сервер предприятия 1С 8. Суть его работы: он читает предварительно подготовленный код (назовем это псевдокод) который выполняют тригеры БД. Сервер 1С запускает по 1 процессу на каждое ядро имеющегося ПК/сервера. Соотвественно каждый из этих процессов асинхронно делает все сам с БД. Я так понимаю на С++ все это придется писать самому.
Так что если кто то хочет выжать все из квика то смысл примерно такой:
1 Устанавливаем в качестве сервера БД Microsoft SQL 
2 Делаем несколько регламентных заданий, каждое из которых дергает либо 1 инструмент из ODBC либо несколько.
Я так понимаю быстрее чем тригеры MS SQL никто ничего пока не придумал. С++ это клиентский интерфейс писать и файловые базы
Только вот происходят ли на нашем рынке такие активные движения цен? Есть ли смысл так мучать систему бесполезными расчетами

Уточнение: 1С написан на с++. Соответственно все что в нем есть и все что он делает как тригеры для сервера БД это тоже как если взять другой компилятор С++. Допустим Вы до этого писали на компиляторе от Майкрософт а взяли от Борланд (если такая фирма еще есть). ТОлько назовите этот компилятор 1С

Еще уточнение:
Можно в квике сделать несколько таблиц в каждой из которых по 1 инструменту и каждая выводит в свой ODBC источник. Тогда уж точно выжать все получится.
Константин Чащегоров, 15:26 ты не понял! На GPU многие тысячи нитей-потоков.
avatar
Rostislav Kudryashov, GPU это что то типа возможности писать стоя.
www.anekdot.ru/id/363956/
Лично мое мнение ( сугубо частное)
Константин Чащегоров, 15:33 «Каждый имеет право на своё мнение». Но реальность — одна.
У тебя это, скорее, не мнение, а «не знаю и знать не хочу»…
avatar
Rostislav Kudryashov, У меня это скорее простой расчет: если есть сервер БД, то он возьмет помаксимому все возможности пк/сервера. Соответственно если в ПК есть GPU. то сервер БД выжмет все из того что он может Разработчики сервера БД об этом постоянно думают. А если я сам буду писать это параллелизм на С++ то жизни не хватит.
Константин Чащегоров, 15:43 ха-ха
если в ПК есть GPU. то сервер БД выжмет все
достойно занесения в анналы
avatar
Rostislav Kudryashov, russianblogs.com/article/27471086602/
Подробно не гуглил вот первая же ссылка
Константин Чащегоров, 15:54 абсурдно надстраивать таблицы БД над барами Quik'а и общаться с сервером БД через язык SQL.  Хранимые процедуры не спасут.
avatar
Rostislav Kudryashov, Ну не знаю. Когда мне впервые понадобилось выбрать из всех инструментов в квике только какие то по определенному условию, то я не смог поставить никакого фильтра. Например не смог отобрать все, которые выросли за последнюю неделю.
Так как я программист 1С то соответственно каждый кулик свое болото хвалит
Динамический список :
v8.1c.ru/platforma/dinamicheskiy-spisok/
Система компоновки данных
v8.1c.ru/platforma/sistema-komponovki-dannykh/
Сервер 1С Аналитика
analitica.ru/

Константин Чащегоров, 16:34 ха-ха ещё раз. Ты начал с вопроса о вычислениях в реальном времени. Ты представляешь, что такое, обучение нейросети? И в реальном времени.
Если у тебя есть примеры в 1С — полный вперёд!

Не уверен, что 1С сможет даже строить регрессию по тикам в 0.001 сек, хотя бы в 0.1 сек. Принимая и возвращая данные в Quik — бог весть каким каналом.
Это уже задача для индикатора — его надо перерисовывать чаще, чем раз в минуту.
avatar
Rostislav Kudryashov, Почему то мне кажется что в пределах секунды или даже минуты не происходит таких колебаний, на который можно покрыть хотя бы комиссию брокера. Какой смысл следить за тиками если Вы работаете через QUIK.
Как будто есть чей то робот который щедро раздает всем по выгодным ценам волатильность
Константин Чащегоров, Дополнение. Если честно я вообще не понимаю зачем стремиться к скорости выставления заявок. Допустим в стакане уже есть заявки по цене 100, 101, 102, 103 и 110. При чем 110 это наша заявка.
С како бы скоростью чей либо робот ни выставлял заявки наша заявка в стакане уже есть. Если наступает момент когда в стакане только она то она  исполнится. 
Возможно я не прав но если например биржа обрабатывает стакан со временем в наносекунды а поступают заявки новые в микросекундах то все равно рано или поздно проскользнет на бирже запрос к БД биржи что типа получить все что в стакане на текущую наносекунду. (Т.е. скорость поступления заявок наверняка меньше, чем скорость их обработки биржей. Особенно в последние полгода)
И вообще наверняка большинство роботов выставляют не рыночные а лимитные заявки. Поэтому скорость вообще не важна. Пока не появится удовлетворяющая встречная лимитная заявка стакан вообще не сдвинется
Константин Чащегоров, 18:34 если в Quik'е хочешь следить за многодневной историей бумаги — заведи диаграмму с её графиком. QLua справится с фильтрацией и чем угодно.
Но если захочешь отследить ВСЕ бумаги хотя бы только MOEX, — Quik забуксует с таким множеством графиков.
Тебе нужно какое-то интернет-приложение, запрашивающее данные напрямую с биржи. По RSS или не знаю, как там ещё.
avatar
Rostislav Kudryashov, На данный момент мониторю 3500 инструментов.
40 из них в режиме «3-4 раза в минуту»
остальные в режиме 1 раз в 5-8 минут.
Это у меня 2- звенная архитектура сейчас
В 3-звенной все это ускоряется в разы.
(в августе mail.ru закрыл аренду серверов в облаке поэтому перешел на двухвенку на своем ноуте не самой большой мощности). Как только биржа оживет вернусь в 3 звенку. 
Данные принимает и выдает QUIK от СбербанкБрокер
Rostislav Kudryashov, ну, почему же? У меня в ТС вообще бессерверный SQLite. При соответствующих настройках, время доступа на чтение почти как к памяти.
avatar
3Qu, 16:59 вот кстати! В SQLite есть хранимые процедуры? И если есть, какие команды они исполняют? Только SQL или что-то ещё?

PS обращаться к БД для сохранения и обработки коротенькой последовательности чисел, то же самое, что просить Путина починить кран на кухне.
Пусть даже не коротенькой, но без никаких реляционных связей. Что тут делать БД!?
avatar
Rostislav Kudryashov, есть — реализуются через API — С/С++ или Python.
Там много чего еще есть.
sqlite.org/docs.html
Можно также на C/С++ писать, если есть желание.
avatar
3Qu, 17:42 вообще-то все серии из истории котировок у меня в csv-файлах. Самую длинную историю в минутках на многие месяцы или в сотни мегабайт можно загрузить и преобразовать в числа в памяти за секунды. Если читать текст в память не по строкам, а сразу весь файл.
Так что «База данных» у меня — папки-каталоги с текстовыми файлами. Не залезая в СУБД, могу преобразовать, разделить, соединить любые файлы.
Всё как на ладони. И эти же файлы с разделителями ";" Excel читает как родные — так я настроил Windows.
avatar
Rostislav Kudryashov, SQLite быстрее файлов даже в стандартной конфигурации. При своих настройках pragma много быстрее.
Все держу в SQLite, в том числе, используется для работы ТС.

Нашел у себя на СЛ.
avatar
3Qu, ы не понял! После 1-5-секундной загрузки в память история котировок — плоский массив С++. В крайнем случае — vector STL. Доступ к его «барам» — со скоростью света. Какая там тебе «быстрая» СУБД.
Но помимо скорости — «не умножай излишне сущности».
avatar
Rostislav Kudryashov, и че делать с плоским массивом или векторами? Искать перебором?
Делаем БД SQLite в оперативной памяти (есть такая опция) и работаем запросами.
Ах,, да, еще многопользовательский доступ к массивам-векторам надо организовать, мьютексы и пр. хрень — этого добра и так есть. В БД это все уже есть.
avatar
3Qu, 18:27 ну не надо так… Ускорение поиска в БД — по индексам.
А я когда загружаю текстовый файл в память — строю по ходу индекс начала каждого дня. Даты упорядочены — бинарный поиск.
А много-потоковый доступ к истории котировок — только по чтению. Какие мьютексы!?
avatar
Rostislav Kudryashov, у меня многопоточный асинхронный режим — один пишет, несколько могут читать. Если массив-вектор -  уже нужны мьютексы, чтобы читатели не мешали писать и наоборот.
От части этой работы БД избавляет. Может несколько теряется быстродействие, но большая экономия работы и моего времени…
avatar
Rostislav Kudryashov, параллелизм — эт хорошо, но ГПУ абсолютно не нужен. Даж небольшой код Луа и тормознутость поставки данных из Квик через Луа задавят все быстродействие.
avatar
3Qu, 15:26 эт-ты брось. Named Pipes дают очень хорошую скорость, а  Files Mapped to Memory могут быть ещё лучше.
avatar
Rostislav Kudryashov, не дают, но дают лишнюю работу.
Макс скорость дает Луа С API, и после преобразования данных уход в другие потоки.
avatar
3Qu, 15:44 в том-то и фокус, что на CPU «других потоков» в сотни раз меньше, чем на GPU.
А если не хочешь вычислять асинхнонно — никто не мешает, повиси в синхроне в main() функции Lua-скрипта.
avatar
Rostislav Kudryashov, речь о задержках в самой системе Квик — Луа — С++. Далее задержки можно не учитывать. ГПУ от задержек типа Квик — С++ вас никак не избавит. А это основные задержки, остальное — дробя.
avatar
3Qu, 15:56 QLua легко и без задержех регистрирует события с частотой 0.001 сек. А чтобы раз минуту плюхнуть через Lua C API в C-DLL данные за предшествующие 15-20 минутных баров для прогноза следующей 5-минутки  — какие задержки!?
Пусть даже не 15-20 баров,  а хоть 15-20 сотен или тысяч — без разницы. Но вообще-то каждую минуту нужно передать только один новый бар.
Git-компилятор в Lua разгоняется до скорости native C уже на второй итерации.
avatar
Rostislav Kudryashov, У меня в ТС много чего передается, и я че-то отвлекся и перешел к системным вопросам.

Да, согласен. Даже 20 мин не надо, достаточно передать 1 мин, остальные уже там.
avatar
Rostislav Kudryashov, 
А если не хочешь вычислять асинхнонно — никто не мешает, повиси в синхроне в main() функции Lua-скрипта.
Собственно, в основном так и делается.
avatar
Константин Чащегоров, с прогнозом у НС все ОК, но есть ли смысл применять их в реале — эт не знаю, не применял. В ТС можно добиться примерно аналогичных результатов более простыми методами, обычной аналитикой.
avatar
Полная шняга, на истории кажется что работает, а чуть график вправо проедет — оказывается там уже другая модель нужна 
Пафос Респектыч, абсолютно тоже самое можно сказать про любую ТС.))
Перевожу ваши слова на русский — с рынком можно и нужно завязывать.
Для многих это самое правильное решение 
avatar

3Qu, нет, не про любую, но про предложенный вами подход — не просто можно, а нужно. Он изначально мертворожденный )

А завязывать с рынком не нужно, играйтесь, кто запрещает-то?

Он изначально мертворожденный )
С чего вы так решили? Вы специалист по машинному обучению?
Кстати, почти год на рынке не играю. Догадайтесь почему? Нет, не проиграл.)
avatar
шляпу какую то нарисовал, кому это из здешних нужно то? петрушку свою тут понаписывал епт… лучше в кабак проплати местным, чтобы посидели уважаемые с икрой, шашлычком и вискариком… тебе потом и скажут по итогу мероприятия как косить баблишко… а не этой все хурмой маятся…
Это что вы такое выкинули из первой выборки где на графике кружок, что привело к такой линии на втором графике??
avatar
Replikant_mih, по возможности выкинули из анализа участки истории, где прогнозирование, по нашему мнению, невозможно. Вроде, в топике это написано.
avatar
3Qu, Нуу, написано, конечно). Просто это драматически изменило ситуацию, вот и хочется понять по каким признаком эти «где прогнозирование, по нашему мнению, невозможно.» участки определяются).
avatar
Replikant_mih, естественно, все ориентировано на реал-тайм в дальнейшем, но дальше это не пошло за ненадобностью.
Сами алгоритмы, извините, без комментариев. В принципе, пара фильтров и обработка их данных.
avatar
3Qu, Секрет, понял). Странно, что не пошло, с такой линией на графике. Вообще она выглядит нереалистично, если честно, слишком граально).
avatar
Replikant_mih, не не пошло, а не было надобности — уже была рабочая ТС, которая вполне устраивала.
Что-то типа такой
Тест за 3 месяца на одном фьючерсе SBRF.
По x- номер сделки, по У — накопленная прибыль в пунктах SBRF.
Это один из тестов современной модификации той стратегии, который тоже нет смысла доводить до реальной ТС — теперешние комиссии забирают чуть не половину прибыли, плюс потом еще налоги.)
avatar

теги блога 3Qu

....все тэги



UPDONW
Новый дизайн