Месяц назад я написал пост Робот ContanGO!
smart-lab.ru/blog/385513.php
В нём был изложен черновик торговой идеи. Между фьючерсом и акцией всегда есть разница в цене. Обычно фьючерс дороже акции. Это называется
контанго. Контанго всё время меняется. Оно то больше, то меньше. С каждым днём контанго распадается и стремится к
нулю. Контанго достигает нуля к дате экспирации.
Робот, выложенный в первом посте, был первым наброском. Он многое не учитывал. С тех пор он стал умнее, я полностью переписал код и обогатил его новыми аналитическими элементами.
1. Теперь роботу не нужно задавать код фьючерса. Он сам возьмёт новый список фьючерсов, когда до экспирации останется 5 дней.
2. Робот умеет учитывать то, что часть денег морозится во фьючерсах, заблокированная под ГО. Он уменьшает доходность на размер замороженных денег.
3. Робот учитывает комиссию биржи автоматически (ничего писать не нужно)
4. Робот учитывает комиссию брокера. Задаётся пользователем в файле ContanGO.lua
5. Робот вычитает из доходности налог НДФЛ 13%
6. Если вы знаете что делаете, вы можете вписать размер
дивиденда по каждой акции. Вписав дивиденд, вы поднимете доходность до справедливого значения. Дивиденд считается с налогом 13%. После среза реестра дивиденд
нужно обнулить , потому что он перестанет играть роль.
Этот пункт — для продвинутых. Если он вам не понятен — поставьте в дивидендах нули.
Ещё раз пройдусь по значениям полей.
1.
Share — базовый актив — акция. Под валюты робот не адаптирован, не пытайтесь вписать туда доллар рубль, будет глючить.
2.
Nazvanie — название акции — базового актива.
3.
Futures — фьючерс на эту акцию.
4.
Expire_Days — сколько дней до экспирации.
5.
GO % — размер ГО по сравнению с полной стоимостью фьючерса.
6.
Div_rub — размер дивиденда на акцию в рублях. Пишется при условии, что срез реестра выпадает до экспирации. И при условии, что этого среза ещё не было. Если срез уже был, то в этом поле надо поставить 0.
7.
spread — разница в процентах между фьючерсом и акцией.
8.
profit % — это разница в процентах между фьючерсом и акцией за вычетом всех отрицательных моментов: замороженное ГО, комиссия биржи и брокера, налог 13%. В скобках показано насколько это больше или меньше, чем доходность депозита. Если больше 1, то выше, если меньше 1, то ниже.
9.
max_profit — робот засекает какой максимальный размер принимал предыдущий параметр и запоминает его. В скобках показано, на сколько он обыгрывает банковский депозит.
10.
Depozit_v_banke — средняя доходность годового депозита в российских банках. Я его беру на banki.ru в разделе Аналитика. Сейчас он равен 7,57% годовых. Робот считает какую доходность даст такой депозит за количество дней, оставшееся до экспирации фьючерса.
Робот лежит здесь. Вот ссылка:
yadi.sk/d/1K7lQEaA3FT7fy
В архиве сам робот ContanGO!.lua и библиотека QL.lua. В ней торговые функции, необходимые для работы робота.
А это платформа LuaForWindows. Она нужна для работы библиотеки QL
github.com/rjpcomputing/luaforwindows/releases/download/v5.1.5-51/LuaForWindows_v5.1.5-51.exe
1. Установите LuaForWindows
2. Перезагрузите комп.
3. Положите в отдельную папку файлы ContanGO и QL
4. Запускайте в КВИКе робота ContanGO.lua через Сервисы — Lua скрипты — добавить.
Вот часть файла ContanGO!.lua, которую может редактировать пользователь.
Примечание. Два таких дефиса — превращают строку в комментарий. Это позволяет писать после них любой текст.
а с какой годовой ставкой в банке вы сравниваете? надо бы такое значение в таблице
робот не торгует, только предоставляет информацию?
Благодарю. Очень хотел бы воспользоваться.
Скажите, почему при запуске Ваш скрипт начинает мне бешено спамить сообщение:
"ContanGO.lua:149: attempt to perform arithmetic on global 'crude_offer_sh' (a nil value)"
Я что-то не донастроил в Квике? Заказ котировок? Таблица текущих торгов?
Акции все заказаны из секции TQBR (289 штук).
Там на этой строчке написано
Может, он дивиденды не может найти?..
Albus, Фильтры тоже сброшены.
Добавил логгирование принудительное всех значений на входе и получил виновника трагедии:
SEC: SBER; ValPriceStr: -1.#J
Потом добавил ещё и получил подозрение на багу в методе toPrice:
То есть по виду он неправильно выполняет конвертацию, когда в конце очень много нулей после запятой?..
message (sec.." "..tonumber(toPrice(sec, tableoffer_sh.param_value)),1)
message (sec.." "..type (crude_offer_sh),1)
и расскажите что он будет писать в окошке сообщений
Как у меня:
Albus, поставил вместо "toPrice(sec, tableoffer_sh.param_value)"
"tonumber(tableoffer_sh_param_value)"
вроде, полегчало...
Да, можете и без toPrice но ругается не на неё.
Можете вот так написать:
crude_offer_sh=1*tableoffer_sh.param_value
это тоже превратит стринг в число
Albus, он ругается не на toPrice. Но только потому, что эта функция возвращает какой-то бред в виде строки.
И фактическая ругань идет в том месте, где этот бред мы пытаемся конвертнуть в tonumber.
Чисто впечатление: круто!
Но хотелось бы видеть доходности в виде "проценты годовых". Потому что человеческое сознание плохо понимает что такое "Депозит в банке 1.43 за 69 дней" ;-)
tbl:SetValue(line_count_table[sec],'profit %', string.format("%.4f", profit_pc[sec]).." ("..string.format("%.4f", profit_pc[sec]/benchmark)..")")
profit[pc] делите на количество дней до экспирации days_till_exp и умножайте на 365 дней.
vk.com/arbitr_trading
Очень нужно, или может сможете подсказать как можно подправить этого?
Неужели за пять дней до экспира возникает ситуация, когда что-то можно заработать, сомнительно?
Сергей Гаврилов, деньги будут если цены временно разойдутся очень сильно.
Или если у кого-то другая ставка налога.
Или если есть инсайд по дивам. =D
Сергей Гаврилов, к моему безмерному изумлению, желающих получить ставку выше банковской как раз очень мало на нашем рынке.
Потому что если бы их было много, они бы котировали фьючерсы на все акции и во всех датах исполнения. Но этого не происходит. Видимо, двузначные доходности никого не интересуют на самом деле?..
Может, и вправду говорят: "Чистая доходность меньше 120% годовых — отстой и скука".
Какие там 120%, 5-6% годовых дай бог…