본문 바로가기

[금융]/[Quant]

[Quant] 기술통계학(요약 통계량)

728x90

 < 요약 통계량 기초 >

 

 

  퀀트는 금융에 수리통계학적 알고리즘 기법을 적용시킬 줄 알아야 한다. 이를 위한 기본지식이 바로 기술통계학 지식이다. 기술통계학(description statistics)은 자료를 요약,정리하여 전체적인 특성을 파악하고 해석하기 위해 사용하는 통계기법으로 가장 기초가 되는 개념으로는 중고등학교 수학시간에 배우던 평균,중앙값,최빈값,분산,표준편자등이 있다. 파이썬, 금융과 관련해 내용들을 정리하기로 한다. 

 

- 산술평균 (이동평균선) - 

수학과 통계학에서 산술 평균(算術平均, arithmetic mean)은 주어진 수의 합을 수의 개수로 나눈 값이다.

< 산술평균의 수학적 정의 >

  이 산술평균은 주식에서 이동평균선(MA: moving average)의 의미를 갖는다.

예를 들어 수식에서 n=5라면 위에 보이는 그래프에서  EMA5, 즉 5일 이동평균선에 해당한다. 이후에는 파이썬 함수를 쓰게 되겠지만 파이썬으로 간단하게 구현하는 MA는 다음과 같다.

MA = [ 123, 124, 125, 345, 124]
MA_VALUE = sum(MA) / len(MA) 

# 함수로 만든다면
def mean(stock):
	return sum(stock)/len(stock)

 

- 기하평균 (평균 증감률) -

기하 평균(幾何平均)은 n개의 양수 값을 모두 곱한 것의 n제곱근이다.

< 집합 a의 기하평균>

  기하평균은 퀀트에서 기본적으로 쓰이는 경우가 많은데, 그중에서 특히 곱으로 계산하는 값에서의 평균을 나타내는데 유용하게 쓸 수 있다. 예를 들어 삼성전자의 주가가 40000원이라고 하자, 첫해에 +20%, 두번째 해에 -10%, 그 다음 해에 50%증가를 이루었다고 가정해 보자. 그러면 최종 결과 값은 40000 * 1.2 * 0.9 * 1.5인데, 이는 1.2, 0.9, 1.5의 기하평균값을 40000에 세번 곱한 것과 같다( 위의 수식으로 간단하게 생각해보면 a1*a2*a3만 남는 것을 알 수 있다.) 또한 이 기하평균값이 삼성전자의 3년동안 평균 주가상승률이 된다. 해당 부분을 파이썬 코드로 함수로 만들면 다음과 같다.

from math import * 

def geometrical(*arg): # 튜플형태로 입력받는다. 여려개의 인수를 받을 수 있다.
    print (arg)
    geometrical_list = [1 + (x/100) for x in arg] # 백분률로 변환한다.
    print (geometrical_list)
    total = 1
    for x in geometrical_list:
        total *= x
    return pow((total), 1/len(geometrical_list))-1

< jupyter notebook에서 실행시켜본 함수 >

결과를 보면 해당 주식을 보유했을 경우 연평균 17%의 수익을 올렸다고 할 수 있다. 

 

- 중앙값 -

중앙값(median) 또는 중위수는 어떤 주어진 값들을 크기의 순서대로 정렬했을 때 가장 중앙에 위치하는 값을 의미한다. 데이터가 홀수인 경우에는 중간에 있는 값이고, 짝수인 경우에는 중간에 위치한 두 값의 평균을 뜻한다. 

def median(data):
    length = len(data) 
    median = int(length / 2)
    if(length % 2 ==0):
        return (data[median-1] + data[median]) / 2
    else:
        return data[int(median)]

 

- 분산 -

확률론 통계학에서 어떤 확률변수 분산(分散, 영어: variance, 변량)은 그 확률변수가 기댓값으로부터 얼마나 떨어진 곳에 분포하는지를 가늠하는 숫자이다. 기댓값은 확률변수의 위치를 나타내고 분산은 그것이 얼마나 넓게 퍼져 있는지를 나타낸다. 쉽게말해 평균값 주변에 데이터들이 모여있는지 흩어져 있는지를 알려주는 데이터 이다. 분산의 수식은 평균값의 차이의 제곱들의 합이라고 보면 된다.  주로 루트를 씌운 편차를 많이 이용하기는 한다. 편차는 데이터의 값과 평균값의 차이를 의미하며, 편차가 큰 데이터가  많다는 것은 분산이 큰 데이터라고 할 수 있다.

def variance(data):
    vari_mean = mean(data)
    diff = 0
    for n in data:
        diff += (n- vari_mean)**2
    return diff/(len(data) - 1)
728x90