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

по

Облигационный портфель программиста

Подвел итоги по своему специальному облигационному счету. Год назад я положил на отдельный брокерский счет 800 000 рублей, где решил торговать только облигациями.
Через год баланс счета стал ровно 1 000 000. Т.е. за год я заработал 25% годовых. Дополнительные средства на счет не вносил, но всю прибыль реинвестировал.
Основные факторы:
1. Заходил в первичных размещениях, продавал на вторичке выше номинала.
2. Несколько раз рисковал, покупая просевшие в цене бумаги (СилМаш лучший из всех)
3. Реинвестирование купонов (появилось много бумаг с ежемесячным купоном, и это очень круто, реально повышает доходность).

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

Итак,

1. Участие в первичных размещениях.
Тут обязательно надо смотреть и отчетность эмитента и организаторов (их другие выпуски), т.е. проводить большую ручную работу.



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

13 курсов по финансам и инвестированию

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

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

Получить высшее финансовое образование в мировых вузах тоже можно онлайн. Поиск вариантов на DistanceLearningPortal

 

1. Курс «Финансовые рынки и институты»

Будет интересен тем, кто ищет вводный курс по финансовым рынкам.

Пройти курс на Coursera

Автор курса: Высшая школа экономики.

Планируемая продолжительность: 9 сессий (каждая — около двух—трех часов).

Стоимость: бесплатно, если не нужен сертификат. С сертификатом — 1836 рублей за курс.



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

Перепост с хабра на тему процесса создания программы Parse_Signal для автоматизация торговли через Tradingview. Плюс анонс сайта с данным проектом.

Всем добрый вечер!
Выкладываю свой пост с хабра о процессе написания программы Parse_Signal. Раскрываю технические аспекты создания программы.
Проблема: На текущий момент наиболее удобным и полноценным программным обеспечением (далее ПО) для автоматизации торговли на российском биржевом рынке является небезызвестный ТСЛАБ.   Несмотря на несомненные плюсы в виде удобного визуального редактора для написания торговых скриптов, который позволяет писать роботов даже без знания языков программирования, есть ряд недостатков, которые делают использование данного ПО для меня крайне не практичным. И думаю не только для меня, учитывая, что средний размер счёта на Мосбирже как правило не превышает 500 тыс.р… Читать полностью по ссылке...
Теперь у данного проекта появился отдельный сайт, где можно скачать актуальную версию программы, ознакомиться с инструкциями по настройке программы и запуске своего первого робота.

Внимание сайт пока оформлен на бесплатном хостинге, поэтому с мобильных устройств может быть недоступен.


Инструкция: Подаем налог по зарубежному счету

На выходных заполнял декларацию и решил заодно написать инструкцию как подавать 3-НДФЛ по зарубежному счету.

В отличие от российских счетов, где брокеры выступают налоговыми агентами, по зарубежному счету инвестор обязан подавать налог самостоятельно, заполняя 3-НДФЛ и подавая ее в налоговую до 30 апреля.

В дополнение к инструкции написал немного про то, как следует выбирать зарубежного брокера и привел несколько лайфхаков/своих файлов, которые помогут вам сэкономить на подаче декларации.

Как выбрать зарубежного брокера?

1) Смотрите на комиссии и покрытие зарубежных рынков (в идеале не только США, но и LSE/Азию, где обращаются некоторые российские компании). Помните про комиссию вашего банка за перевод за рубеж.

2) Обязательно — наличие лицензии SIPC. (это вещь как российское АСВ, я бы не понес деньги в банк, который не участвует в системе страхование вкладов)

3) Обратите внимание чтобы у брокера не было «банковского функционала», тогда вам не надо уведомлять об открытии такого счета налоговую и отчитываться особым образом.



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

Как эффективно шортить S&P 500

По секрету скажу что хотя я активный участник стороны лонга по S&P 500, но я тоже шорчу его, но вот только это делаю не на S&P 500, и это даже не шорт.

Обо всем по порядку.

И так мы шортим америку по разным причинам, например
1. Не любим америку или завидуем
2. Считаем америку перекупленным
3. Хотим охотиться на черных лебедев
4. Хеджируемся
5. По ТВ сказали что америке хана
6. Следим за Василием
7. И другие причины

Почти во всех случаях мы хотим заработать деньги.

Посмотрим график индекса S&P 500.

Как эффективно шортить S&P 500

Мы видим что хотя там бывают редкие периоды когда он падал на 50% или больше, но в основном и в долгосрок он прет вверх. Если мы не будем в шорте, то можем упустить момент падения, а если в шорте, то периодически будем ловить стопы, статистически не зарабатывая, а потеря деньги. Тут даже Put опционы сильно не помогут, они очень часто будут обесцениваться, при падении S&P 500 он может и не дойти до страйков наших Put опционов. То есть затраты будут больше и не известно когда рынок будет падать следующий раз, а если и будет падать то будет ли это достаточным чтобы хотя бы закрыт затраты.



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

Тестирование робота AVP в программе Wealth-Lab

    • 13 апреля 2019, 17:05
    • |
    • AlexChi
  • Еще

 

Введение


На сегодняшний день у меня есть три краткосрочные спекулятивные торговые системы и, соответственно, три одноименных торговых робота:
  1. CandleMax
  2. PVVI
  3. AVP

Описание и тестирование в программе Wealth-Lab первых двух роботов я уже приводил. Вот соответствующие ссылки:

Тестирование рабочей свечной модели на исторических данных

Тестирование модели CandleMax в программе Wealth-Lab

Индикатор PVV (price/volume/volatility)

Тестирование робота PVVI в программе Wealth-Lab

Сейчас настало время дать краткое описание и привести тестирование в программе Wealth-Lab третьей торговой системы, которая у меня сейчас в работе.

Торговая система AVP (average volume/price) не является свечной моделью, как CandleMax, и не основана на красивой математической формуле, как система PVVI. Из трех моих спекулятивных роботов, робот AVP выдает сигналы реже всех. Тем не менее, результативность этого робота практически совпадает с результативностью робота PVVI, лишь совсем немного ей уступая.



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

Доработал zigzag5

работа индикатора заключается в том, чтоб показать ближашие горизонтальные уровни (один снизу, другой сверху) и один наклонный

Доработал zigzag5
код индикатора:
Settings=              
        {                          
            Name = "Zigzag5",   -- название индикатора
            delta=2,                  -- параметр индикатора                          
            deltaY=1,                  -- параметр индикатора   			
            linedeltaY=0.75,                  -- параметр индикатора   				
            line=                                     
                {                               
                    {  
                        Name = "zigzagline3",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(0,255, 0)
                    },
                    {  
                        Name = "upline",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(255,0, 0)
                    },
                    {  
                        Name = "lowline",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(0,0, 255)
                    },
                    {  
                        Name = "declineline",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(255,0, 0)
                    },
                    {  
                        Name = "upline2",
                        Type =TYPE_LINE,
                        Width = 1,
                        Color = RGB(255,0, 0)
                    },
                    {  
                        Name = "lowline2",
                        Type =TYPE_LINE,
                        Width = 1,
                        Color = RGB(0,0, 255)
                    },
                    {  
                        Name = "declineline2",
                        Type =TYPE_LINE,
                        Width = 1,
                        Color = RGB(255,0, 0)
                    }				
                }
       }
	
	
function getradius(x, y)
  return math.sqrt(Settings.deltaY*y*y+x*x)
end

function koef(val)
  return 1 - 1/(1-1/val)
end


function Init()

  vMin = 0
  vMax = 0
  vMinindex = 0
  vMaxindex = 0
  voldMinindex = 0
  voldMaxindex = 0
  upval = 0
  lowval = 0
  upindex = 1
  lowindex = 1  
  veu = nil
  vel = nil
  curfrom = 1
  curto = 1

  return 7
end


function OnCalculate(index)
  local printz = 0
  vsize = Size()	  

  ve = nil
  veu = nil
  vel = nil 
  curv = nil 
  veu2 = nil
  vel2 = nil 
  curv2 = nil  
  
  if index == 1 then
    vMin = C(index)
    vMax = C(index)
    vMinindex = index
    vMaxindex = index
    voldMinindex = index
    voldMaxindex = index
    ve = C(index)  
	  
  else
         
    if voldMaxindex >= voldMinindex then
        
       
	  if C(index) > (1 + Settings.delta/100)*vMin then
         
        vMin = C(index)  
        vMax = C(index) 
        vMaxindex = index
        voldMinindex = vMinindex 
        vFrom = voldMaxindex  
        vTo = vMinindex
        printz = 1		
		
        if (C(vMinindex) > C(vsize)) and (upval > koef(getradius(vsize - vMinindex, C(vMinindex) - C(vsize)))) then
		  upval = koef(getradius(vsize - vMinindex, C(vMinindex) - C(vsize)))
		  upindex = vMinindex
		end
        if (C(vMinindex) < C(vsize)) and (lowval > koef(getradius(vsize - vMinindex, C(vMinindex) - C(vsize)))) then
		  lowval = koef(getradius(vsize - vMinindex, C(vMinindex) - C(vsize)))
		  lowindex = vMinindex
	   end	
	   
	    curfrom = voldMaxindex
	    curto = voldMinindex	  	   
	      	    
      else      
	  
        if vMin > C(index) then
          vMin = C(index)
          vMinindex = index
          vFrom = voldMaxindex      
          vTo = index
          printz = 0
		  curto = index		
        else
          vFrom = vMinindex 
          vTo = index
          printz = 0
        end 		
	  
	    curfrom = voldMaxindex	
		
      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 = voldMinindex
        vTo = vMaxindex
        printz = 1
	
        if (C(vMaxindex) > C(vsize)) and (upval > koef(getradius(vsize - vMaxindex, C(vMaxindex) - C(vsize)))) then
		  upval = koef(getradius(vsize - vMaxindex, C(vMaxindex) - C(vsize)))
		  upindex = vMaxindex
		end                   
        if (C(vMaxindex) < C(vsize)) and (lowval > koef(getradius(vsize - vMaxindex, C(vMaxindex) - C(vsize)))) then
		  lowval = koef(getradius(vsize - vMaxindex, C(vMaxindex) - C(vsize)))
		  lowindex = vMaxindex
		end		
		
	    curfrom = voldMinindex		
	    curto = voldMaxindex
		
      else 
	    	    
        if vMax < C(index) then
          vMax = C(index)
          vMaxindex = index
          vFrom = voldMinindex    
          vTo = index
          printz = 0
		  curto = index		
        else  
          vFrom = vMaxindex  
          vTo = index        
          printz = 0
        end
		
	    curfrom = voldMinindex
		
      end  

	
    end
    end
 
    if (printz == 1) or (Size() == index) then
      for i = vFrom, vTo do
        k = (C(vTo)- C(vFrom))/(vTo- vFrom)
        v = i*k + C(vTo) - vTo*k
        SetValue(i, 1, v)
        ve = v
      end   
      if (Size() == index) then
        ve = C(index)
        if voldMaxindex >= voldMinindex then
          vFrom = voldMaxindex 
          vTo = vMinindex
        end 
        if voldMaxindex <= voldMinindex then  
          vFrom = voldMinindex
          vTo = vMaxindex
        end 
        for i = vFrom, vTo do
          k = (C(vTo)- C(vFrom))/(vTo- vFrom)
          v = i*k + C(vTo) - vTo*k
          SetValue(i, 1, v)
        end  
           
        -- up level line 
        if upindex ~= nil then
		  if C(upindex) > C(index) then		
            for i = upindex, index do
              SetValue(i, 2, C(upindex))
              SetValue(i, 5, C(upindex)-Settings.linedeltaY*C(vsize)/100)			  
            end  	
            veu = C(upindex)	
          end 		  
		end
		
		-- low level line 
		if lowindex ~= nil then
		  if C(lowindex) < C(index) then
            for i = lowindex, index do
              SetValue(i, 3, C(lowindex))
              SetValue(i, 6, C(lowindex)+Settings.linedeltaY*C(vsize)/100)				  
            end  			
            vel = C(lowindex)
         end
       end		
        
       if voldMaxindex >= voldMinindex then     
	    vsign = -1
		if curfrom == voldMinindex then
		  vsign = -1
		end
		if curfrom == voldMaxindex then
		  vsign = 1
		end		

        -- inclined line
	    if curto- curfrom > 0 then
	     maxcurv = 0
	     k = (C(curto)- C(curfrom))/(curto- curfrom)
         for i = curfrom, curto  do        
          curv = i*k + C(curto) - curto*k	
          if vsign == -1 then  		  
 		    if L(i) < curv then
		      if maxcurv < curv - L(i) then
		        maxcurv = curv - L(i)
              end
            end
		  else
 		    if H(i) > curv then
		      if maxcurv < H(i) - curv then
		        maxcurv = H(i) - curv
              end
            end		  
		  end
         end   		
         for i = curfrom, index  do
          curv = i*k + C(curto) - curto*k + vsign*maxcurv	  
          SetValue(i, 4,curv)
		  curv2 = curv+ vsign*Settings.linedeltaY*C(vsize)/100
		  SetValue(i, 7,curv2)		  
         end   		
	    end
	    curv = nil	
	   end 
	  
       if voldMaxindex <= voldMinindex then
	    vsign = -1
		if curfrom == voldMaxindex then
		  vsign = 1
		end		
		if curfrom == voldMinindex then
		  vsign = -1
		end			
  
        -- inclined line
        if curto- curfrom > 0 then
         maxcurv = 0
         k = (C(curto)- C(curfrom))/(curto- curfrom)
         for i = curfrom, curto  do        
          curv = i*k + C(curto) - curto*k		  
          if vsign == -1 then  		  
 		    if L(i) < curv then
		      if maxcurv < curv - L(i) then
		        maxcurv = curv - L(i)
              end
            end
		  else
 		    if H(i) > curv then
		      if maxcurv < H(i) - curv then
		        maxcurv = H(i) - curv
              end
            end		  
		  end
         end   		
         for i = curfrom, index  do
          k = (C(curto)- C(curfrom))/(curto- curfrom)
          curv = i*k + C(curto) - curto*k + vsign*maxcurv	  		
          SetValue(i, 4,curv)
		  curv2 = curv+ vsign*Settings.linedeltaY*C(vsize)/100
		  SetValue(i, 7,curv2)
         end   		     
        end
	    curv = nil		
       end	  
	          
      end
    end

  end  
  
  return ve, veu, vel, curv, veu2, vel2, curv2  
  
end



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

Табличка NineNot для трейдера

    • 08 апреля 2019, 18:53
    • |
    • AlexChi
  • Еще

Введение


В воскресенье 7 апреля я перебирал полки в шкафах, просматривая старые бумаги и выбрасывая те, которые уже не пригодятся. За долгое время накопилось много бесполезного хлама, который надо было выбросить. Какие-то старые чеки, квитанции, ненужные распечатки. Так я перебирал бумаги одну за другой, сортируя, что пойдет на выброс, а что еще может когда-то пригодиться, и вдруг на пол упала до боли знакомая старая затертая картонка. Боже мой! Как давно это было! Вроде бы не так уж давно, но на самом деле целую трейдерскую жизнь назад! Воспоминания нахлынули на меня…

Затертая замусоленная старая табличка, обычный кусок картонки и неаккуратно приклеенная скотчем распечатка. Но сколько денег она мне помогла заработать, а сколько денег благодаря ей я не потерял!

Табличка NineNot для трейдера

                                       Табличка NineNot  (9 “не”).



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

Основы (дифуры Ито)

Был такой дядька. Киёси Ито. Работал в статистическом  управлении и писал книжки. Интернета тогда не было, поэтому он, как и Тимофей Мартынов, делал книжки из бумаги и писал в них ручками. Писал он о теории вероятности и стохастике, то есть про кроликов, и внимание. За эти работы он получил степень доктора философии. То есть, тут не столько вопрос в математике, сколько в философии.

Дифур это такой способ записи философской мысли. Когда вы рисуете каналы по лоу на графике, вы даже не задумываетесь, что это касательная, а значит производная функции цены от времени. Для записи мысли или идеи мы воспользуемся дифурами, а потом переведем их. В общем, их особо ни кто не решает. Берут справочник производных и вуаля.  dx/dt = α x => x(t) = x0 e^αt. Уравнение разряда конденсатора dx/dt.  У каждого уважающего опционщика такой справочник есть. Это греки опционов. Там дифур и его значение в обычной формуле, куда можно уже цифры подставить. И все.

Из предыдущего материала мы помним. dx = µ x dt + σ x δW. Мгновенное изменение цены=среднему изменению+размеру изменения*случайное изменение. Давайте этим философским языком пообщаемся. И легче всего это понять методом Кирилла Ильинского.



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

Индикатор ожидаемого движения для опционной торговли (Часть 2 устройство индикатора)

    • 05 апреля 2019, 11:25
    • |
    • FZF
  • Еще

В первой части мы рассмотрели «теорему о средней волатильности» где,  обозначили такое свойство:волатильности могут на разных таймфреймах значительно отличаться друг от друга. Но они всегда будут со временем сходится к одному  значению.

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

Price Channel (PC) или ценовой канал. Индикатор представляет из себя две линии, которые ограничивают канал колебаний цены. Верхняя граница канала обозначает уровень локального максимума за прошедшие N периодов, а нижняя граница – уровень локального минимума за тот же промежуток времени. Таким образом, цена ограничивается максимальными точками колебаний – экстремумами за N периодов.
Индикатор ожидаемого движения для опционной торговли (Часть 2 устройство индикатора)



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

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