Избранное трейдера S&P
Проанализировав графики смоделированные «подбросом монетки» — генерацией случайных чисел. Которые бывают так похожи на реальные рынки заметил что все же на реальных рынках более заметно чередование периодов флета и тренда.
Если бы биржа была замкнутой системой без притока свежего мяса и все играли бы свою систему или паттерн, мы бы тут давно уже друг друга сожрали и остался бы 1 самый ушлый и богатый… Системы бы тупо работали и не работали бы по кругу и все же больше бы сливали. Потому что поскольку мы перераспределяем общий кэш он бы и ушел бы самому большому и влиятельному постепенно. Хоть что играй и хоть что придумывай... По счастью свежий кэш печатают и свежее мясо приходит и его заносит в общий котел и уходит мясо потом без денег. Вывод — мы можем заработать только в периоды прихода свежего мяса быстро отобрав у него деньги) В остальное время мы вынуждены тут перераспределять медленно сливая на комиссиях…
Сделать это можно используя типичные ошибки свежего мяса: 1. Не ставить стопы и ждать возврата цены к зоне покупки чтобы выйти с прибылью (либо маржин кола если деньги кончатся раньше). 2. Отсутствие риск менеджмента и диверсификации, а, следовательно, наступления периодически маржин колов.
Так вот, если вы нашли на тестере торговую систему, которая СЛИШКОМ хороша – впору вспомнить про ту купюру. С чего бы кладу лежать у всех на виду? Все, что я находил слишком хорошего – обычно или быстро ломалось, или, еще чаще, казалось. Способы разные. Недооценка транзакционных издержек. Переоценка своей скорости. Да просто подгон на периоде.
Самые лучшие системы (что работали потом годами, и каждый год давали какую-то денежку) обычно простые, на вид даже где-то тупые и ни разу не волшебные. С профит-фактором 1.5, который многие, знаю, презирают. С многомесячными просадками. Придумать подлинно тупую-лобовую систему, без подгона – это уметь надо, кстати.
Привет, после небольшого перерыва возвращаемся к бэктестам. Добавим к простой трендовой стратегии на Мосбирже 4 варианта выхода из позиций с возрастающим уровнем сложности. Для первых двух стратегий особых навыков не требуется, третья требует парсинга Телеграма и для последней потребуется обученная нейронная сеть при разметке сообщений.

Это продолжение рассуждений о риске и доходности акций на Московской бирже: https://smart-lab.ru/blog/625771.php Основные выводы из первой части:
1) Увеличение риска (стандартного отклонения) приводит к снижению будущей доходности акций, а не наоборот;
2) Стратегия, выстроенная только на основе исторической волатильности, несамостоятельна и проигрывает индексу.
В этот раз возьмем за основу трендовую стратегию в самом простом виде – на пересечении 1-месячной и 3-х месячной скользящей средней. И будем снижать риск разными способами с целью поднять доходность, Шарп, сократить время боковиков и корреляцию с бенчмарком. Об эффективности трендовых стратегий в России можно почитать здесь https://smart-lab.ru/blog/611263.php на глобальных ETF здесь
Чтобы преуспеть на финансовых рынках, нужно качественно анализировать информацию. Чтобы качественно анализировать информацию, нужен хороший инструмент. Если вы хотите узнать про один из таких инструментов, то прочитайте эту статью. В ней мы рассказали о data science — прикладной научной дисциплине, которую активно применяют в ведущих инвестиционных домах.

Оглавление
Как анализируют финансовые рынки
Как работает data science
Почему data science эффективен
Что нужно, чтобы применять data science
Станет ли data science панацеей для инвесторов
Постскриптум
Как анализируют финансовые рынки
Перед тем как приступить к Data Science, давайте разберемся с философией анализа финансовых рынков. Для этого мы ответим на три принципиальных вопроса:
1. Зачем анализировать финансовый рынок?
2. На чем основаны методы анализа финансового рынка?
3. Почему не существует идеального метода анализа?


Если вам кто нибудь скажет, что на случайном блуждании (СБ) нельзя зарабатывать, бросьте в него камень. Как говорил Паниковский — это жалкие ничтожные люди. На СБ можно зарабатывать с результатами не хуже, чем на реальном рынке. У СБ, по сравнению с реальным рынком, только один недостаток — за игры с СБ никто деньги платить не будет.
А если бы платили? Никто бы ничего не заметил. По прежнему 95% СБ-трейдеров сливало бы депозиты, а 5% регулярно выигрывало и считало бы себя Гуру. По прежнему на графики наносились бы каббалистические знаки и индикаторы, угадывались бы направления движения, каналы, и линии поддержки/сопротивления. Все так же начинающие трейдеры искали Учителя для обучения, а аналитики предсказывали будущее. И, ровным счетом, абсолютно ничего бы не поменялось. Может только АГ заметил бы подвох, но тоже не сразу, а только через несколько месяцев, а, может, и через год-другой. Но, легко сделать, чтобы и АГ остался в неведении.)
Однако, прежде чем играть на СБ, нам необходима стратегия и тестер. Ими мы и займемся.
Для начала стратегия: нам нужны три функции
— одна для пошагового слежения за рыночными котировками и определения момента входа в сделку — DealEntryAnalysis(i) и пусть на ее выходе будет: 0-если сделки нет, 1 — необходим вход в лонг, и -1 — необходим вход в шорт. i — номер отсчета массива котировок.
— вторая для сопровождения сделки лонг — DealControlL(i), отвечающая за контроль и закрытие сделки.
— и третья, для сопровождения сделки шорт — DealControlS(i).
Теперь у нас все готово для разработки тестера стратегий, а это всего лишь цикл while() последовательно перебирающий котировки.
Вот наша стратегия уже в тестере:
while i < Ie:
deal_type = DealEntryAnalysis(i)
if deal_type == 1:
j, rep = DealControlL(i)
deals_report.append(rep)
i = j+1
continue
elif deal_type == -1:
j, rep = DealControlS(i)
deals_report.append(rep)
i = j+1
continue
i = i+1Как и любой исследователь-инвестор, я сталкиваюсь с необходимостью обрабатывать огромное количество различных данных, чтобы принять взвешенное инвестиционное решение.
И одна из самых трудоемких частей работы — это сбор данных, их систематизация и подготовка для работы. Конечно, очень хочется как можно больше автоматизировать данную работу, чтобы тратить на это как можно меньше времени.
Я уже рассказывал, что на самоизоляции осваивал Python, и демонстрировал, что мне удалось написать профессиональный инвестиционный калькулятор, который рассчитывает различные финансовые показатели и сравнивает между собой два актива. Кстати, в последней его версии я добавил возможность учета комиссий и налогов. Это позволяет намного легче сравнивать NET результаты для инвестора, особенно если в стратегии по ДУ есть вознаграждение управляющего за успех, а в ПИФах комиссия за приобретение и погашение паев.
Все первичные данные для сравнения приходилось формировать в ручном режиме — скачивать котировки в файл, потом их обрабатывать, и уже потом считать результаты. И даже немало известная программа
-------------------------------------------------------------------------------------------------------
--- Функция получения результатов свечей в .CSV в виде:
--- <Инструмент> <Дата> <Время> <Цена_Open> <Цена_High> <Цена_Low> <Цена_Close> <Объем>
--- BRN0 1 20200605 200100 42.15 42.16 42.1 42.1 2150
-------------------------------------------------------------------------------------------------------
is_run=true
-- Параметры
tInstr="BRN0" --код инструмента/бумаги
classcode="SPBFUT" --код класса инструмента/бумаги, если нужен фондовый рынок - вводить TQBR вместо SPBFUT
iNterval=INTERVAL_M1 --таймфрейм
-- доступные таймфреймы указаны в справке Quik (qlua.chm в папке с quik) по поиску CreateDataSource
-- пример INTERVAL_H1
corrTime=3 --Время МСК. C сервера время приходит без корректировки.
pFile="w:\\temp" --путь, где будет создаваться файл
cBars=10 --сколько свечей надо вывести
--настройка параметров
function OnInit()
out_file=io.open(pFile .."\\"..tostring(tInstr)..".csv","w")
is_run=(out_file~=nil)
ds=CreateDataSource(classcode, tInstr, iNterval ) --создаем источник данных
ds:SetUpdateCallback(NewChartData) --обновление последних данных
end
function strText(int)
local m=tostring(int)
local mLen=string.len(int)
if mLen==1 then
Output="0" .. tostring(m)
else Output=m
end
return Output
end
function main()
while is_run do
local Size=ds:Size() --Получение количества всех свечей в источнике данных
if cBars>Size then
cBars=Size-1
end
for i=Size-cBars, Size, 1 do
local O=ds:O(i) -- Значение цена открытия свечи
local H=ds:H(i) -- Значение High для свечи
local L=ds:L(i) -- Значение Low для свечи
local C=ds:C(i) -- Значение Close для свечи
local V=ds:V(i) -- Значение Volume для свечи
local T=ds:T(i) -- Значение Time для свечи
sTime=os.time(T)
datetime=os.date("!*t",sTime)
--вывод в файл
out_file:write(tInstr..";"..tostring(iNterval)..";"..tostring(datetime.year)..tostring(strText(datetime.month))..tostring(strText(datetime.day))..";"..tostring(strText(datetime.hour + corrTime))..tostring(strText(datetime.min))..tostring(strText(datetime.sec))..";"..tostring(O)..";"..tostring(H)..";"..tostring(L)..";"..tostring©..";"..tostring(V).."\n")
out_file:flush() --запись данных
end
out_file:close()
sleep(1000) -- приостановка на 1 секунду
out_file=io.open(pFile .."\\"..tostring(tInstr)..".csv","w")
end
end