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

по

Еще раз о ценообразовании опционов с отрицательными страйками.

На сайте cmegroup.com появилась таблица со вчерашними ценами закрытия опционов на нефть CLM0 с отрицательными страйками.
Тупо подобрал к ним параметры обобщенной модели. Получилось вот что. На первый взгляд, почти идеально.
Автору респект!
Еще раз о ценообразовании опционов с отрицательными страйками.




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

Неделю назад в  smart-lab.ru/blog/614244.php  я описывал плюсы и минусы стратегии <Опционы RTS против опционов Si> и пообещал проверить ее на недельных опционах. Исполнять обещание начал 21.04.20, то есть за три дня до экспирации. Правила были такие:
— Открывать позиции при отклонении текущей волатильности опциона RTS от расчетной на 20%, закрывать при нулевом отклонении
— Открывать обе ноги как можно ближе к деньгам
— ГО по портфелю не должно превышать 2 млн руб
Все недостатки стратегии, о которых я упоминал, проявились в полной мере
— открытые позиции ушли глубоко в деньги
— расхождения волатильностей увеличивалось до 80% от расчетных
С учетом того, что у меня были свободные средства и того, что все само-собой прикроется в 18:45 четверга, я не стал париться с закрытием старых позиций и по мере расхождения волатильностей просто открывал новые <на деньгах>.
Как следствие — задействованное ГО возросло до 5 млн., максимальная просадка счета достигала 64 тыс руб. Вариационка по дням:

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

Система BWS: с вероятностью 75% через неделю будем ниже

    • 15 апреля 2020, 21:16
    • |
    • AlexChi
  • Еще

Система BWS: с вероятностью 75% через неделю будем ниже


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

В таблице 1 приведены 32 наиболее ликвидные акции нашего рынка, упорядоченные по убыванию доходности за неделю с 08.04.2020 по 15.04.2020.

Система BWS: с вероятностью 75% через неделю будем ниже

                                                   Таблица 1.

Как легко заметить, только 2 из 32 бумаг закрыли неделю в плюсе. Это очень плохой результат. Если менее 25% акций из списка наиболее ликвидных закрывают неделю ростом, то по статистике вероятность того, что и следующая неделя закроется падением выше вероятности того, что будет рост.



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

Интеграция Lua и С++ (2)


Обмен данными между Lua и Сpp осуществляется через Lua-стэк, то есть через специальным образом структурированное (по принципу Last In — First Out) пространство. 


Интеграция Lua и С++ (2)

Иллюстрация процесса добавления переменных в Cтэк (Push) и извлечения переменных из Стэка (Pop).

Иными словами, Lua стэк — это одномерный массив переменных (список, строка) с прямой (от 1 до n) индексацией.



Заполняется стэк командами lua_push (С-side) :

void lua_pushnumber (lua_State *L, lua_Number n);
const char *lua_pushstring (lua_State *L,  const char *s);

и другими. 


Новой переменной в стэке Луа длинной n автоматически присваивается индекс [n+1] или [-1], где n+1 — абсолютный индекс переменной, а -1 — индекс новой переменной относительно конца (!) стэка. 




Доступ, к переменным, соответственно осуществляется функциями lua_to (C-side) :

lua_Number lua_tonumber (lua_State *L, int index);
const char *lua_tostring (lua_State *L, int index);
где L — указатель Lua-стэка, а index — абсолютный или относительный индекс переменной в стэке.

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

QLua: таблица крупных "склеенных" обезличенных сделок

    • 03 апреля 2020, 15:06
    • |
    • _sk_
  • Еще
Иногда хочется наблюдать за ситуациями, когда участники торгов исполняют по рынку крупные заявки. Конечно, можно смотреть на обычную ленту обезличенных сделок с настроенными фильтрами на размер сделки, но ведь можно написать специальный QLua-скрипт, который будет отбирать сделки, являющиеся результатом исполнения.

В терминале QUIK ордерлог недоступен, поэтому надо как-то эвристическим образом определить, что набор обезличенных сделок относится к одной и той же рыночной заявке. Например, можно проверять, что инструмент в текущей сделке совпадает с инструментом в предыдущей сделке, направление сделки то же самое, время сделки совпадает с точностью до миллисекунд, и цена при покупке растёт, а при продаже — падает.

Если суммарный объём не менее какой-то границы, которую можно задать для каждого инструмента индивидуально, такие «склеенные» сделки выводятся в таблице. В ней указаны:
— суммарный объём;
— количество обезличенных сделок, которые были склеены;
— начальная цена и конечная цена;

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

Скрипт lua Баланс покупок/продаж

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

TICER = "SBER";
CLASS_CODE = "TQBR";
FilePath = getScriptPath() .. "\\export.txt";--путь к файлу
save = false;--сохранять данные в файл если false нет, true да

f = nil;
stopped = false;
t_id = nil
H = -1;
M = -1;
VSELL = 0;
VBUY  = 0;
CDelta = 0;
CountTrans = 0;
PriceTrans = 0.0; 
t = "";
function OnInit()
    CountTrans = 0;
        if save then f = io.open(FilePath,"w"); end
        CreateTable();
end 

function main() 
        while not stopped do 
          if IsWindowClosed(t_id) then
         stopped = true;
      end       
          sleep(10);
        end
end

function CreateTable()
   t_id = AllocTable(); 
   AddColumn(t_id, 0, "Время", true, QTABLE_STRING_TYPE, 10);
   AddColumn(t_id, 1, "BUY", true, QTABLE_INT_TYPE, 10);
   AddColumn(t_id, 2, "SELL", true, QTABLE_INT_TYPE, 10);
   AddColumn(t_id, 3, "Дельта V", true, QTABLE_INT_TYPE, 10);   
   AddColumn(t_id, 4, "AVG Цена", true, QTABLE_DOUBLE_TYPE, 15);
   AddColumn(t_id, 5, "Накопленная Дельта", true, QTABLE_INT_TYPE, 15);
   AddColumn(t_id, 6, "Кол-во сделок", true, QTABLE_DOUBLE_TYPE, 12);   
   tab = CreateWindow(t_id);
   local NAME = tostring(getParamEx(CLASS_CODE,TICER,"LONGNAME").param_image);
   SetWindowCaption(t_id, TICER.." ("..NAME..") Баланс покупок/продаж");
   SetTableNotificationCallback(t_id, EventCallBack);
end

function Calc(alltrade)
        if bit.test(alltrade.flags, 0) then VSELL = VSELL+alltrade.qty;  --Продажа
        else VBUY  = VBUY+alltrade.qty;  end                            
        CountTrans = CountTrans+1;
        PriceTrans = PriceTrans+alltrade.price;                 
end

function OnAllTrade(alltrade)    
        if alltrade.sec_code == TICER then      
                local Rows, Col = GetTableSize(t_id);
                
                if H==-1 or H~= alltrade.datetime.hour then 
                        H = alltrade.datetime.hour;
                        M = alltrade.datetime.min;
                        t = tostring(alltrade.datetime.hour)..":"..tostring(alltrade.datetime.min);
                end
                if M==alltrade.datetime.min then
                        Calc(alltrade);
                else                                    
                M=alltrade.datetime.min;        
                        InsertRow(t_id, -1);                                               
                        local Delta = VBUY-VSELL;
                        Price = PriceTrans/CountTrans;
                        SetCell(t_id, Rows, 6, tostring(CountTrans));                   
                        SetCell(t_id, Rows, 0, t);
                        SetCell(t_id, Rows, 1, tostring(VBUY));
                        SetCell(t_id, Rows, 2, tostring(VSELL));                           
                        SetCell(t_id, Rows, 3, tostring(Delta));
                        local SEC_SCALE = tostring(getParamEx(CLASS_CODE,TICER,"SEC_SCALE").param_value);
                        SEC_SCALE = string.format("%.0f",SEC_SCALE);                    
                        SetCell(t_id, Rows, 4, string.format("%."..SEC_SCALE.."f", tostring(Price)));
                   if Rows>=2 then
                           local OldPrice = tonumber(GetCell(t_id,Rows-1,4).image);
                           if OldPrice>Price then 
                                        Red(Rows,4); 
                           else 
                                        Green(Rows,4);
                           end
                           CDelta = tonumber(GetCell(t_id,Rows-1,5).image);
                           CDelta = CDelta + Delta;                        
                        else 
                          CDelta = Delta;
                        end
                        SetCell(t_id, Rows, 5, tostring(CDelta));
                    if Delta<0 then Red(Rows,3); end
                    if Delta>0 then Green(Rows,3); end
                    if CDelta<0 then Red(Rows,5); end
                    if CDelta>0 then Green(Rows,5); end                                                   
                   if save then
                                local Str = tostring(H)..";"..tostring(M)..";"..tostring(VBUY)..";"..tostring(VSELL)..";"
                                                ..tostring(Delta)..";"..tostring(Price)..";"..tostring(CDelta);
                           Str=Str.."\n";
                           SaveFile(Str);
                        end
                t = tostring(alltrade.datetime.hour)..":"..tostring(alltrade.datetime.min);                        
                    VBUY = 0;VSELL = 0;
                        PriceTrans = 0;
                        CountTrans = 0;
                        Calc(alltrade);
                end
        end --if alltrade.sec_code == TICER then        
end

function SaveFile(Str)
        if f ~= nil then 
                f:write(Str);           
                f:flush();                               
        end
end

function Red(row,col)
        SetColor(t_id, row, col, RGB(255,0,0), RGB(0,0,0), RGB(255,0,0), RGB(0,0,0));
end
function Yellow(row,col)
        SetColor(t_id, row, col, RGB(240,240,0), RGB(0,0,0), RGB(240,240,0), RGB(0,0,0));
end
function Green(row,col)
        SetColor(t_id, row, col, RGB(0,200,0), RGB(0,0,0), RGB(0,200,0), RGB(0,0,0));
end


function EventCallBack(t_id, msg, par1, par2)
   if msg==QTABLE_CLOSE then
     OnStop();
   end;
end

function OnStop(s)
  if f ~= nil then f:close(); end
  if t_id ~= nil then
    DestroyTable (t_id);
  end;
  stopped = true;
end




Досужие размышления о Quik, Lua и Python.

    • 28 марта 2020, 16:03
    • |
    • 3Qu
  • Еще

Я уже писал, что у меня сделана C++ DLL, которая получает данные из Lua и пишет их в БД SQLite. Уже писал также, что DLL под Lua делается на раз, и даже приводил коды и шаблон проекта простенькой C++ DLL. Посмотрело несколько тысяч, скачало, аж 12 человек, применят от силы двое. КПД постов, прямо скажем, оч низкий.)

В DLL реализована как связь с Lua, и будет реализована сама стратегия, вот только не решил какая из них. Повторять старые стратегии на новой для меня платформе Quik уже неинтересно, а новых моделей АТС отработано уже несколько. Все моделируется в Python. Часть стратегий не требует сложной математики, и могут быть легко перенесены непосредственно на С++. Другие непосредственно в DLL перенесены быть не могут, т.к. используют пакеты Python — всяческие регрессии и машинное обучение.
В общем, получилось, что DLL является шаблоном для любой стратегии. Все необходимые для АТС данные доступны АТС — реал-тайм данные поступают в DLL непосредственно из терминала, а необходимая история пишется DLL в БД SQLite и читается АТС из базы данных.



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

Коронавирус в Европе своими глазами

    • 22 марта 2020, 13:12
    • |
    • RUH666
  • Еще
Ещё раз отмечу, что на экономику в целом негативно влияют больше меры борьбы с коронавирусом, чем сам коронавирус (необходимость мер тут не обсуждаю), в основном тем, что рвутся цепочки поставок. На фондовый рынок же в основном влияют негативные социальные настроения, опять же, вызванные скорее мерами по борьбе, чем самим коронавирусом.

Тут за последнюю неделю ситуация несколько стабилизировалась, особо новых мер нет, всё что можно предприняли. Закрыто практически всё, кроме магазинов с едой и банков, в них можно заходить только в масках. Паники среди населения не наблюдается от слова «совсем», люди просто выполняют предписания правительств, без особого энтузиазма, но и шибко не бухтят по этому поводу.

Предписания, правда разные. Если в Словакии так и ограничились небольшим штрафом за несоблюдение карантина (около 1600 евро), в Чехии он больше 100 000 евро, да ещё и штрафуют за появление на улице без маски (это зачем, мне совсем непонятно). В большей части Европы запрещены передвижения «без особой надобности», но ходить же реально некуда (в магазин можно). Честно говоря, этим бы я и сам пожертвовал, хоть и скептически отношусь к опасности коронавируса, лишний раз дёргать судьбу за тестикулы не стоит. Ещё ем много чеснока и чёрного перца, но я делал это и без коронавируса, просто нравится всё острое. Так что, в целом. ситуация уже не выглядит какой-то из ряда вон выходящей, все потихоньку привыкли. Лично мне неделю назад ситуация показалась просто аховой, а сейчас какое-то впечатление рутинности.

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

Индикатор поглощение

заготовка индикатора для quik
бычье, медвежье поглощение
Индикатор поглощение


сам код:
Settings={
Name="absorption",
period=20,
line=                                     
                {  
                                        {  
                        Name = "cur1",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(255,0, 0)
                    }
                }

}
--[[

описание свойств:
period - период, за каротрый делается расчет

назначение:
построение поглащения



--]]

function Init()
  y = 0         
  return 1
end

function OnCalculate(index)
    
  sz = Size()
  n = Settings.period
  

  if index == 1 then 
   y = 0  
  end  
       

   i = index

   
   if index-n > 0 then
        
        if (C(i) < C(i-1)) and (C(i-1) > O(i-1)) and (C(i) < O(i)) and
       (C(i-1) - O(i-1) < O(i) - C(i))  then
      y = y - 1    
        end
        
        if (C(i) > C(i-1)) and (C(i-1) < O(i-1)) and (C(i) > O(i)) and
       (O(i-1) - C(i-1) < C(i) - O(i))  then
      y = y + 1    
        end     
        
   end 
   
   return y
 
  
end
  • обсудить на форуме:
  • QUIK

В гостях у Седого

Седой встретил меня у ворот.

-уверен, что не кашляешь?

-уверен, уверен. Чего ты параноишь то!

Седой скривился,
— пойдем. Расскажу. Руки продезинфицируй, — и он кивнул на бесконтактный автомат на столбике.

Я повиновался.

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

— ты думаешь все настолько серьезно?

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

Чья-то тень промелькнула за стеклом в доме.

-Теща, ухмыльнулся Седой. — Пришлось перевезти всех стариков на карантин. В любом сценарии это не лишнее.

— Но мы сейчас про позитив

— Да. Позитив заключается в следующем. Представь, что тотальное тестирование показывает, что количество заболевших выше на два порядка. То есть уже болеют и переболели десятки тысяч только у нас. Сотни тысяч в Италии. Процент смертности таким образом снижается в 5-10 раз. Опасности для большинства населения практически нет. Нужды в жестком карантине тоже нет, старикам рекомендуют сидеть дома, остальные живут как жили. Вирус постепенно мутирует к еще более слабым формам, ведь смертельно больных изолируют и эти мутации дальше не распространяются. И мир в целом выдыхает. примерно это сейчас учтено в ценах на рынках.



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

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