комментарии Sergey Pavlov на форуме

  1. Логотип FXMM ETF
    FXMM vs короткие ОФЗ

    В последнее время распространяется мнение о том, что FXMM это прекрасный финансовый инструмент для парковки рублей, что подкрепляется убедительными рассказами о самой высокой надежности американских биллов, а также иллюстрируется графиком, у которого почти нет просадок. Почти это значит пренебречь хвостами отдельных свечек. Если подходить формально и мерить эти хвосты, то просадки в FXMM по -5-6% случаются. Поскольку пока эти просадки длятся недолго (в пределах одного дня), то вроде как можно считать данный инструмент беспросадочным.

    Поскольку тема с парковкой рублей (либо свободного остатка по счету либо всего счета на какое-то время) актуальна и для т.н. инвесторов и т.н. спекулянтов, попробуем объективненько разобраться, кто выгоднее: короткие ОФЗ или FXMM.

    Из ОФЗ я буду рассматривать только ПД: 26208 (191 дней до погашения), 26216 (268 дней до погашения) и 26210 (478 дней до погашения). В этом же порядке будем смотреть на картинки.

    FXMM vs короткие ОФЗ
    читать дальше на смартлабе
  2. Логотип ОФЗ
    FXMM vs короткие ОФЗ

    В последнее время распространяется мнение о том, что FXMM это прекрасный финансовый инструмент для парковки рублей, что подкрепляется убедительными рассказами о самой высокой надежности американских биллов, а также иллюстрируется графиком, у которого почти нет просадок. Почти это значит пренебречь хвостами отдельных свечек. Если подходить формально и мерить эти хвосты, то просадки в FXMM по -5-6% случаются. Поскольку пока эти просадки длятся недолго (в пределах одного дня), то вроде как можно считать данный инструмент беспросадочным.

    Поскольку тема с парковкой рублей (либо свободного остатка по счету либо всего счета на какое-то время) актуальна и для т.н. инвесторов и т.н. спекулянтов, попробуем объективненько разобраться, кто выгоднее: короткие ОФЗ или FXMM.

    Из ОФЗ я буду рассматривать только ПД: 26208 (191 дней до погашения), 26216 (268 дней до погашения) и 26210 (478 дней до погашения). В этом же порядке будем смотреть на картинки.

    FXMM vs короткие ОФЗ
    читать дальше на смартлабе
  3. Логотип Финам
    Финам "шалит" на ровном месте

    Вот опять пришло письмо:

    Обращаем Ваше внимание, что стоимость портфеля по брокерскому договору №КлФ-ХХХХХХ приближается к уровню минимальных требований поддержания маржинальных позиций.
    На 19/06/2018 14:02 стоимость собственных средств составляет:
    -хххххх руб.
    В течение 5 минут брокер будет вынужден принудительно сокращать ваши позиции в последовательности, определяемым брокером и в соответствии с законодательством Российской Федерации и п. 4. Приложения №26 Регламента брокерского обслуживания до значений начальных требований поддержания маржинальных позиций «значение начальной маржи из риска».

    Финам говорит мне о том, что собственных средств якобы -40% (примерно).
    На счете всё в порядке. Примерно 50% счета это свободные рубли сейчас. Утром распродал синтетическую облигацию.

    Если в спокойное время Финам «шалит», то что будет в неспокойное время? Он же может по ошибке зарезать позиции автоматом, а я, например, поздно это замечу… подумалось мне:)
  4. Логотип Финам
    Финам "шалит"

    Финам прислал маржин-коллы.
    На одном счете написал, что собственные средства где-то -120%. На другом -380%.
    Ну и, конечно, напугал тем, что принудительно всё прикроет.
    Счета ЕДП.

    Есть у кого такое в финаме?
  5. Логотип Сбербанк
  6. Логотип Сбербанк
    Шортистам сбера

    1. Шорт стоит примерно столько же (по порядку величин) сколько и среднегодовая доходность сбера B&H за 20 лет.
    2. Очевидно, что мы не можем отрицать возможности заработка на шорте, но, если это плохо получается от лонга, то ожидать, что это получится от шорта — наивная глупость.
    3. Плохо зарабатывать от лонга это пытаться словить альфу, но не превзойти среднегодовые 20-30% сбера в B&H. Хотя тут можно поспорить.
    4. Бывали времена, когда сбер за год успевал удвоиться, утроиться, учетвериться и не только.
    5. Если предположить, что сбер за ближайший год удвоится, то дойдет до 500 рублей. Это вполне реально, хотя и не гарантировано.
    6. Шорт сбера через фьюч даст преимущество перед шортом спота только при длительном удержании шорта (более недели хотя бы).

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

    Скорейшая схема разорения: усреднять шорт сбера.
  7. Логотип Финам
    Александр Горчаков возглавил направление алготрейдинга в "ФИНАМ"

    Можно поздравлять Александра Борисовича с новым местом работы
    и ждать от сервиса КОМОН еще больше всяких приятных приятностей!

    пруф
  8. Логотип Сбербанк брокер
    Как я стал клиентом брокерского обслуживания в Сбербанке

    Не забавы ради, а для пользы продолжаю коллекционировать брокеров.
    Настал черед воспользоваться услугами и возможностями этого монстра:)
    Клиентом традиционного банковского обслуживания в сбере я являюсь более 10 лет и всем доволен.

    Открытие брокерского счета потребовало моего физического присутствия в одном из обычных офисов.
    Всё заняло не более 10 минут.

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

    В этот же (следующий после подписания бумаг) день я перевел денюжку через сбербанк-онлайн на счет. Без комиссий. Деньги увидел уже через 30 минут.

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

    Комиссии на срочке маленькие. Комиссии на фонде большие.

    Ничего негативного, всё понравилось. Почти не спамят сообщениями.

    Буду исследовать его в действии.
  9. Логотип Quik Lua
    Как в квике получить текущую позицию по бумагам

    Коллеги! Помогите решить простую задачку.

    Дано: имеются позиции по бумагам (TQBR).

    Надо: получить текущую позицию по каждой бумаге при помощи LUA.

    Пробовал пользоваться таблицами depo_limits, firm_holding и account_balance.

    Хоть каких-то чисел добился лишь через таблицу depo_limits следующим кодом:
    pos1={}
    pos2={}
    for j=0,getNumberOf("DEPO_LIMITS")-1 do
     pos1[#pos1+1]=getItem("DEPO_LIMITS",j).sec_code
     pos2[#pos2+1]=getItem("DEPO_LIMITS",j).currentbal
    end
    Проблема такого варианта в том, что он показывает ненулевые значения в currentbal только для позиций, которые были открыты ранее (возможно, по которым прошло +2 дня). По позициям, которые были открыты сегодня, он точно показывает 0.

    Подскажите, как правильно решить эту задачку?

    Премного благодарен:)
  10. Maximus, делать зарабатывающие системы на рыке (инженерия) и развивать бизнес (организация, управление) — разные компетенции. Редко, когда один человек одинаково успешен в обеих.
  11. Maximus, масштабирование, доступ к определенным ресурсам, наличие (если и небольшой, но стабильной) за, коллектив. В одиночку многого не сделаешь:)
  12. Логотип Открытие
    Про открытие

    Сегодня у меня закончился срочный вклад в Открытии.
    Пришел, забрал.
    Без проблем.
    Очередей или ажиотажа не заметил.
  13. Логотип Quik Lua
    Код робота на 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
    
  14. Логотип TSLab
    2017: мои июньские итоги

    По деньгам на каких-то счетах небольшой плюс, где-то около нуля.

    По всяким технологичным штукам. Вёл эксперимент по сравнению, кто лучше торгует. Через второй тслаб у меня три брокера: экзанте, финам, айтиинвест. Торгуется одно и то же. В 90% случаев первым заявки ставит экзанте (фикс). В 10% случаев его опережает финам (высокоскоростной транзак). Заявки через айтиинвест (смартком) ну просто всегда ставятся последними и получают самую худшую цену сделки (я бью по стакану лимиткой со смещением в два-три шага цены).

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

    С одной стороны, жаль, что нет движений а-ля 2014 или 2015, тогда было так легко делать по 10-20% за несколько дней при втором-третьем плече. С другой стороны, полезно, что подряд пошел второй год тухлого рынка. Я разбавил наконец свой трендовый подход контртрендом.

    Алгопортфель (с хэджем) на акциях это рабочая тема. Из всего, что у меня торгуется, за последние пару месяцев это оказалось одним из лучших по результатам. Использую пока около 20 бумаг. Вполне нормально закладывать издержки в 0.2% при тестах — в это реально укладываться (пока).

    Опционы. Интересная тема. Торгую их от продажи с хэджем дельты по широкому шагу (хэдж ведется непрерывно, а не при выходе цены за какой-то диапазон, убыточный с точки зрения экспирации). Эта тема также прибыльной оказалась пока. Поскольку дельта-хэдж у меня слабо чувствителен к колебаниям внутри дня, то интересно, как это всё отработается, если что-то типа планок произойдет. На истории тестировал в два приема: с 2006 года и с 2013 года. Тесты трудно верифицируемы на близость к реальности, но говорят, что небелые лебеди не должны меня уничтожить, дельта-хэдж спасет. Был бы рад, если бы в этом году случилась хотя бы одна планка где-нибудь за недельку до экспирации — посмотреть бы на это.
  15. Логотип TSLab
    Глюки второго тслаба часть 1

    На текущий момент наблюдаю два устойчивых сценария падения второго тслаба:
    1. Переименование скрипта, на основе которого создан, но остановлен агент.
    2. Нажатие кнопки «старт» в оптимизации.
    Второй сценарий актуализировался после последнего обновления.
    Первый сценарий наблюдается очень давно.
  16. SergeyJu, есть еще вариант — взять данные по фьючерсам прямо с биржи. Получится набор из десятков файлов, но для теста все равно придется же самому склейкой заниматься. Так что тут и так неудобно и так неудобно. Хотя, если торговля частая внутри дня, то вариант с биржевым фтп и раздельными контрактами лучше.
  17. Было бы что красть и было бы чему утекать… Самое ценное в этой сфере — люди, имеющие опыт создания работающих «вещей». От их кражи или утечки страдают компании.
  18. Иван Ру, там всё просто. Примерно 10-го числа каждого квартала они с друзьями… Надо лишь знать, в какую дату у них случается гэп из-за склейки, чтобы его правильно на истории отторговать.
Чтобы купить акции, выберите надежного брокера: