Избранное трейдера Θ_Hunter
Сегодня сделал извращение на волатильностях Si и RTS. Это были недельные опционы с экспирацией 23/04/2020. На центральном 107500 страйке RTS волатильность была 60 , а на центральном 75000 страйке Si волатильность опустилась до 20.
Волатильность Si я купил, а RTS продал. Сделал я это через стредлы.
Пропорции выбирал следующим образом. Фьючерс RTS в рублях стоит 158709 руб., а фьючерс Si =75000 руб. На один RTS приходится 2,116 Si .
Поскольку Si я покупал, а RTS продавал, то пропорцию взял с запасом 1:3
Дальше подразумевалось дельтахеджирование по следующим правилам:
Когда у RTS дельта становится 1, выравнивать ее в ноль, и в этот же момент выравнивать в ноль позицию Si. Ведущей должна быть проданная позиция.
Позицию я сделал в 12:30, а к 16:20 волатильности немного сошлись. Закрыл позицию с прибылью 5400 руб.
Ждать не стал, поскольку у меня нет математического описания для таких позиций. Делаю я так редко и по интуиции. Но если в рублях выразить центры стредлов, то Si примерно на 18-19 тыс. руб. дешевле, чем RTS. Так что, 5 тысяч мне для получения удовольствия вполне хвалило. Жадничать не надо.
Procent - величина зигзага в % k - коэффизиент ширины канала Ext - =0-канал стоится по средним =1-канал стоится по экстремуму
Привет, новая неделя – новый бэктест факторной стратегии на Мосбирже. В прошлый раз была проверена стратегия Value через мультипликаторы P/E и P/BV https://smart-lab.ru/blog/609357.php В этот раз мы проверили стратегию Momentum на российских акциях.
Суть ее очень проста – покупаем акции, которые сильнее всего выросли за последние 6 месяцев и шортим акции с худшей динамикой цены за тот же период. Стратегия получается рыночно нейтральной (в теории, на самом деле — корреляция с рынком очевидна) и если у такого лонг-шорт портфеля есть положительная доходность, то мы можем сказать, что на Мосбирже есть моментум эффект.
Воспользовавшись поиском по Смартлабу можно найти несколько интересных исследований по моментуму (если что-то упущено, пожалуйста, дайте ссылку в комментариях) – «Есть ли сила в моментуме» от at6 https://smart-lab.ru/blog/596080.php и «Как обогнать индекс (пример выигрышной торговой стратегии)» от AlexChi https://smart-lab.ru/blog/499362.php
TICER = "SBER"; CLASS_CODE = "TQBR"; FilePath = getScriptPath() .. "\\export.txt";--путь к файлу save = false;--сохранять данные в файл если false нет, true да f = nil; stopped = false; t_id = nil H = -1; M = -1; VSELL = 0; VBUY = 0; CDelta = 0; CountTrans = 0; PriceTrans = 0.0; t = ""; function OnInit() CountTrans = 0; if save then f = io.open(FilePath,"w"); end CreateTable(); end function main() while not stopped do if IsWindowClosed(t_id) then stopped = true; end sleep(10); end end function CreateTable() t_id = AllocTable(); AddColumn(t_id, 0, "Время", true, QTABLE_STRING_TYPE, 10); AddColumn(t_id, 1, "BUY", true, QTABLE_INT_TYPE, 10); AddColumn(t_id, 2, "SELL", true, QTABLE_INT_TYPE, 10); AddColumn(t_id, 3, "Дельта V", true, QTABLE_INT_TYPE, 10); AddColumn(t_id, 4, "AVG Цена", true, QTABLE_DOUBLE_TYPE, 15); AddColumn(t_id, 5, "Накопленная Дельта", true, QTABLE_INT_TYPE, 15); AddColumn(t_id, 6, "Кол-во сделок", true, QTABLE_DOUBLE_TYPE, 12); tab = CreateWindow(t_id); local NAME = tostring(getParamEx(CLASS_CODE,TICER,"LONGNAME").param_image); SetWindowCaption(t_id, TICER.." ("..NAME..") Баланс покупок/продаж"); SetTableNotificationCallback(t_id, EventCallBack); end function Calc(alltrade) if bit.test(alltrade.flags, 0) then VSELL = VSELL+alltrade.qty; --Продажа else VBUY = VBUY+alltrade.qty; end CountTrans = CountTrans+1; PriceTrans = PriceTrans+alltrade.price; end function OnAllTrade(alltrade) if alltrade.sec_code == TICER then local Rows, Col = GetTableSize(t_id); if H==-1 or H~= alltrade.datetime.hour then H = alltrade.datetime.hour; M = alltrade.datetime.min; t = tostring(alltrade.datetime.hour)..":"..tostring(alltrade.datetime.min); end if M==alltrade.datetime.min then Calc(alltrade); else M=alltrade.datetime.min; InsertRow(t_id, -1); local Delta = VBUY-VSELL; Price = PriceTrans/CountTrans; SetCell(t_id, Rows, 6, tostring(CountTrans)); SetCell(t_id, Rows, 0, t); SetCell(t_id, Rows, 1, tostring(VBUY)); SetCell(t_id, Rows, 2, tostring(VSELL)); SetCell(t_id, Rows, 3, tostring(Delta)); local SEC_SCALE = tostring(getParamEx(CLASS_CODE,TICER,"SEC_SCALE").param_value); SEC_SCALE = string.format("%.0f",SEC_SCALE); SetCell(t_id, Rows, 4, string.format("%."..SEC_SCALE.."f", tostring(Price))); if Rows>=2 then local OldPrice = tonumber(GetCell(t_id,Rows-1,4).image); if OldPrice>Price then Red(Rows,4); else Green(Rows,4); end CDelta = tonumber(GetCell(t_id,Rows-1,5).image); CDelta = CDelta + Delta; else CDelta = Delta; end SetCell(t_id, Rows, 5, tostring(CDelta)); if Delta<0 then Red(Rows,3); end if Delta>0 then Green(Rows,3); end if CDelta<0 then Red(Rows,5); end if CDelta>0 then Green(Rows,5); end if save then local Str = tostring(H)..";"..tostring(M)..";"..tostring(VBUY)..";"..tostring(VSELL)..";" ..tostring(Delta)..";"..tostring(Price)..";"..tostring(CDelta); Str=Str.."\n"; SaveFile(Str); end t = tostring(alltrade.datetime.hour)..":"..tostring(alltrade.datetime.min); VBUY = 0;VSELL = 0; PriceTrans = 0; CountTrans = 0; Calc(alltrade); end end --if alltrade.sec_code == TICER then end function SaveFile(Str) if f ~= nil then f:write(Str); f:flush(); end end function Red(row,col) SetColor(t_id, row, col, RGB(255,0,0), RGB(0,0,0), RGB(255,0,0), RGB(0,0,0)); end function Yellow(row,col) SetColor(t_id, row, col, RGB(240,240,0), RGB(0,0,0), RGB(240,240,0), RGB(0,0,0)); end function Green(row,col) SetColor(t_id, row, col, RGB(0,200,0), RGB(0,0,0), RGB(0,200,0), RGB(0,0,0)); end function EventCallBack(t_id, msg, par1, par2) if msg==QTABLE_CLOSE then OnStop(); end; end function OnStop(s) if f ~= nil then f:close(); end if t_id ~= nil then DestroyTable (t_id); end; stopped = true; end