본문 바로가기

IT/파이썬 Python

[파이썬] ISIN 코드 (표준코드) 체크 디지트 (검사숫자) 계산함수

반응형



주식이나 파생상품 등 거래소에서 거래되는 상품 (혹은 거래되지 않더라도 코드가 필요한 상품) 에는 모두 ISIN코드가 부여됩니다.

한국거래소에서도 ISIN코드를 부여 하는데요, ISIN코드는 11자리의 정보 + 1자리 체크 디지트로 구성됩니다.

체크 디지트는 12자리 ISIN코드가 정상적인 코드인지 정합성을 확인하기 위한 코드입니다.

오늘은 ISIN코드 중 11자리를 입력하면, 나머지 체크 디지트 1자리를 계산하는 파이썬 코드를 공유해 봅니다.


def calc_checkdigit(isin):
    """Calculate and return the check digit"""
    #Convert alpha characters to digits
    isin2 = []
    for char in isin:
        if char.isalpha():
            isin2.append((string.ascii_uppercase.index(char.upper()) + 9 + 1))
        else:
            isin2.append(char)
    #Convert each int into string and join
    isin2 = ''.join([str(i) for i in isin2])
    #Gather every second digit (even)
    even = isin2[::2]
    #Gather the other digits (odd)
    odd = isin2[1::2]
    #If len(isin2) is odd, multiply evens by 2, else multiply odds by 2
    if len(isin2) % 2 > 0:
        even = ''.join([str(int(i)*2) for i in list(even)])
    else:
        odd = ''.join([str(int(i)*2) for i in list(odd)])
    even_sum = sum([int(i) for i in even])
    #then add each single int in both odd and even
    odd_sum = sum([int(i) for i in odd])
    mod = (even_sum + odd_sum) % 10
    return (10-mod)%10


검사숫자를 산출하는 방법은 거래소의 "표준코드 관리기준" 에 설명되어 있습니다. (구글링 해 보시면 맨 위에 나오는 문서입니다)

코드를 보시면 산출방법이 그대로 잘 구현되어 있습니다.

  1. 숫자는 그대로 두고, 알파벳 문자인 경우 A=10, B=11 ... Z=35로 변환
        isin2.append((string.ascii_uppercase.index(char.upper()) + 9 + 1))

  2. 숫자열의 우측부터 2배, 1배, 2배 ... 계산 : 숫자열이 홀수인 경우 짝수번째 숫자들을 2배 곱하고, 짝수인 경우 홀수번째  숫자들을 2배 곱합니다.
        even = isin2[::2]
        odd = isin2[1::2]
        if len(isin2) % 2 > 0:
            even = ''.join([str(int(i)*2) for i in list(even)])
        else:
            odd = ''.join([str(int(i)*2) for i in list(odd)])

  3. 위에서 계산된 일련의 숫자들을 1자리마다 가산하고, 그 수의 첫 자리 (10으로 나눈 나머지) 를 10에서 뺀 숫자가 검사 숫자가 됩니다. 10인 경우 0이 검사숫자가 되므로 해당 값을 다시 10으로 나눈 나머지값이 최종 결과물이 됩니다.
        even_sum = sum([int(i) for i in even])
        #then add each single int in both odd and even
        odd_sum = sum([int(i) for i in odd])
        mod = (even_sum + odd_sum) % 10
        return (10-mod)%10


반응형