Блог им. trantor77

QUIK: Бенчмарк ОФЗ к ставке ЦБ

    Может кому будет интересен скрипт на QLUA, который выступает простым бенчмарком ОФЗ с постоянным купоном к ставке ЦБ.
Основные параметры доходность и премия к ставке ЦБ, с учетом дюрации.
Скрипт не работает онлайн (оперативность тут не принципиальна), при запуске собирает параметры в таблицу и выводит на экран.
В дальнейшем планируется эти данные использовать для анализа премии доходности по дюрации для муниципальных и корпоративных облигаций к ОФЗ.

QUIK: Бенчмарк ОФЗ к ставке ЦБ


    Код скрипта на github (на github две версии одна в utf-8 для просмотра и основная версия в win1251, т.к. quik понимает только его):
github.com/trantor77/lua_scripts/boundsOFZ.lua

    Код скрипта:
--переменные
keyRateCB = 7.5
classCode = "TQOB"

function CreateTable()
    t_id = AllocTable()
    AddColumn(t_id, 0, "Бумага", true, QTABLE_STRING_TYPE, 15)
    AddColumn(t_id, 1, "Цена", true, QTABLE_DOUBLE_TYPE, 15)
    AddColumn(t_id, 2, "Доходность, %", true, QTABLE_DOUBLE_TYPE, 15)
    AddColumn(t_id, 3, "Дюрация, лет", true, QTABLE_DOUBLE_TYPE, 15)
    AddColumn(t_id, 4, "Купон, %", true, QTABLE_DOUBLE_TYPE, 15)
    AddColumn(t_id, 5, "Премия к ЦБ, бп", true, QTABLE_INT_TYPE, 15)
    AddColumn(t_id, 6, "Погашение", true, QTABLE_STRING_TYPE, 15)
    t = CreateWindow(t_id)
    SetWindowCaption(t_id, "ОФЗ")
end

function string.split(str, sep)
    local fields = {}
    str:gsub(string.format("([^%s]+)", sep), function(f_c) fields[#fields + 1] = f_c end)
    return fields
end

function getParamNumber(code, param)
    return tonumber(getParamEx(classCode, code, param).param_value)
end

function formatData(prm)
    return string.format("%02d.%02d.%04d", prm%100, (prm%10000)/100, prm/10000)
end

CreateTable()

arr = {}
sec_list = getClassSecurities(classCode)
sec_listTable = string.split(sec_list, ',')
j = 0
for i = 1, #sec_listTable do
    secCode = sec_listTable[i]
    securityInfo = getSecurityInfo(classCode, secCode)
    short_name = securityInfo.short_name
    if short_name:find("ОФЗ 26") ~= nil then
        j = j + 1
        r = {}
        r["short_name"] = short_name
        r["price"] = getParamNumber(securityInfo.code, "PREVPRICE")
        r["yield"] = getParamNumber(securityInfo.code, "YIELD")
        r["duration"] = getParamNumber(securityInfo.code, "DURATION")/365
        couponvalue = getParamNumber(securityInfo.code, "COUPONVALUE")
        couponperiod = getParamNumber(securityInfo.code, "COUPONPERIOD")
        r["coupon"] = ((365/couponperiod) * couponvalue)/10
        r["bonus"] = (r["yield"] - keyRateCB)*100
        r["mat_date"] = getParamNumber(securityInfo.code, "MAT_DATE")
        table.insert(arr, j, r)
    end
end

table.sort(arr, function(a,b) return a["duration"] < b["duration"] end)

for j = 1, #arr do
    row = InsertRow(t_id, -1)
    SetCell(t_id, row, 0, arr[j]["short_name"])
    price = arr[j]["price"]
    SetCell(t_id, row, 1, string.format("%.2f", price), price)
    yield = arr[j]["yield"]
    SetCell(t_id, row, 2, string.format("%.2f", yield), yield)
    duration = arr[j]["duration"]
    SetCell(t_id, row, 3, string.format("%.2f", duration), duration)
    coupon = arr[j]["coupon"]
    SetCell(t_id, row, 4, string.format("%.2f", coupon), coupon)
    bonus = arr[j]["bonus"]
    SetCell(t_id, row, 5, string.format("%.0f", bonus), bonus)
    mat_date = arr[j]["mat_date"]
    SetCell(t_id, row, 6, formatData(mat_date), mat_date)
end
  • обсудить на форуме:
  • Quik Lua
5.7К | ★41
12 комментариев
Спасибо!
avatar
Спасибо
Я извиняюсь :-) Поддал тут на выходные, и не могу понять что это. :-) Можно для тупых чуть-чуть разжевать что именно он показывает.
Спасибо :-)
avatar
Лайк! А подскажите, где вообще взять документацию по LUA под QUIK с примерами?
avatar
sergeygaz, 
у меня в папке QUIK(открытие) есть файл с документацией: Интерпретатор языка Lua.pdf
avatar
Kolyan, вот и не понятно зачем он вообще нужен. Я бы еще каким-то боком понял цену бида или там аска. А здесь… Смысл какой у всего этого.
Хелло ворлд что ли? :-) Не, ну может я просто по тупости не вдупляю.
Прошу тех кто понял разжевать. :-)
avatar
Евгений Петров, я так понял смысл разобраться/освежить в памяти QLUA)
avatar
У меня что-то не заработало:



avatar
Dmitryy, 
не могу подсказать почему не заработало, кто брокер, версия quik?
Проверял на 7.14 (PSB) и 7.19(Открытие) все работает…
avatar
Василий, БКС, квик 7.19, попробую разобраться. UTF версия кстати вообще с синтаксической ошибкой падает.
avatar
Как рассчитать доходность к погашению  При том что купил сегодня 1 штуку по цене 100,030? Офз 26208Сразу  20 рублей отминусовали автоматом 
avatar

Читайте на SMART-LAB:
Фото
Почему люди с депозитом до 10 000 ₽ годами стоят на месте?
Не потому, что денег мало. Маленький счёт не тормозит. Он разоблачает. На таком депозите невозможно долго врать себе. Сразу видно, кто торгует по...
Фото
Число инвесторов RENI достигло 120 тысяч человек по итогам марта 2026 года
Получили свежий отчет Московской Биржи. Количество наших инвесторов в марте выросло на 6 тысяч человек до 120 тысяч, 1,7х рост г/г. Средний размер...
🖥 М.Видео торгуется за аренду: закроют или спасут магазины?
Ритейлер продолжит точечно закрывать и открывать магазины — но ключевой фактор теперь не трафик, а переговоры с арендодателями. Об этом МР...
Ваш любимый Мозговой штурм спешит на помощь! Мнение по текущему рынку простыми словами
В нашем рейтинге акций   знаменательное событие! Рекордное число акций с рейтингом 4 — 14 штук!!! И, вероятно, будет еще больше! Сегодня я...

теги блога Василий

....все тэги



UPDONW
Новый дизайн