Сообщество Engee

CUSIP

Автор
avatar-maximsidorovmaximsidorov
Notebook

Алгоритм проверки контрольной цифры CUSIP

В этом примере рассматривается реализация алгоритма проверки контрольной цифры CUSIP на языке программирования Julia. Мы разберём, как работает код, и для чего он нужен.

Введение

Что такое CUSIP?

CUSIP (Committee on Uniform Securities Identification Procedures) — это стандарт, используемый в США и Канаде для идентификации финансовых инструментов, таких как акции и облигации. Каждый CUSIP состоит из 9 символов, где последние 9-й символ — это контрольная цифра, которая вычисляется по определённому алгоритму.

Зачем нужна контрольная цифра?

Контрольная цифра позволяет проверить, правильно ли введён или передан CUSIP. Это помогает избежать ошибок при вводе данных и повышает надёжность систем, работающих с финансовыми инструментами.

Структура модуля CUSIP

Рассмотрим код:

module CUSIP
    function _lastdigitcusip(input::AbstractString)
        input = uppercase(input)  # Приводим строку к верхнему регистру
        s = 0                     # Переменная для накопления суммы

        for (i, c) in enumerate(input)  # Проходим по каждому символу строки с индексом
            if isdigit(c)
                v = Int(c) - 48           # Цифры: '0'-'9' -> 0-9
            elseif isletter(c)
                v = Int(c) - 64 + 9       # Буквы: 'A'-'Z' -> 10-35, затем +9
            elseif c == '*'
                v = 36                    # Специальный символ
            elseif c == '@'
                v = 37                    # Специальный символ
            elseif c == '#'
                v = 38                    # Специальный символ
            end

            if iseven(i); v *= 2 end    # Если позиция чётная, умножаем на 2
            s += div(v, 10) + rem(v, 10) # Складываем десятки и единицы
        end

        # Вычисляем контрольную цифру
        return Char(rem(10 - rem(s, 10), 10) + 48)
    end

    checkdigit(input::AbstractString) = input[9] == _lastdigitcusip(input[1:8])
    
end # module CUSIP
Main.CUSIP

Модуль CUSIP инкапсулирует функции, связанные с проверкой CUSIP-кодов. Это удобно, чтобы не засорять глобальное пространство имён.

Функция _lastdigitcusip вычисляет контрольную цифру по первым 8 символам CUSIP.

Функция checkdigit проверяет, совпадает ли 9-й символ CUSIP с вычисленной контрольной цифрой.

Как работает алгоритм:
  1. Каждый символ строки преобразуется в числовое значение:
    • Цифры от 0 до 9.
    • Буквы от A до Z преобразуются в числа от 10 до 35.
    • Специальные символы имеют фиксированные значения.
  2. Если позиция символа чётная (по счёту), его значение умножается на 2.
  3. Полученное значение разбивается на десятки и единицы, которые суммируются.
  4. По итоговой сумме вычисляется контрольная цифра.

Проверка кодов

for code in ("037833100", "17275R102", "38259P508", "594918104", "68389X106", "68389X105")
    println("$code is ", CUSIP.checkdigit(code) ? "correct." : "not correct.")
end
037833100 is correct.
17275R102 is correct.
38259P508 is correct.
594918104 is correct.
68389X106 is not correct.
68389X105 is correct.

Здесь проверяется несколько CUSIP-кодов на корректность. Для каждого вызывается функция checkdigit, и выводится результат.

Заключение

Мы рассмотрели реализацию алгоритма проверки контрольной цифры CUSIP на языке Julia. Были разобраны функции вычисления контрольной цифры и проверки корректности кода. Это полезно для систем, работающих с финансовыми инструментами, где важна точность данных. Реализация показывает, как можно эффективно работать со строками и числами в Julia, используя встроенные функции и логические конструкции.

Пример разработан с использованием материалов Rosetta Code