Избранное трейдера Holod_Dmitry

по

Чем лечить коронавирус

Сообщение медика из Италии

Привет… к сожалению да, чуда в этот раз не будет, штука заразная и неприятная. И не придет, а уже пришла (см. количество пневмоний в одесских больницах) уже как месяц назад… все как в Италии.  Здесь официально заявили о начале эпидемии в конце февраля, в то время как было уже в полном разгаре в конце января (по своим пациентам видел), первый пациент в Италию прилетел из Мюнхена 9 января… поэтому и такие последствия. Делали вид, что «ложки нет».

Симптомы: основной — сухой кашель, обычно начинается параллельно с першением и болью в горле (иногда и часто просто боль в шее, типа мышечная и в мышцах шеи, полагаю по ходу лимф. узлов), легкое недомогание и типа продромных явлений, все как при гриппе. Температура 37,0-37,5  — 1-2 дня, или вообще без температуры. НО! как правило, нет ринита. Часто головная боль, заложенность ушей (сальпингит), легкие признаки синусита, но, повторю, необычно как-то, нет секреторного компонента. Есть просто отек слизистых. Далее, на 2-4 день боль по ходу трахеи и за грудиной (!), сухой кашель усиливается. С пятого дня может появиться боль в грудной клетке (уже более латерально, не по центру), затрудненное дыхание (периодами). И это вот продолжается без лечения около 15-20 дней. Потом, если осложнений нет, уходит и улучшается (субъективно) по 5% в день. Длится всего порядка месяца (от 3 до 6 недель). Если нет осложнений — то температуры нет, или гипотермия (36,0-36,3). В анализе крови аналогично: основной симптом — лимфопения (!), мало либо нормальное кол-во нейтрофилов, и повышенный С-реактивный белок. Больше ничего.



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

Поговорим немного об оптимизации?!

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

Не станем углубляться в философию оптимизации своего алгоритма, и для чего нужен бектест. Могу сказать свое мнение — оптимизировать можно, но только делайте это правильно. В своей практике, бектестинг для меня играет крайне малую роль при создании алгоритма. Но все же некие аспекты и зависимости можно выделить.
Для начала хотелось бы показать как вообще это выглядет все в рамках TSLab.
Два примера — на первом рисунке дефолтно созданный алгоритм под простые индикаторы, RSI 20 поверх SMA20. Купили когда индикатор близок к 100, продали когда близок к нулю. Никаких фильтров и усложнений (так нужно для данного поста). Так же для примера показана таблица результатов под 400проходов. От 5 до 100 с шагом 5 для каждого индикатора. (тоже лишь для примера). В ней можно усмотреть что количество отрицательных результатов — довольно маленькое. (удачный пример, не более)

Поговорим немного об оптимизации?!



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

Снова "миллиард" в Сбере

    • 11 ноября 2020, 21:22
    • |
    • П М
  • Еще
Жил да был такой вот пост про сбер
smart-lab.ru/blog/650391.php

конкретно — вход на 600 мультов вверх от 211 по сберу 6 октября.
а сегодня выход на 600 мультов, но по 245 по сберу.

Снова "миллиард" в Сбере



Задачка для средней школы, друзья. Игра окончена.

Почти пасссивная арбитражная опционная стратегия

    • 10 ноября 2020, 20:41
    • |
    • Gerasya
  • Еще
Цель стратегии получать рыночно-нейтральный пассивный рублёвый доход выше высокодоходных облигаций. При этом ликвидность средств в стратегии теряется чуть более чем полностью (но точно лучше чем в недвижимости) и нужно нажимать периодически кнопки и заходить в брокерское приложение.
 
Естественно возможно такое уже давным давно придумали и вообще это не работает.

Основа стратегии — взаимосвязь между курсом рубля/доллара и акциями Сбербанка (но вообще подошли бы любые два актива которые на дистанции склонны к росту и при этом часто двигаются противоположно), когда одно вверх как правило другое вниз, при этом лучше всего когда и то и другое вверх, либо всё стоит примерно на месте. Угроза для стратегии: акции Сбербанка вниз + укрепление рубля, т.е. возможный сценарий разрушения стратегии и потери денег (но тоже необязательно всегда можно закинуть доп. деньги под ГО, плюс макс. потери всё равно ограничены но должником остаться можно): банкротство Сбербанка + обесценивание доллара до 0 рублей за 1 доллар = макс. потери.

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

Как я обнаружил Грааль "плечевой" торговли

Решил проанализировать свою торговлю за прошедший год, с осени 2019 по осень 2020. Обычно такое делают в конце года, но тогда мне, скорее всего, будет не до этого, поэтому решил сделать это сейчас.

И внезапно обнаружил, что этот год оказался, по моим меркам, рекордно прибыльным. До этого, несмотря на увеличения счёта внутри года на 100-200%, на долгосроке все эти результаты размывались и год закрывался или в существенный убыток, или в 0, или в скромнейшие (и совершенно неприемлемые для плечевой торговли) 15-25% годовых.

В этом же году уже получаются +65%, причём это именно постепенно накопленный результат, а не следствие взятого однажды импульса.

Неужели я научился торговать?

Стал проверять это смелое предположение. 

Первым делом посмотрел на эквити.

Она, как была «пьяной» и шатающейся туда-сюда по воле ветра трендов, так и осталась. 

Может просто повезло и было много трендов? 

Так их и раньше было много, лови — не хочу. Значит, дело и не в этом. 



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

Python. Импорт данных OHLCV из файла CSV.

    • 02 ноября 2020, 22:55
    • |
    • 3Qu
  • Еще

Простите за банальность, работа с данными начинается с их получения из внешнего источника. Мы будем получать их из CSV-файла архива котировок, скачанного с сайта Финам. Для работы с другими источниками вам надо будет немного изменить программу.

Я уже давно не работаю непосредственно с CSV, и храню все данные в БД SQLite. Поначалу я хотел написать программу чтения CSV с нуля, но выяснилось, что я уже подзабыл как это делается, однако нашелся рояль в кустах — моя старая библиотека читающая данные из CSV-файла непосредственно в программу. Ее мы и будем использовать.
Собственно, Python и ориентирован на работу с библиотеками, и не нужно знать что там внутри, важно только уметь с ними работать, а сами программы с использованием библиотек станут очень простыми.
Для начала качаем с Финам историю в формате CSV-файла следующего вида:

<TICKER>,<PER>,<DATE>,<TIME>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>
SPFB.Si-12.20,1,04/05/20,10:00:00,76900.0000000,76990.0000000,76900.0000000,76990.0000000,3
SPFB.Si-12.20,1,04/05/20,10:06:00,77695.0000000,77695.0000000,77400.0000000,77400.0000000,8
SPFB.Si-12.20,1,04/05/20,10:08:00,77781.0000000,77781.0000000,77700.0000000,77750.0000000,30
SPFB.Si-12.20,1,04/05/20,10:13:00,78088.0000000,78098.0000000,78088.0000000,78098.0000000,6
SPFB.Si-12.20,1,04/05/20,10:14:00,78100.0000000,78100.0000000,78100.0000000,78100.0000000,1


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

Zigzag_MNK

Zigzag_MNK

Settings=              
        {                          
            Name = "Zigzag_MNK",   -- название индикатора
            delta=1.0,                  -- дельта зигзага 
            showperiod=5000,--колич баров за которые строится			
            line=                                     
                {                               
                    {  
                        Name = "zigzagline2",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(255,0, 0)
                    }					
                }
       }


function Init()

    vMin = 0
    vMax = 0
    vMinindex = 0
    vMaxindex = 0
    voldMinindex = 0
    voldMaxindex = 0
	
    a1 = 0
	a2 = 0
	a3 = 0
	a4 = 0
	cind = 0
	v = null
	vFrom=0
	
	vsl = 0

  return 1
end

function calcmnk(index, vFrom, a1, a2, a3, a4, cind, vMinindex, vMaxindex)
  v = null 
  v2 = null 
  showperiod = Settings.showperiod
  if index-1 > 1 and vFrom > 1 and index > Size()-showperiod then 
  
        --[[
        for i=vFrom, index-1 do 
	     a1 = a1+i*C(i)
	     a2 = a2+i
	     a3 = a3+C(i)
	     a4 = a4+i*i	
        end  

         for i=index, index do 
	      a01 = a1+i*C(i)
	      a02 = a2+i
	      a03 = a3+C(i)
	      a04 = a4+i*i	
         end  		
		
        n = index - vFrom + 1	   
	   
	    if((n*a04 - a02*a02) ~= 0) then
	     a = (n*a01 - a02*a03)/(n*a04 - a02*a02)
		 b = (a03 - a*a02)/n		
         v = a*index + b		 
        end 
		--]]

         a1 = 0
	     a2 = 0
	     a3 = 0
	     a4 = 0
		 
		vto = index 
		 if vMinindex < vMaxindex then  
		   vto = vMaxindex 
		 end 
		 if vMinindex > vMaxindex then  
		   vto = vMinindex
		 end 		
		 
        for i=vFrom, vto do 
	     a1 = a1+i*C(i)
	     a2 = a2+i
	     a3 = a3+C(i)
	     a4 = a4+i*i	
        end  	
		
        n = vto - vFrom + 1	   
	   
	    if((n*a4 - a2*a2) ~= 0) then
	     a = (n*a1 - a2*a3)/(n*a4 - a2*a2)
		 b = (a3 - a*a2)/n		
         v = a*index + b		 
        end

	
		vmindel = 0
        for i=vFrom, vto do 
		 y = a*i + b	
		 if vMinindex < vMaxindex and y - C(i) > vmindel then  
		   vmindel = y - C(i)
		 end 
		 if vMinindex > vMaxindex and C(i) - y > vmindel then  
		   vmindel = C(i) - y
		 end 		 
        end  

        y = a*index + b	
		 if vMinindex < vMaxindex then  
		   v2 = y - vmindel
		 end 
		 if vMinindex > vMaxindex then  
		   v2 = y + vmindel
		 end 
		 
		 if vMinindex < vMaxindex and O(index) < v2 and vsl == 0 then  
		   vsl = C(vMaxindex)
		   v2 = vsl
		 end 
		 if vMinindex > vMaxindex and O(index) > v2 and vsl == 0 then  
		   vsl = C(vMinindex)
		   v2 = vsl
		 end 
		 
		 if vsl ~= 0 then
		   v2 = vsl
		 end 
		 
	
		 if vMinindex < vMaxindex and O(index) > vsl and vsl ~= 0 then  
		   vsl = 0 --v2 = y - vmindel
		 end 
		 if vMinindex > vMaxindex and O(index) < vsl and vsl ~= 0 then  
		   vsl = 0 --v2 = y + vmindel
		 end 
  
	 --[[
  --]]		 

	
        cind = index  
  end 		
  return v, v2	
end 


function OnCalculate(index)
  
  v = null
  v2 = null 
  if index < 3 then
    vMin = C(index)
    vMax = C(index)
    vMinindex = index
    vMaxindex = index
    voldMinindex = index
    voldMaxindex = index
  else
   --if index > 18000 then         
    if voldMaxindex >= voldMinindex then
      if C(index) > (1 + Settings.delta/100)*vMin then
        vMin = C(index)  
        vMax = C(index) 
        vMaxindex = index
        voldMinindex = vMinindex 
        vFrom = vMinindex  
		
		vsl = 0		
		
        a1 = 0
	    a2 = 0
	    a3 = 0
	    a4 = 0
		v, v2 = calcmnk(index, vFrom, a1, a2, a3, a4, cind, vMinindex, vMaxindex)
		
		--[[
        for i=vFrom, index-1 do 
	     a1 = a1+i*C(i)
	     a2 = a2+i
	     a3 = a3+C(i)
	     a4 = a4+i*i	
        end  

         for i=index, index do 
	      a01 = a1+i*C(i)
	      a02 = a2+i
	      a03 = a3+C(i)
	      a04 = a4+i*i	
         end  		
		
        n = index - vFrom + 1	   
	   
	    if((n*a04 - a02*a02) ~= 0) then
	     a = (n*a01 - a02*a03)/(n*a04 - a02*a02)
		 b = (a03 - a*a02)/n		
         v = a*index + b		 
        end 
	
        cind = index  		
		   	--]]
      else     
       if vMin > C(index) then
          vMin = C(index)
          vMinindex = index
          vFrom = voldMaxindex      
      --  else
      --    vFrom = vMinindex 
        end
	
	
	    v, v2 = calcmnk(index, vFrom, a1, a2, a3, a4, cind, vMinindex, vMaxindex)
	
	 --[[
		if cind ~= index then
         for i=index-1, index-1 do 
	      a1 = a1+i*C(i)
	      a2 = a2+i
	      a3 = a3+C(i)
	      a4 = a4+i*i	
         end  
		end 
		
         for i=index, index do 
	      a01 = a1+i*C(i)
	      a02 = a2+i
	      a03 = a3+C(i)
	      a04 = a4+i*i	
         end  		
		
        n = index - vFrom + 1	   
	   
	    if((n*a04 - a02*a02) ~= 0) then
	     a = (n*a01 - a02*a03)/(n*a04 - a02*a02)
		 b = (a03 - a*a02)/n		
         v = a*index + b		 
        end 		
			
		cind = index  
		   	--]]
      end
    else
     
    if voldMaxindex <= voldMinindex then
      if C(index) < (1 - Settings.delta/100)*vMax then
        vMax = C(index) 
        vMin = C(index)  
        vMinindex = index
        voldMaxindex = vMaxindex
        vFrom = vMaxindex
		
		vsl = 0
		
        a1 = 0
	    a2 = 0
	    a3 = 0
	    a4 = 0
		v, v2 = calcmnk(index, vFrom, a1, a2, a3, a4, cind, vMinindex, vMaxindex)
		
	--[[
        for i=vFrom, index-1 do 
	     a1 = a1+i*C(i)
	     a2 = a2+i
	     a3 = a3+C(i)
	     a4 = a4+i*i	
        end  		
	   
         for i=index, index do 
	      a01 = a1+i*C(i)
	      a02 = a2+i
	      a03 = a3+C(i)
	      a04 = a4+i*i	
         end  		
		
        n = index - vFrom + 1	   
	   
	    if((n*a04 - a02*a02) ~= 0) then
	     a = (n*a01 - a02*a03)/(n*a04 - a02*a02)
		 b = (a03 - a*a02)/n		
         v = a*index + b		 
        end 	
		
        cind = index  			
		   	--]]
      else 
        if vMax < C(index) then
          vMax = C(index)
          vMaxindex = index
          vFrom = voldMinindex    
       -- else  
         -- vFrom = vMaxindex          
        end
		
		v, v2 = calcmnk(index, vFrom, a1, a2, a3, a4, cind, vMinindex, vMaxindex)

--[[
     	if cind ~= index then
         for i=index-1, index-1 do 
	      a1 = a1+i*C(i)
	      a2 = a2+i
	      a3 = a3+C(i)
	      a4 = a4+i*i	
         end  
		end 
		
         for i=index, index do 
	      a01 = a1+i*C(i)
	      a02 = a2+i
	      a03 = a3+C(i)
	      a04 = a4+i*i	
         end  		
		
        n = index - vFrom + 1	   
	   
	    if((n*a04 - a02*a02) ~= 0) then
	     a = (n*a01 - a02*a03)/(n*a04 - a02*a02)
		 b = (a03 - a*a02)/n		
         v = a*index + b		 
        end 	
		
		cind = index  
      	--]]	
      end  
    end
    end
  -- end 
	
	
	--[[
        a1 = 0
	    a2 = 0
	    a3 = 0
	    a4 = 0
        for i=vFrom, index do 
	     a1 = a1+i*C(i)
	     a2 = a2+i
	     a3 = a3+C(i)
	     a4 = a4+i*i	
        end  
		
        n = index - vFrom + 1	   
	   
	    if((n*a4 - a2*a2) ~= 0) then
	     a = (n*a1 - a2*a3)/(n*a4 - a2*a2)
		 b = (a3 - a*a2)/n		
         v = a*index + b		 
        end 	
		
		--]]
 
 --[[
    for i = vFrom, index do
      k = (C(index)- C(vFrom))/(index- vFrom);
      v = i*k + C(index) - index*k
      SetValue(i, 1, v)
    end   --]]
 
  end   
  
  return v2

end

Алгоритмическая торговля с помощью самообущающегося DQN агента.

Аллоха!

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

Для эксперемента было выбранно 200 дней в обучающую выборку и 50 в тестовую. Обучались два DQN агента, один использовал Q-Network, второй Q-RNN-Network. На картинке можно видеть результаты обоих агентов после обучении на 700 итераций.

Алгоритмическая торговля с помощью самообущающегося DQN агента.



Проверялась работа агентов на 80 эпизодах по 10 раз. Как можно видеть агент использующих QRnnNetwork показал вполне себе неплохие результаты. Так что вполне возможно, что при правильной готовке можно получить таки самостоятельного агента, способного торговать не хуже чем сконструированная стратегия.

Кому интересно как создать агента при помощи TF-agents фреймворка, а так же узнать больше деталей, прошу смотреть видео. Код можно найти на гитхабе, ссылка в описании к видео.




Я нашел ГРААЛЬ!!

 

Вот так пишут обычно все))). Я тоже можно так сказать его нашел, но только не грааль в привычном понимании этого слова.  А некоторые фишки, которые так скажем, существенно влияют на результат торговли.  В частности на данный момент этих фишек 3. Причем последнюю узнал всего 2 недели назад.

В этой статья я конечно не буду их раскрывать. Но попробую дать намек и пытливый ум возможно, о них додумается. Но профессионалы конечно  о них уже знают. Поэтому это больше для начинающих.

  1. Одна из основных, которую я понял примерно 1.5 года назад. Не все сводиться к цене и объему торговли. Т.е. улучшение торговли может произойти, не только лучшей ценой входа, выхода, или РМ или ММ. Но и при эффективным управлением капиталом (депо). И это не относиться к расчету количества лотов на вход.

 

  1. Нет идеальных систем. Все в какой-то момент времени теряют, а в какой-то момент времени  зарабатывают. Но что это нам дает?  Тут ключевая фраза «в какой-то момент времени»


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

quik - lua. буду очень благодарен за помощь.

  При написании скриптов пользуюсь notepad++ и встроенным интерпретатором языка LUA в quik для отладки достаточно только одной функции message. Опробование и отладку всегда производил на учебном счете Открытия и тут они поступили как то крайне нелогично, ввели по срочному рынку 19 — значные заявки, а квик оставили седьмой версии и интерпретатор LUA 5.1 и он просто не может работать с такими числами.  Причем на реальном рынке сначала они ввели квик 8 версии с интерпретатором LUA 5.3, а потом только длинные ордера. Как можно к учебному квику 7 версии привязать интерпретатор LUA 5.3?
  • обсудить на форуме:
  • Quik Lua

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