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

по

Качаем котировки с Финама

Недавно начал учить язык программирования Python. Жаль, что я к нему приступил в 36 лет, а не в 16. Он прекрасно подходит для анализа исторических данных. Выкладываю скрипт, который заходит на сайт финама, скачивает оттуда котировки акций и записывает их в файл quotes.txt. Для того, чтобы всё работало, должен быть установлен Питон https://www.python.org/.
---
В интернете есть информация, как качать котировки с Финама не вручную, а с помощью скрипта. Вот эти статьи. Ими я пользовался при написании своего кода:
Программный сбор данных о котировках
Загрузка котировок валют с сайта finam.ru
Дополнительно пришлось хорошенько поработать головой, чтобы адаптировать эту информацию для моих нужд. Там кое-что устарело и коды авторов потребовали доработки. Также в моём скрипте вы найдёте цифровые символы, которые соответствуют каждой акции. Например Алроса лежит на сайте финама под цифрой 81820.

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

О «теореме Ферма» теории вероятностей или о нормальности «бытия» (много буков)

    • 16 октября 2018, 16:41
    • |
    • А. Г.
      Проверенный аккаунт
  • Еще

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

 О «теореме Ферма» теории вероятностей или о нормальности «бытия» (много буков)
 

А точнее даже не о нем самом, а об известной центральной предельной теореме (ЦПТ) применительно к ценам.  Что такое центральная предельная теорема в ее классическом виде?

Пусть нам дана некоторая сумма большого числа случайных величин Х=х1+…+хN где каждое слагаемое имеет конечную и ненулевую дисперсию (как мы увидим далее в приложении к ценам это условие выполняется). Человечество давно еще с 18 века (Муавр и Лаплас) заинтересовал вопрос распределения случайной величины Х или хотя бы его более-менее точного приближения.

Не будем слишком строги в определениях всяких сходимостей и их скоростей, а сформулируем классическую  ЦПТ в виде интуитивно понятного, но нестрогого термина «близости». Так вот, если xi – независимы (кто хочет может посмотреть строгое определение независимости, а для менее пытливых скажу только, что корреляция двух независимых случайных величин с конечными дисперсиями – нуль, хотя и обратное не верно), то распределение Х при достаточно больших N практически не отличается от нормального распределения со средним А и дисперсией D, где А – сумма средних x



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

Теория игр. Кормилица наша.

Вот эта книга достойна по праву получить 5 баллов, т.к. для тру-трейдера стратегическое мышление и умение постоянно себя поддерживать в форме как любому спортсмену во время ежедневных тренировок — это просто жизненная необходимость!

Эту книгу читал много раз и затем снова перечитывал, т.к. многие вещи забываются, а что-то и вообще тяжело понять с первого раза.

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

Первая курсовая работа с использованием теории игр была написано мной где-то в 2006 году, я помню USD/JPY по 120. Затем она опускалась до 80 и совсем недавно снова возвращалась на 120.

Очень хорошее было время, вспоминаю с ностальгией все эти курсовые и дипломную работу...

«Теория игр – сравнительно молодая наука: ей исполнилось немногим более семидесяти лет, тем не менее она уже предоставила много полезной информации в распоряжение практикующих специалистов по стратегиям. Но как и все остальные науки, теория игр слишком перегружена специальной терминологией и математическими выкладками. Это, бесспорно, важные инструменты научных исследований, но они ограничивают круг людей, способных понять базовые концепции теории игр, исключительно специалистами в этой сфере. Основным мотивом для написания книги «Стратегическое мышление» была наша убежденность в том, что теория игр слишком интересна и важна, чтобы ограничивать область ее применения публикациями в академических журналах. Основные концепции этой теории способны принести пользу во многих областях, в том числе в бизнесе, политике, спорте и даже в повседневном социальном взаимодействии. Вот почему мы сформулировали самые важные концепции теории игр на более понятном языке и заменили сугубо теоретические рассуждения примерами из реальной жизни.»

Это книга действительно написана простым языком и читается с большим интересом.

Изучение теории игр поможет разобраться более детально в основных концепциях нашей с вами любимой игры под названием «фондовые рынки», где с одной стороны мы, а с другой стороны ММ/кукл/или другой игрок.

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

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

Поэтому всем роботописателям желаю удачи в поисках Грааля!

QUIKSharp почти достиг 1.0, so what?

QUIKSharp - самый удобный и единственный действительно open-source коннектор к Квику — приближается к версии 1.0 и к трехлетию (OMFG, как быстро крипторынок растет время течет!). Правда 1.0-beta уже почти как полноценный 1.0.

Прошлое предновогоднее обновление  — благодаря Prophetic  — было очень продуктивным, закрыло важные для многих дыры, и добавило примеры. С тех пор мы допилили еще, а коннектором воспользовались приличное количество пользователей на ГитХабе, а также:
  • TSLab — спасибо, что добавили ссылку! Верю на слово, не скачивал после этого ;)
  • OsEngine — очень интересный проект. Виден серьезный подход к делу практикующими людьми. Спасибо за лучи поддержки, добрые слова в Readme (и за тот email, Alex)!


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

Парный трейдинг: фильтруем пары по смешанной корреляции

Этой статьей мы продолжим улучшать результы автоматического поиска пар для торговли. Дополнительным фильтром будем использовать измерения, доступные после построения регрессии методом statsmodels.api.OLS(). Этот же фильтр будем применять к парам во время торговли.

Найденные пары проверим в Quantopian, а исходный код напишем на Python.



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

Код робота на 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

Почему я считаю, что пузырь на рынке крипты даже еще не начинался или почему бизнесмен на помидорах скоро прогорит.

Почему я считаю, что пузырь на рынке крипты даже еще не начинался или почему бизнесмен на помидорах (http://smart-lab.ru/blog/407162.php) скоро прогорит.

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

Более того, на вполне обычные доводы по риск менеджменту со стороны обладателя капитала, связанными с а) выходом из сделки (market/settlement risk), т.е. где гарантии, что инвестор получит свои деньги обратно и б) по сути, посылая СанЭпидемНадзор, ФМС и налоговую подальше (в комментариях к посту), т.е. полностью лишая бизнес легитимности, тем самым еще больше увеличивая риск невозврата инвестиций, Mr. Помидор, ввиду, понятное дело, своей недальновидности и заплывшего мозга (от собирания сорняков, видимо), начал опять предлагать устроить какой то непонятный спор на совершенно другую тему, не относящуюся к основным рискам любого инвестора. Ну, да ладно. Бог ему судья, но я, со своей точки зрения, тоже готов поспорить, что рано или поздно все-таки гос.органы то навестят обязательно очень шустрого бизнесмена (тем более если он еще и расширяться там планирует) и еще неизвестно кто и куда там кого и как пошлет.

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

Инвестиционные стратегии для российского рынка акций

Инвестиционные стратегии на основе фундаментальных индикаторов, на первый взгляд, являются простым способом отбора акций. Во-первых, они относительно легки и интуитивно понятны в расчётах, во-вторых, они доказали свою эффективность, о чем можно прочитать в исследованиях, приведенных в книгах Stocks for the Long Run и What Works on Wall Street.

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

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



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

Инвестируем в победителей "величайшего события в истории цивилизации"

«Каждый аспект нашей жизни изменится. Если вкратце, то успех в создании искусственного интеллекта может стать крупнейшим событием в истории нашей цивилизации… Это будет либо лучшее, либо худшее, что когда-либо случалось с человечеством.» — Стивен Хокинг

Разговариваете ли вы со своим телефоном? Нет, я имею в виду не ПО телефону, а С телефоном. Задаете ли вы ему вопросы, чтобы узнать информацию, или даете команды в духе «отправить смс маме»?

Миллионы людей пользуются этими возможностями. Осознают они это или нет, они используют один из вариантов искусственного интеллекта.

«Мы находимся в самом центре роста… машинного обучения и искусственного интеллекта», — написал основатель компании Amazon Джеф Безос в недавнем письме акционерам.

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



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

Generalized Boosted Regression для предсказания направления движения рынка.

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

Описание самого пакета и примеры можно посмотреть тут http://cran.r-project.org/web/packages/gbm/gbm.pdf

Я покажу каких результатов добился тестируя этот метод совершая всего 2 сделки в день, на открытии и закрытии дня.

График доходности Out-of-Sample в сравнении с индексом ММВБ:
Generalized Boosted Regression для предсказания направления движения рынка.
Generalized Boosted Regression для предсказания направления движения рынка.

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

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