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

по

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

    • 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

Полуавтоматический модуль - добавили фильтрацию по фракталу

Расширяем наш модуль в TSLab и насыщаем фильтрами.


Полуавтоматический модуль - добавили фильтрацию по фракталу

Добавили фракталы. Можно выбрать либо по 3 свечам либо по 5.

Следующим шагом делаем проверку актуальности образования фрактала и пробития цены, например, не дальше чем 10 минут или час. Кроме того добавили фильтрацию по объему и размеру движения. То есть если был всплеск объема при подходе к цене, то вероятно мы пронесемся мимо уровня в направленном движении.

Добавили в модуль лонги. Реализована возможность входить лонг и шорт  одновременно (если есть желание).

Наша торговля

На текущий момент криптовалюты в передышке от направленного движения, потому конечно можно поторговать боковик немного от 400 до 410.

Так как сейчас в программе тслаб на бинансе есть спот, коин и фьючерс — уточню, что речь про фьючерс. На коине будут немного другие ориентиры цен.

При открытии реальных сделок внезависимости от результата — будет в статье актуализация информации.


Сам скрипт можно скачать тут
Живое общение в телеграмм канале t.me/tslabprorugroup
Скачать и начать использовать программу www.tslab.pro/ru-RU/home для binance, okex, lmax — бесплатно

  • обсудить на форуме:
  • TSLab

Библиотека трейдера. Ч3. VSA. Классификация баров.

Все бары (или свечи), кому как удобней,  можно разделить всего на 3 (три) категории.

 1.Толчковые  бары (push bar)

 а) Толчковый лонг — свеча белая,  ОИ+.*
б) толчковый шорт- свеча черная, ОИ+.

 2.Тормозные бары (pull bar)


 а) Лонгокрыл- свеча черная, ОИ-.
б) Шортокрыл- свеча белая, ОИ-. 

3.Быры перераспределения (redistribution)


 а) Перераспределение лонгов- свеча чёрная,  ОИ — без изменений.
б) Перераспределение шортов- свеча белая,  ОИ — без изменений. 

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

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