Избранное трейдера Вася Пупкин

по

Quik. Индикатор корреляции

    • 02 ноября 2017, 16:21
    • |
    • Karim
  • Еще
Написал на досуге по просьбе одного из участников смартлаба индикатор корреляции.
Индикатор простенький, считает коэффициент корреляции Пирсона
для двух выбранных инструментов на заданном таймфрейме.
Выкладываю исходный код. Может кому то пригодится.

Settings= 
{ 
Name = "Piton", 
N = 100,
legend = "price2",
line = 
	{ 
		{ Name = "Sint", 
		  Color = RGB(0, 132, 0), 
		  Type = TYPE_LINE, 
		  Width = 1 
		}		
	} 
} 

function Init() 
return 1
end 

Candles = {};


function OnCalculate(index) 
	local numCandles = getNumCandles(Settings.legend);
	if index <= Settings.N or numCandles <= Settings.N then
		return nil;
	end
	
	Candles, n, _ = getCandlesByIndex(Settings.legend, 0, index - Settings.N, Settings.N);
	if n ~= Settings.N then
        return nil;
    end
	
	-- Предварительный расчет
	sum1, sum2, sum3 = advancePaynemt(index);
	
	-- расчет коэффициента корреляции Пирсона
	r = sum3/math.sqrt(sum1*sum2);
	
	return r;
end

--  Предварительный расчет
----------------------------------------
function advancePaynemt(index)	
	local sum1 = 0;
	local sum2 = 0;	
	local sum3 = 0;
	local j    = 0;
	
	--  Вычислить среднее арифметическое
	for i=index - Settings.N + 1, index, 1 do
		sum1 = sum1 + C(i);			
		sum2 = sum2 + Candles[j].close;
		j = j + 1;
	end
	aver1 = sum1/Settings.N;
	aver2 = sum2/Settings.N;
	
	-- Вычислить сумму квадратов отклонений
	sum1 = 0;
	sum2 = 0;
	j 	 = 0;
	for i=index - Settings.N+1, index, 1 do
		sum1 = sum1 + math.pow(C(i) - aver1, 2);
		sum2 = sum2 + math.pow(Candles[j].close - aver2, 2);
		j = j + 1;
	end
	
	--  Вычислить сумму произведений разности
	j=0;
	for i=index - Settings.N+1, index, 1 do
		sum3 = sum3 + (aver1 - C(i))*(aver2 - Candles[j].close);
		j = j + 1;
	end
	
	return sum1, sum2, sum3;
end

Как запустить и настроить:


Архив исходника на QLua: https://yadi.sk/d/OxDvAekV3PLn2z
  • обсудить на форуме:
  • QUIK

Опционы "с нуля". Часть 1-я. Занудная. Рисуем таблички.

Нельзя торговать, не видя перед мордой всего.

     Начинаю плавно выкидывать то, что ПРИГОДИТСЯ ВСЕМ!

     Таблички — их три. Прошу желающих — скопировать с большой точностью, ибо дальше все расчёты от них пойдут.
      Не настаиваю ни на чём. Просто дальше пойдут эксельные файлы, котороые любой желающий сможет получить. Забе
сплатьно. Затак. А тама — идеология!

      Итак, рисуем три  таблички. Первая - 

в квике — система. Информация по опционам. Создать.

     Это будет «таблица параметров опционов». Обращаю внимание на размер — 36 строк, или 18 страйков. Всем всё понятно. Зачем и почему — позжее. Нижее.
     Итак, определяем значимые поля — они нам пригодятся!
     ВНИМАНИЕ — все данные для расчётов будут браться из этой таблицы. Воспроизведите её!

Опционы "с нуля". Часть 1-я. Занудная. Рисуем таблички.
     Напоминаю, я пошагово

( Читать дальше )

"Святой грааль" для инвесторов по версии Рэя Далио

Взято из https://nakhusha.livejournal.com/

Алекс, совладелец ресурса macro-ops.com, делится с нами своим открытием по поводу скрытой власти корреляции.
Оригинал DAILY SPECULATIONS: THE HOLY GRAIL OF INVESTING


Картинка из книги Рэя Далио об откровениях, которые перевернули жизнь великого инвестора (“Principles”).

"Святой грааль" для инвесторов по версии Рэя Далио

Она иллюстрирует силу корреляции в снижении риска и увеличении доходности в правильно диверсифицированном портфеле. Как видно из графика, можно иметь в портфеле 2000 инструментов с 60% корреляцией, но риск отклонения снизится только с 10% до 8%. При этом, имея на руках только пять инструментов с 10% корреляцией между ними, можно получить снижение риска с 10% до 6%. В два раза больше! И на Рэя Далио такое открытие повлияло как на Эйнштейна его формула E=mc2.

( Читать дальше )

Чичваркин: Евтушенков отжимал у меня Евросеть

смотрел на днях очень интересное 2х часовое интервью с Чичваркиным на канале у Дудя. Я и раньше симпатизировал Чичваркину, но относился к нему с долей скептицизма, а после этого интервью для меня человек раскрылся совсем по иному. Стало понятно, что у него реально талант барыги, торговца, предпринимателя. Многие ошибочно думают, что торговля и коммерция это легко и просто, купил дешевле, продал дороже, вот и весь наебизнес. На самом деле этот талан врожденный, как талант у музыкантов, политиков или трейдеров. И как человек Чичваркин показался мне простым, но хорошо образованным интеллектуалом, близким мне по духу, захотелось даже распить с ним бутылочку виски. Но это всё лирика. Вот сами ролики:


( Читать дальше )

Код робота на LUA для QUIK

В двух словах: робот анализирует спот, выставляет лимитные и стоп-лимитные заявки по фьючерсу. Делает пересчет сигналов по выбранному тайм-фрейму, снятие выставленных заявок, запись в файл текущего состояния, ведение логов, сообщения, запрос текущей позиции и пр. Из робота удалена алгоритмика вычисления сигнала и в текущем виде скрипт будет иметь сигнал на покупку на каждом баре.

Предназначается для новичков в алготрейдинге, что-то типа болванки.

Важно: выставление заявок я закомментировал, поэтому можете смело запускать этот скрит, он не натворит ужаса по счету.

require"QL"

log = "sbrf.log"
seccode = "SRM6"
lots_in_trade = 80
accnt = ""
better = -5
chart = "sberbankxxx"
is_run = true
prev_datetime = {}
len = 100
basis = 9
k_bal = {0,1,2,3}
sell = false
buy = false
id = 0
first = true

function trade_signal(shift)
        number_of_candles = getNumCandles(chart)
        bars_temp,res,legend = getCandlesByIndex(chart,0,number_of_candles-2*len-shift,2*len)
        bars={}

        i=len
        j=2*len
        while i>=1 do
                if bars_temp[j-1].datetime.hour>=10 then
                        sk=true
                        if bars_temp[j-1].datetime.hour==18 and bars_temp[j-1].datetime.min==45 then
                                sk=false
                        end
                        if sk then
                                bars[i]=bars_temp[j-1]
                                i=i-1
                        end
                end
                j=j-1
        end

        t = len+1

        do_sell = false
        do_buy = true

        value = 0
        if do_sell then value = 1 end
        if do_buy then value = -1 end
        toLog(log,"value="..value.." on candle: "..bars[len].datetime.year.."-"..bars[len].datetime.month.."-"..bars[len].datetime.day.." "..bars[len].datetime.hour..":"..bars[len].datetime.min.."   O="..bars[len].open.." H="..bars[len].high.." L="..bars[len].low.." C="..bars[len].close.." V="..bars[len].volume)
        return value
end

function mysplit(inputstr, sep)
        if sep == nil then
                sep = "%s"
        end
        local t={} ; i=1
        for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
                t[i] = str
                i = i + 1
        end
        return t
end

function OnInit(path)
        log=getScriptPath()..'\\'..log
        toLog(log,"==========OnInit: START")
        toLog(log,"==========OnInit: FINISH")
end

function OnStop()
        is_run = false
        toLog(log,"==========OnStop: script finished manually")
end

function CheckBit(flags, bit)
   -- Проверяет, что переданные аргументы являются числами
   if type(flags) ~= "number" then error("Ошибка!!! Checkbit: 1-й аргумент не число!"); end;
   if type(bit) ~= "number" then error("Ошибка!!! Checkbit: 2-й аргумент не число!"); end;
   local RevBitsStr  = ""; -- Перевернутое (задом наперед) строковое представление двоичного представления переданного десятичного числа (flags)
   local Fmod = 0; -- Остаток от деления
   local Go = true; -- Флаг работы цикла
   while Go do
      Fmod = math.fmod(flags, 2); -- Остаток от деления
      flags = math.floor(flags/2); -- Оставляет для следующей итерации цикла только целую часть от деления
      RevBitsStr = RevBitsStr ..tostring(Fmod); -- Добавляет справа остаток от деления
      if flags == 0 then Go = false; end; -- Если был последний бит, завершает цикл
   end;
   -- Возвращает значение бита
   local Result = RevBitsStr :sub(bit+1,bit+1);
   if Result == "0" then return 0;
   elseif Result == "1" then return 1;
   else return nil;
   end;
end;

function killorders(ccode,scode)
    for i=0,getNumberOf("orders")-1,1 do
        local t=getItem("orders", i)
        if t ~= nil and type(t) == "table" then
            if( t.seccode == scode and CheckBit(t.flags, 0) == 1) then
                local transaction={
                    ["TRANS_ID"]=tostring(math.random(2000000000)),
                    ["ACTION"]="KILL_ORDER",
                    ["CLASSCODE"]=ccode,
                    ["SECCODE"]=scode,
                                        ["ACCOUNT"] = accnt,
                    ["ORDER_KEY"]=tostring(t.ordernum),
                }
                                res=sendTransaction(transaction)
            end
        end
    end
end

function killstoporders(ccode,scode)
    for i=0,getNumberOf("stop_orders")-1,1 do
        local t=getItem("stop_orders", i)
        if t ~= nil and type(t) == "table" then
            if( t.seccode == scode and CheckBit(t.flags, 0) == 1) then
                local transaction={
                    ["TRANS_ID"]=tostring(math.random(2000000000)),
                    ["ACTION"]="KILL_STOP_ORDER",
                    ["CLASSCODE"]=ccode,
                    ["SECCODE"]=scode,
                                        ["ACCOUNT"] = accnt,
                    ["STOP_ORDER_KEY"]=tostring(t.ordernum),
                }
                                res=sendTransaction(transaction)
            end
        end
    end
end


function main()
        toLog(log,"==========main: START")
        while is_run do
                if isConnected() == 1 then
                        ss = getInfoParam("SERVERTIME")
                        if string.len(ss) >= 5 then
                                hh = mysplit(ss,":")
                                str=hh[1]..hh[2]
                                h = tonumber(str)
                                if (h>=1000 and h<1400) or (h>=1405 and h<1845) or (h>=1905 and h<2350) then
                                        if first then
                                                for ti = 50,2,-1 do     trade_signal(ti) end
                                                if buy and not sell then message(seccode.." Current state: green and buy",1) end
                                                if sell and not buy then message(seccode.." Current state: red and sell",1) end
                                                if buy and sell then message(seccode.." ERROR: green and red",1) end
                                                if not buy and not sell then message(seccode.." WARNING: nothing",1) end
                                                first = false
                                        end
                                        prev_candle = getPrevCandle(chart,0)
                                        if not isEqual(prev_candle.datetime,prev_datetime) then
                                                current_value = trade_signal(1)

                                                if current_value ~= 0 then
                                                        optn = "B"
                                                        if current_value==1 then optn = "S" end
                                                        curvol=0
                                                        no=getNumberOf("FUTURES_CLIENT_HOLDING")
                                                        if no>0 then
                                                                for i=0,no-1,1 do
                                                                        im=getItem("FUTURES_CLIENT_HOLDING", i)
                                                                        if im.sec_code==seccode then
                                                                        curvol=im.totalnet
                                                                        end
                                                                end
                                                        end
                                                        trvol = -current_value*lots_in_trade-curvol
                                                        if trvol ~= 0 then
                                                                killorders("SPBFUT",seccode)
                                                                killstoporders("SPBFUT",seccode)
                                                                f = io.open(getScriptPath().."\\sbrf2_pos.txt","r")
                                                                sbrf2_pos=f:read("*n")
                                                                f:close()
                                                                f = io.open(getScriptPath().."\\sbrf3_pos.txt","r")
                                                                sbrf3_pos=f:read("*n")
                                                                f:close()
                                                                pr,n,l = getCandlesByIndex ("futsber", 0, getNumCandles("futsber")-1, 1)
                                                                local trans =
                                                                {
                                                                        ["ACTION"] = "NEW_ORDER",
                                                                        ["CLASSCODE"] = "SPBFUT",
                                                                        ["SECCODE"] = seccode,
                                                                        ["ACCOUNT"] = accnt,
                                                                        ["OPERATION"] = optn,
                                                                        ["PRICE"] = toPrice(seccode,pr[0].close+current_value*better),
                                                                        ["QUANTITY"] = tostring(math.abs(curvol-sbrf2_pos-sbrf3_pos)),
                                                                        ["TRANS_ID"] = tostring(getTradeDate().month*100+getTradeDate().day+id)
                                                                }
                                                                id = id+1
                                                                --res = sendTransaction(trans)
                                                                message(seccode.." Send : " .. res, 2)
                                                                toLog(log,"Send: ".. res)
                                                                for btr=0,200,5 do
                                                                        local trans =
                                                                        {
                                                                                ["ACTION"] = "NEW_STOP_ORDER",
                                                                                ["CLASSCODE"] = "SPBFUT",
                                                                                ["SECCODE"] = seccode,
                                                                                ["ACCOUNT"] = accnt,
                                                                                ["OPERATION"] = optn,
                                                                                ["PRICE"] = toPrice(seccode,pr[0].close-current_value*btr),
                                                                                ["STOPPRICE"] = toPrice(seccode,pr[0].close-current_value*(btr+better)),
                                                                                ["QUANTITY"] = tostring(6),
                                                                                ["TRANS_ID"] = tostring(getTradeDate().month*100+getTradeDate().day+id),
                                                                                ["EXPIRY_DATE"] = "GTC"
                                                                        }
                                                                        id = id+1
                                                                        --res = sendTransaction(trans)
                                                                        message(seccode.." Send : " .. res, 2)
                                                                        toLog(log,"Send: ".. res)
                                                                end
                                                                if current_value == 1 then
                                                                        message(seccode..' RED: buy->sell',1)
                                                                        toLog(log,"RED signal")
                                                                else
                                                                        message(seccode..' GREEN: sell->buy',1)
                                                                        toLog(log,"GREEN signal")
                                                                end
                                                        else
                                                                if current_value == 1 then
                                                                        message(seccode..' RED: buy->sell',1)
                                                                        toLog(log,"RED signal, but nothing to do")
                                                                else
                                                                        message(seccode..' GREEN: sell->buy',1)
                                                                        toLog(log,"GREEN signal, but nothing to do")
                                                                end
                                                        end
                                                else
                                                        if buy and not sell then toLog(log,"Nothing to do. Current state: green and buy",1) end
                                                        if sell and not buy then toLog(log,"Nothing to do. Current state: red and sell",1) end
                                                        if buy and sell then toLog(log,"Nothing to do. ERROR: green and red",1) end
                                                        if not buy and not sell then toLog(log,"Nothing to do. WARNING: nothing",1) end
                                                end
                                                prev_datetime = prev_candle.datetime
                                        end
                                end
                        end
                end
                sleep(5*1000)
        end
        toLog(log,"==========main: FINISH")
end
  • обсудить на форуме:
  • Quik Lua

Скрипт на qlua - Светофор

По следам этого поста скрипт на qlua, называется «Светофор».
Суть скрипта- отслеживать дистанцию до «дна», которое представляет собой лои 2008 года+накопленная инфляция.

Подсветка строк:
зеленым- цена ниже уровня инфляции
желтым — до дна менее 50%
красным — до дна более 80%

сортировка строк по ctrl+клик

В чем не смог разобраться:
как получить лой 2008 года по акции (вбито вручную)
как получить полное название компаний (вбито вручную)
кто знает — подскажите!

Как это выглядит в Квике:
Скрипт на qlua - Светофор


Бэктест на проливе 2014 года:
Скрипт на qlua - Светофор



( Читать дальше )
  • обсудить на форуме:
  • Quik Lua

Золото , инвестиционные монеты (ещё одна попытка ликвидации невежества)

Как не странно, но на Смартлабе (на смартлабе, Карл !) я столкнулся с таким явлением.
Какой-нибудь юзер пишет, что хочет вложить деньги во что-то ещё, кроме ценных бумаг.
Ему советуют разные варианты, и когда очередь доходит до физ золота — то либо сам юзер, либо другие участники обсуждения, начинают резко возражать «Не, не, там же НДС! 18%! Ужос !!!»
Раздаются робкие голоса, что НДС только на слитки, а на инвест монеты нет НДС.
Все удивляются, соглашаются, и на этом все расходятся.

А в другом топике ситуация повторяется один в один.
Что уже раздражает )))
Поэтому я сделаю попытку ликвидировать массовое невежество и обратить внимание смартлабовцев на такой привлекательный инструмент, как физ золото.

1 Инвест монеты не облагаются НДС
2 Инвест монеты надо покупать не в банках — а в конторах (см в гугле)
3 В конторах спред покупка\продажа 2-4% (бывает и хуже, но в такие конторы не надо ходить)(при походе в контору при себе нужно иметь паспорт)
4 Владение монетой более 3 лет не облагается НДФЛ (конторы выдают документ с датой при покупке монеты)

( Читать дальше )

Эмпирический пут-колл паритет или как ломается модель Блэка-Шоузла

Благодаря поступающим комментариям к платформе OptionSmile (спасибо, Кирилл Браулов) выяснилась одна интересная вещь с эмпирическим непараметрическим подходом, который лежит в ее основе.  А именно, как соблюдается пут-колл паритет в оценках Fair Value опционов. Напомню, что суть его в том, что разница между ценой пута и кола должна быть равна разнице между страйком и ценой баз.актива. Если это равенство не соблюдается, то возникает арбитраж.

Например, купив пут и продав колл на одном страйке, можно создать короткую позицию по БА. Если не соблюдается пут-колл паритет, то можно теперь захеджироваться, купив базовый актив и получить доходность без риска. В риск-нейтральном мире, в котором работает модель Блэка-Шоулза, вы всегда должны такой комбинацией зарабатывать безрисковую процентную ставку. Поэтому точная формула пут-колл паритета выглядит так:

                              P-C = X*e-rt-S



( Читать дальше )

Изобрел свой собственный "велосипед" (коррелятор)

Приветствую!

 

    Давно руки не доходят что то напечатать толковое на смартлабе. Сейчас вот печатаю, не особо толковое но все ж любопытное.

 

Решил разнообразить свои алгоритмы и немного поторговать «боковой» алгоритм. ну и в процессе собирания алгоритма получилось как обычно не то что хотелось изначально.

Суть идеи свелась к тому, что беру два инструмента и далее связываю их между собой (можно прологарифмировать и делать любую нелинейную связь тикеров) за основу связи можно брать прямую (бид первой бумаги — аск второй и наоборот или закрытие1-закрытие2 или регрессию или все на что фантазия разыграется, главное чтобы движение «индикатора» улавливало колебания бумаг. 

Далее все по проще, один инструмент например Сбер, будет торговаться, второй инструмент будет направлять (лучше чем ммвб не найти, но можно взять например сбер обычку и префы, си и доллар, ртс и ммвб и при этом ртс можно в рубли пересчитать) 
В своем примере я делал так: два тикера, зависимость бумаг считал только в момент их допустимой корреляции ( то есть, если бумаги пошли в разнобой, то переставал считать их связь, и собственно торговать прекращал.) ну и далее естественно исходить нужно из бумаги. ставлю на сбер от 20р, если расхождение есть больше 20р между сбером и ммвб, то открываю сделку. если после этого бумаги пошли в разнобой, то через каждые 30р вхожу снова (без удвоения, хотя можно и удваиваться, в тестах далее 80р не улетала бумага так что это на руку) Закрытие позиции просто при достижении равновесного значения. 

Как это выглядет. Стрелочка просто — это вход, с + это добор позиции. 
 Изобрел свой собственный "велосипед" (коррелятор)



( Читать дальше )

....все тэги
UPDONW
Новый дизайн