Избранное трейдера Ынвестор

по

Искусственный трейдер. Часть 3. Или ТСЛаb в 20 строк кода.

Надеюсь, все живы и здоровы!
Предупреждаю сразу — текста будет больше чем когда кОда (сам код в конце топика).
Перед тем как перейти к созданию алгоритмов машинного обучения, напишем код для тестирования стратегий и отображения результатов.
Мне нужно: описать логику сигналов на покупку и продажу, затем эти сигналы передать симулятору, который в течение конкретной торговой сессии будет показывать на графике точки, соответствующие этим сигналам, а также рассчитывать изменение прибыли и текущей позиции в каждый момент времени. Данные должны загружаться в хронологическом порядке в цикле по торговым сессиям. После завершения обработки нужно создать итоговый график «эквити» по дням, на графике видеть значения максимальной прибыли и «просадки» за каждую торговую сессию, максимальный уровень риска (величину открытой позиции), количество совершенных сделок и соотношение убыточных-прибыльных дней. Вроде бы все пока. Короче, нужно по-быстрому написать ТСЛаb.

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

Telagram+Quik+Lua: сам себе мессенджер

Самый простой способ, которым я пользовался долгое время.
Нужно установить две программы: Tor browser и curl.
Первая, чтобы блокировки телеграма обходить. Вторая, чтобы сетевую команду исполнять.

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

В луа после этого всё предельно просто:
str='C:\\curl-7.63.0-win64-mingw\\bin\\curl.exe --socks5 127.0.0.1:9150 '
	str=str..'"https://api.telegram.org/botидентификаторвашегобота/sendMessage?chat_id=айдивашегоаккаунта&text='

str=str..переменная1..": "..переменная2
str=str..'"'
os.execute(str)
Приведенный код будет слать в телеграм значения двух переменных, разделенных двоеточием.
Всё просто, но есть два нюанса:
1. Каждая отправка сообщения сопровождается вызовом окна командной строки, которая всплывает поверх всех окон на одну-две секунды. Поэтому слать такие сообщения на машине, с которой вы работаете, чаще одного раза в минуту, не стоит.
2. Я таким способом пользовался больше года и считал, что он и легкий и надежный, но оказалось, что он легкий, но ненадежный. Один раз у меня случилась такая штука. Всплыло черное окошко командной строки, сообщение в телегу не ушло, окошко продолжило висеть. Видимо, какой-то сетевой сбой. И, как оказалось, квик-поток, вызвавший эту командную строку через os.execute, тоже завис и квик перестал коннектиться почему-то, потерял данные и тд. После того, как я это окошко закрыл крестиком, квик продолжил работу. Грубо говоря, из десятков тысяч запусков за год применения такого способа 1 вот такой глюк. Редко, но неприятно.

А какие вы знаете простые, легкие и надежные способы информирования без необходимости много кодить?


Скрипт 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




Сообщение медика из Италии

(Делаю репост)

Привет… к сожалению да, чуда в этот раз не будет, штука заразная и неприятная. И не придет, а уже пришла (см. количество пневмоний в одесских больницах) уже как месяц назад… все как в Италии.  Здесь официально заявили о начале эпидемии в конце февраля, в то время как было уже в полном разгаре в конце января (по своим пациентам видел), первый пациент в Италию прилетел из Мюнхена 9 января… поэтому и такие последствия. Делали вид, что «ложки нет».

Симптомы: основной — сухой кашель, обычно начинается параллельно с першением и болью в горле (иногда и часто просто боль в шее, типа мышечная и в мышцах шеи, полагаю по ходу лимф. узлов), легкое недомогание и типа продромных явлений, все как при гриппе. Температура 37,0-37,5  — 1-2 дня, или вообще без температуры. НО! как правило, нет ринита. Часто головная боль, заложенность ушей (сальпингит), легкие признаки синусита, но, повторю, необычно как-то, нет секреторного компонента. Есть просто отек слизистых. Далее, на 2-4 день боль по ходу трахеи и за грудиной (!), сухой кашель усиливается. С пятого дня может появиться боль в грудной клетке (уже более латерально, не по центру), затрудненное дыхание (периодами). И это вот продолжается без лечения около 15-20 дней. Потом, если осложнений нет, уходит и улучшается (субъективно) по 5% в день. Длится всего порядка месяца (от 3 до 6 недель). Если нет осложнений — то температуры нет, или гипотермия (36,0-36,3). В анализе крови аналогично: основной симптом — лимфопения (!), мало либо нормальное кол-во нейтрофилов, и повышенный С-реактивный белок. Больше ничего.

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

Отчитываемся перед налоговой по доходам Interactive Brokers за 5 минут

Все мы знаем, что зарубежные брокеры не являются налоговыми агентами в РФ, соответственно, отчитываться по доходам и платить налоги с них мы должны самостоятельно. Вопрос отчитываться или нет у меня не стоял, поэтому, чтобы не тратить каждый год уйму времени на достаточно трудоемкие расчеты, я написал скрипт, который берет отчеты Interactive Brokers и формирует на основе них пояснительную записку со всеми пояснениями и расчетами для налоговой. Вам останется только приложить этот файл к декларации 3-НДФЛ, а в нее саму внести лишь два пункта (см. ниже).

Ограничения по применению

Поскольку я занимаюсь долгосрочными инвестициями, я не использую такие инструменты, как фьючерсы, опционы, а также никогда не использую плечо и сделки SHORT. В связи с этим, такие операции скриптом не поддерживаются. Если у кого-то есть желание — могут дописать сами.

Подготовка к использованию
  • Установите Python 3+


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

Глобальный lдиверсифицированный портфель 😎 VS стабильный портфель 60/40

Суть портфеля

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

Фазы мировой экономической активности

Большинство управляющих используют политику формирования портфеля «60/40» (60% акций/40% облигации). Такой подход имеет практическое применение, но все же не позволяет активно учитывать четыре фазы мировой экономики. Подход 60/40 учитывает только одну фазу экономической активности.

Глобальная экономика определяется фазами, каждая из которых имеет вектор роста экономики и инфляции. Период ускоренного роста в совокупности с растущей инфляцией носит название «инфляционный бум», в то время как ускорение роста с одновременным падением инфляции представляет собой «безинфляционный бум». На другой стороне осей период слабого подъема и инфляции называется «стагфляцией», и период снижения роста вместе с падающей инфляцией называется «дефляционный спад».



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

VIX - порно онлайн. Трейд на выборы в США

Преамбула


VIX - порно онлайн. Трейд на выборы в США


Мой трейдинг в прошлые годы отвратительно работал с января по июль:

VIX - порно онлайн. Трейд на выборы в США

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

Все "прелести" брокерского счета за рубежом глазами матерого российского финансового пессимиста

Всем привет!

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

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

Давайте же объективно разберем плюсы и минусы использования зарубежного брокерского счета.

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

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



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

Уведомил ФНС об открытии счета в IB ч.2

Хотел написать сразу итоговый пост, чем дело кончилось об преждевременном уведомлении ФНС на бланке банка. Этот топик здесь.
Но потом увидел щедрое предложение от Тимохи по раздаче 2000р.
Это было бы хорошей прибавкой к моему 500р. счету для разгона халявных денег. Считай, 400% разом, за 1 день.

Вообщем ситуация разворачивается довольно инетересно на текущий момент.

После написания топика, народ меня загнобил, что я поторопился и могу получить штраф, так как ФНС может не разобравшись его выписать за несвоевременное уведомление об открытом счете в банке.
Я написал письмо в ФНС (через сайт), что так и так, ребята, мол ошибся. Поторопился с подачей данных, да еще и на бланке банка. Сообщил так же что IB не банк. Выслал им скрин с сайта налоговой, где говорится что уведомлять не нужно раньше 01.01.2020г.
Сижу жду ответа....
Ответа пришел неожиданный:

Уведомил ФНС об открытии счета в IB ч.2

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

Как сделать приблизительный расчет стоимости опциона? Блэк-Шоулз vs Смарт Лаб.

На СмарЛабе появился отличный автор — Eugene Logunov  и его друг KarL$oH. Если бы тут был бы еще и Блек Шоулз, то мы, конечно, его забанили. Потому что он не работает. Ну у кого то работает у кого то нет. Самое обидное, что вроде пишешь, хочешь объяснить, но чукчи ведь тоже писатели. Тем не менее, давайте разберемся.

Для простоты картины возьмем простой пример, который можно посчитать в уме или в уме эксела. Есть БА ценой 1000 который движется в течении 30 дней. Один день растет на 0,015 лог приращения, другой день падает на -0,01. Такое простое поступательное движение. Не трудно догадаться, что через 30 дней он будет в плюсе на 0,075 и если взять экспоненту -1, то в процентах это будет 0,0778% от начальной 1000. Теперь нам надо посчитать стоимость опциона, что бы продать его кому ни будь или что бы нас просто не поимели.

Измеряем волатильность как описано в измерители волатильности. Сразу скажу, что это будет 0,0129 и нормируем на время 362^0.5, итого годовая 0,246. 30 дней до экспари 30/362=0,0828 и если корень извлечь 0,287. Подставляем это все в БШ. Надеюсь, что у продвинутой публики будет какой ни будь калькулятор опционов, что бы все это подставить и получить 28,33. Я по простому и приблизительно: 0,4*0,246*1000*0,287=28,40 и это премия опциона на ЦС. И так как мы знаем конечную цену через 30 дней, то легко сосчитаем, что у нас получится. Нам отгрузят БА по 1000 при цене 1077,8, то есть 77,8 в плюс и спишут цену (премию) опциона 28.4 = 49,4.



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

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