Germany | Finland | Saint Petersburg | Drive

Разбор кода опциона

Опубликовано в QLua

Как разобрать код опциона или фьючерса на языке Lua?

 

Коды срочных контрактов  РТС состоят из следующих частей:

Фьючерсы
CMY
       

 

Опционы
CPKMY
                                                                     
  
W
      

Расшифровка полей:

  • C – код базового актива, 2 символа,
  • P – цена страйк, переменное количество символов,
  • К – тип расчетов,
  • M – месяц исполнения (а также тип для опциона), 1 символ,
  • Y – год исполнения, 1 символ,
  • W – признак недельного опциона, 1 символ.

 

Подробнее на сайте Московской биржи.

 


Попробуем разобрать эти коды на составляющие, поупражняемся с механизмом паттернов Lua:

Фьючерсы:

pattern = "(%a%a)(%a)(%d)"

print(string.match("RIM5",pattern))
print(string.match("EuZ6",pattern))

Результат:

RI    M    5
Eu    Z    6

Опционы

pattern = "(%a%a)([%d%.]+)(%a)(%a)(%d)(%a-)"

print(string.match("ED000001BF5",pattern))
print(string.match("ED001.14BR5",pattern))
print(string.match("RI065000BW5",pattern))

Результат:

ED 000001  B  F 5 
ED 001.14  B  R 5 
RI 065000  B  W 5

 

См. также Шаблоны в Lua

 

Комментарии   
# sfd 03.06.2015 05:50
1. зачем его разбирать - ведь всё уже разобрано в таблице текущих параметров до нас?
2. а если на бирже ни с того ни с сего коды поменяются?
Ответить | Ответить с цитатой | Цитировать
# admin 03.06.2015 09:05
Воспитанный мужчина не сделает замечания женщине, плохо несущей шпалу

Цитирую sfd:
1. зачем его разбирать - ведь всё уже разобрано в таблице текущих параметров до нас?
2. а если на бирже ни с того ни с сего коды поменяются?


Можно и по таблице текущих параметров. Каждый раз добавлять руками все опционы в эту таблицу, следить, чтобы она была открыта, не забывать ее редактировать после окончания срока.... Какой же это робот?

Если на бирже поменяются коды или начнется ядерная война - тогда да, беда полная.
Ответить | Ответить с цитатой | Цитировать
# Юрий 14.06.2015 14:02
Здравствуйте! подскажите пож-та, а как из кода опциона взять только среднюю часть (страйк)? Или лучше каждое значение присвоить отдельной переменной. Спасибо.
Ответить | Ответить с цитатой | Цитировать
# admin 14.06.2015 14:23
Смотрите, Юрий...

pattern = "(%a%a)([%d%.]+)(%a)(%a)(%d)(%a-)"
a,b,c,d,e = string.match("ED000001BF5",pattern)

Итого 5 переменных, по количеству круглых скобочек в паттерне.

Нужно 1 значение - оставьте одну переменную и уберите из паттерна лишние скобки
Ответить | Ответить с цитатой | Цитировать
# Юрий 14.06.2015 23:52
Спасибо большое! Получилось.
Ответить | Ответить с цитатой | Цитировать
# Юрий 15.06.2015 01:22
Тяжело дается понимание работы со строками. Подскажите как определить длину такой строки: list = RSH3,VBZ2,O4Z2, O2Z2,SiM3,SiH3, SiF3,
Ответить | Ответить с цитатой | Цитировать
# Юрий 16.06.2015 11:54
Ну не это конечно имелось ввиду. Но вот так решил я (найти кол-во эмитентов):
for w in string.gmatch(l ist, "(%w%w%w%w%)([^ ,]+)") do
print(w)
n = n+1
end
где n - и есть кол-во
Ответить | Ответить с цитатой | Цитировать
# admin 16.06.2015 12:12
Вот вам на всякий случай. Функция преобразования строкового списка в таблицу

-- Разделение строки на подстроки, используя текстовый разделитель. Возвращает таблицу.
-- По умолчанию разделителем является пробел. Можно использовать паттерны
-- func - функция преобразования полученного токена перед сохранением в таблицу (необязательна)

function string.split(str,delimiter,func)

func = func or function(str)
return str
end
local result = {}
for token in string.gmatch(s tr, "[^" .. (delimiter or "%s") .. "]+") do
result[#result+1] = func(token)
end
return result
end

Размер полученной таблицы можно получить оператором # или функцией table.getn()
Ответить | Ответить с цитатой | Цитировать
# Юрий 22.06.2015 21:25
Большое спасибо! Нужная функция.
Хотелось бы еще поинтересоватьс я, как выбрать из списка всех опционов только опционы заданного базового актива и с одной датой экспирации.
BaseSecList = "RIZ4" --нужный базовый актив
SecListpredvar = getClassSecurit ies(OpzionClass Code) -- выбрали все сразу опционы
emitent = string.match(Ba seSecList, "(%a%a).")
pattern = "("..emitent.." %w+,)" --сделали патерн
for Seccode in string.gmatch(S ecListpredvar, pattern) do
SecListpredvar_ 2 = SecListpredvar_ 2..Seccode --сформировали список только из опционов базового актива
end
А далее вопрос: как можно из SecListpredvar_ 2 выбрать опционы одного срока исполнения (даже с заданными буквенными значениями), не перебирая 2 раза список, т.е. есть ли возможность сравнивать код опциона сразу с одним и вторым патерном, добавляя в список и калы и путы по очереди?
Ответить | Ответить с цитатой | Цитировать
# admin 22.06.2015 22:42
Юрий, вот как-то так можно выбрать январские опционы

base = string.sub("RIZ4",1,2)
options = string.split(getClassSecurities("SPBOPT"),",")
pattern = base.."[%d%.]+([AM])%a%d%a-"

for i=#options,1,-1 do
if not string.match(op tions,pattern) then
table.remove(options,i)
end
end

Если нужно выбрать по определённому страйку - измените паттерн на что-то типа

base.."000001".."([AM])%a%d%a-"
Ответить | Ответить с цитатой | Цитировать
# Юрий 23.06.2015 23:19
Здравствуйте!
строка if not string.match(op tions,pattern) then выдает ошибку bad argument #1 to 'match' (string expected, got table
Ответить | Ответить с цитатой | Цитировать
# admin 23.06.2015 23:56
Конечно. Я прошу прощения за невнимательност ь. Код не проверял, накидал слету. Старался проиллюстрирова ть подход Поправьте, если что не так. Строчка о которой Вы пишете должна выглядеть так:

if not string.match(op tions[ i ],pattern) then

проверьте. Если совпадения нет, string.match вернет nil и эта строка из массива уберется посредством table.remove. В результате в массиве останутся только те опционы, у которых в экспирации стоят буквы А или М, то есть январские коллы и путы. Если нужно отобрать по страйку - поменяйте паттерн.

Иногда string.match возвращает пустую строку в случае несовпадения, я сходу не помню в каких случаях.
Ответить | Ответить с цитатой | Цитировать
# Юрий 24.06.2015 09:18
Все равно не работает. Пытался и так и сяк - не получается.
Ответить | Ответить с цитатой | Цитировать
# Юрий 24.06.2015 09:54
О! получилось!
SecList_ = ""
SecList = {}
base = string.sub("RIZ4"1,2)
pattern_2 = "("..base.."[%d%.]+%a[GS]%d,)"
for Seccode in string.gmatch(g etClassSecuriti es(OpzionClassC ode), pattern_2) do
SecList_ = SecList_..Seccode
SecList = string.split(SecList_,",")

Спасибо огромное! теперь понятно как можно сортировать, сравнивая с 2-мя элементами
Ответить | Ответить с цитатой | Цитировать
Добавить комментарий


Архив QLua