Избранное трейдера Falcone
Начнем с традиционной таблицы
В начале апреля мои системы, казалось бы, полностью подготовились к тому, чтобы много не сливать (как впрочем, и не зарабатывать много): в SBER, GAZP, RI и даже Si включился «фильтр пилы». Но тут «пришла беда откуда не ждали»: SBER перенес дивидендную отсечку на дату после июньской экспирации. И в результате этого «решения» убыток 2-3 апреля по «синтетической облигации» в SBER составил -1.1% к счету (~-2.3% к лимитам Спот+синтетика на конец марта), при том, что общий убыток по счету за эти дни составил -1.2%. Не менее неприятная ситуация сложилась и на стратегии Стань квалифицированным инвестором! : из -1.91% убытка за эти два дня -1.85% дала эта злосчастная «облигация». Этот убыток составил больше половины убытка Спот+«синтетика» в апреле.
Самый первый фильтр — это DY (Дивидендная Доходность)
Если эмитент платит дивы, сравнимые с ключевой ставкой или выше её, то от этого портфельному спекулянту двойная польза:
1 — это позитивный сигнал, говорящий о том, что эмитент хорошо относится к миноритариям
2 — у портфельного спекулянта благодаря дивам появляется денежный поток, который он может использовать по своему усмотрению
— Складывает Value графиков GraphId1 и GraphId2
— При запуске на загрузке Quik'а работает код предыдущей загрузки
— с последними свойствами, полученными из кода или интерактивно.
— При запуске старые бары графика данных сканируются дважды,
— только если есть подключение к серверу.
— При смене тайм-фрейма старые бары сканируются только единожды.
— При загрузке Quik'а первый скан до подключения к серверу.
CandlesOK = true
Settings = { — После смены тайм-фрейма нужно интерактивное подтверждение
Name = "_Add"
,GraphId1 = «Tag-1» — Перезадать оба после первой загрузки.
,GraphId2 = «Tag-2» — Сохраняются при последующих запусках.
,Factor1 = 1 — Для GraphId1
,Factor2 = 1 — Для GraphId2
,Base1 = 0 — Для GraphId1
,Base2 = 0 — Для GraphId2
,Value = «close»
,line = { — Исчезает прогррамный доступ после 1-го интерактивного изменения
{Name = «close»
,Color = RGB(255,255,0) — Жёлтый
,Type = TYPE_HISTOGRAM — POINT, LINE, DASH, DOT, HISTOGRAM,
,Width = 2} — TRIANGLE_UP, TRIANGLE_DOWN.
}
}
function Init()
local s = «Indicator _Add:»
if 0 == getNumCandles (Settings.GraphId1) then
CandlesOK = false
s = s .."\n invalid GraphId1"
end
if 0 == getNumCandles (Settings.GraphId2) then
CandlesOK = false
s = s .."\n invalid GraphId2"
end
if not CandlesOK then message (s) end
return #Settings.line
end — Init()
function OnCalculate (index)
if index == 1 then
CandlesOK = true
if 0 == getNumCandles (Settings.GraphId1) or
0 == getNumCandles (Settings.GraphId2) then
CandlesOK = false
end
--[[message («Settings.Value »… tostring (Settings.Value)
.."\nSettings.line "… tostring (Settings.line)
.."\nCandlesOK "… tostring (CandlesOK))--]]
if Settings.Value ~= «open» and Settings.Value ~= «high» and
Settings.Value ~= «low» and Settings.Value ~= «close» then
Settings.Value = «close»
message («Indicator _Add: Value must be open/high/low/close»)
end
end
if not CandlesOK then return nil end
local candle1 = (getCandlesByIndex (Settings.GraphId1, 0, index-1, 1))[0]
local candle2 = (getCandlesByIndex (Settings.GraphId2, 0, index-1, 1))[0]
local val1 = candle1[Settings.Value]
local val2 = candle2[Settings.Value]
— Результат return res == 0 and nil or res всегда 0 при res == 0
if val1 == 0 or val2 == 0 then return nil end
return (val1 + Settings.Base1) * Settings.Factor1
+ (val2 + Settings.Base2) * Settings.Factor2
end — OnCalculate()
Начинающие (да и не только) инвесторы часто задаются вопросом о том, как отобрать для себя идеальное соотношение активов входящих в портфель. Часто (или не очень, но знаю про двух точно) у некоторых брокеров эту функцию выполняет торговый робот. Но заложенные в них алгоритмы не раскрываются.
В этом посте будет рассмотрено то, как оптимизировать портфель при помощи Python и симуляции Монте Карло. Под оптимизацией портфеля понимается такое соотношение весов, которое будет удовлетворять одному из условий:
Для расчета возьмем девять акций, которые рекомендовал торговый робот одного из брокеров на начало января 2020 года и так же он устанавливал по ним оптимальные веса в портфеле: 'ATVI','BA','CNP','CMA', 'STZ','GPN','MPC','NEM' и 'PKI'. Для анализа будет взяты данные по акциям за последние три года.
#Загружаем библиотеки import pandas as pd import yfinance as yf import numpy as np import matplotlib.pyplot as plt # Получаем данные по акциям ticker = ['ATVI','BA','CNP','CMA', 'STZ','GPN','MPC','NEM', 'PKI'] stock = yf.download(ticker,'2017-01-01', '2019-01-31')
Вспомнился мне тут алгоритм, который я торговал на крипте в 2017 году.
2017 год, время когда BTC и вся остальная крипта летела to the moon. Алгоритмически было практически нереально обогнать B&H, но все прекрасно понимали, что когда-нибудь пузырь сдуется. У меня не было никакого желания строить алго в такое время, для бектестов просто не было данных, отражающих разные стадии рынка. Но все же за криптой я следил, хоть и немного со стороны — подписался на разные каналы в телеге и время от времени почитывал. Как это принято в телеге, один канал пиарит другой и так мне на глаза попались Pump каналы. Ребята разгоняли тонкие шиткоины на Bittrex, YoBit и еще нескольких биржах на 150-400% в течение нескольких минут. Казалось бы — деньги на ладоне, включай телеграм бота и входи на момент публикации сообщения с тикером. Но все было не так радостно — спреды гигантские и войти по хорошим ценам просто нереально. Легко сообразить что, собственники каналов закупались намного раньше и на спайке сливали все свои монеты. Для толпы были красивые графики и цифры роста, но заработать было, конечно, очень трудно. Само же существование таких каналов давало неплохой эйдж -пампы анонсировались заранее, обычно за несколько дней, было точно известно время пампа и биржа. Дальше уже дело было за техникой — я собрал котировки всех шиткоинов за последние полгода, нашел промежутки, когда монеты пампили и разбил все это на время дня. Наибольшее количество пампов приходилось на 13-00 по мск, что в общем-то неплохо коррелировало с тем, что я видел в каналах. Сама идея стратегии очень проста — покупаем монеты, которые потенциально могут быть разогнаны в наиболее вероятное время (а по началу это всегда была либо середина, либо начало часа), выходим по тейку (вроде 120%) или после окончания памп периода. Первичный тест на широком портфеле (порядка 150 тикеров, если память не изменяет) был достаточно неплох, но большая комиссия + тонкий рынок съедали очень много прибыли от выстреливших монет (иногда их было несколько за один день). Логичным решением было сузить круг торгуемых тикеров, что я и сделал. Сначала убрал тикеры, с большой ликвидностью (их тяжело разгонять и далеко они не улетают), затем убрал тикеры с совсем маленькой ликвидностью (улетают хорошо, но тяжело выходить, если не полетели), затем убрал тикеры, пампы по которым были не так давно, ну и наконец отфильтровал тикеры по диапазону цены (чем дешевле, тем лучше летали). Таким образом в каждый день выходило всего около 20 тикеров, из которых стрелял 1-2. Суммарный результат получался, конечно, не таким впечатляющим как 100% на сделку, но в целом выглядел неплохо. За пару дней я написал коннектор к бирже (Bittrex) + простенький движок конкретно для этой стратегии. Это был октябрь или ноябрь 2017. В итоге я проторговал эту стратегию где-то до февраля, а сломалась она где-то в январе. В переводе, на биток доходность за этот период была порядка 400%, в долларах — намного больше за счет роста самого битка. Увы, емкость стратегии была очень мала.
«Играйте на рынке только тогда, когда все факторы складываются в вашу пользу.
Никто не может играть на рынке все время и постоянно побеждать.
Бывают моменты, когда вы должны полностью пребывать вне рынка,
как ввиду эмоциональных, так и ввиду экономических причин».
Джесси Ливермор.