레이블이 Finance인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Finance인 게시물을 표시합니다. 모든 게시물 표시
THE DIFFERENCE BETWEEN ETFs AND CLOSED-END FUNDS



트레이더들에게 있어서 exchange-traded funds (ETFs)와 closed-end funds(CEFs)의 차이를 이해하는 것은 매우 중요합니다. 이 장단점을 아는 것은 투자 결정을 하는 데 도움을 줄 것입니다.


CEF에 대해 보통 오해하는 것은 CEF가 전통적인 뮤츄얼 펀드나 ETF라고 생각하는 것입니다. closed-end fund는 전통적인 뮤츄얼 펀드처럼 트레이더들에게 closed되어 있지 않습니다. 심지어 CEF 주식은 ETFs가 아니지만 거래소에서 거래도 됩니다.


closed-end fund (CEF) 혹은 closed-ended fund 


CEF는 회수 할 수 없는 특정 수량의 주식 발행을 기반으로 결합된 투자 모델입니다. 즉, 투자자가 펀드에 투자 후 환매를 할 수가 없다는 것입니다. 또한 만기가 있고, 펀드 모집 후 펀드 만기 이전에 open-end funds와 달리, closed-end fund에서는 가입이 제한됩니다. 주식들은 open-end 뮤츄얼 펀드를 선행하지만 오히려 적극적으로 관리되는 투자와 유사하고, 뮤츄얼 펀드에 의해 원래 설계된 시장에서만 구매 및 판매 될 수 있습니다.


exchange-traded fund (ETF)


ETF는 주식 시장에서 거래되는 투자 펀드입니다. 하나의 ETF는 주식, 실물자산, 채권과 같은 자산들을 보유합니다. 일반적으로 편차가 발생할 수 있지만 일반적으로 순자산 가치에 가깝게 거래하도록 설계된 차익 거래 메커니즘을 통해 설계됩니다. 대부분 ETF는 주식 지수 혹은 채권 지수와 같은 지수를 추종합니다. 낮은 cost, 세금, 주식과 같은 특징을 갖는다는 것이 흥미로운 점입니다.


CEF와 ETF의 차이점들:



  • Transparency (투명성)

ETF는 완전히 투명합니다. ETF는 인덱스 및 액티브 펀드 여부에 상관없이 포트폴리오가 투명하게 운영되고 거래일 동안 일정한 주기로 가격이 형성됩니다. 투자자들은 손쉽게 기초자산, 채권, 원자재 등을 인식할 수 있습니다.

CEF는 보유 자산을 포함한 포르폴리오 세부 정보는 월별, 분기 별 또는 반기 별로만 제공됩니다.


  • Fee (수수료)


CEF의 비용은 ETF와 비교하여 높습니다. 왜냐하면 ETF는 indexed된 포트폴리오이고 이 포트폴리오는 actively manged되는 포트폴리오보다 제어하는데 비용이 덜 들기 때문입니다. 게다가 적극적으로 관리되는 포트폴리오의 내부 거래 비용은 ETF의 내부 거래 비용보다 높습니다. 포트폴리오의 회전율이 낮기 때문입니다. 그러므로 장기 투자를 계획하고 있는 투자자는 CEF에 비해 ETF에 투자하면 많은 것을 절약할 수 있습니다.

어떤 투자도 다른 것에 비해 더 좋거나 나쁘지 않습니다. 그것은 단지 다를 뿐이며 자유롭고 공정한 자본 시장에서는 여러 가지 투자 옵션을 얻는 것이 핵심 요소입니다.



  • Net Asset Value (NAV) 순자산 가치


ETF는 일반적으로 NAV에 가깝게 거래됩니다. ETF가 NAV에 비해 큰 프리미엄이나 할인으로 거래를 하는 것은 예외적인 일입니다. 역사적으로 기관들은 creation 단위를 만들거나 청산함으로써 차익거래 기회를 보았습니다. 그렇기 때문에 ETF 주식 가격은 기초자산 지수 또는 증권 바구니의 NAV에 가깝게 유지할 수 있습니다.


반면에, CEF는 NAV 대비 프리미엄을 붙이거나 할인을 할 가능성이 더 큽니다. 프리미엄은 펀드의 주식에 대해 더 많은 수요가 있다는 것을 나타내며, 할인은 수요가 적다는 것을 나타낼 수 있습니다. 여기서 순자산 가치(NAV)는 총자산에서 부채를 차감하고 총 주식 수로 나누어 계산합니다.









Correlated assets

주식 시장이 움직이는 것을 정확히 예측하는 것은 매우 어려운 일입니다. 주식이 특정 방향으로 움직이는 것은 수백만 개의 이벤트와 사전 조건이 존재하기 때문입니다. 그래서 우리는 이러한 사전 조건들을 capture해야합니다. 그러기 위해서 우리는 아래와 같은 가정들이 필요합니다.


1) 시장은 100% random하지 않다.
2) 역사는 반복된다.
3) 시장은 사람들의 합리적인 행동에 따른다.
4) 시장은 'perfect'하다.



우리는 이러한 가정을 한 뒤, 삼성전자(005930) 의 주가 움직임을 예측해 볼 것입니다. 
우리는 삼성전자의 주가가 등락 여부에 어떤 것들이 영향을 주는 지를 이해해야 합니다. 그러므로, 우리는 가능한 많은 정보를 통합할 것입니다. (주식을 다양한 방면과 각도로 묘사하기 위해) 우리는 일별 데이터 (우리가 가지고 있는 데이터의 70%) 를 사용하여 다양한 알고리즘을 훈련시키고 나머지를 예측하는데 사용할 것입니다. 그리고 우리는 예측된 결과와 hold-out 데이터를 비교할 것입니다. .

이것들은 꼭 주식이 아니더라도 원자재, FX, 지수, 채권 등 아무 유형이 가능합니다.
삼성전자와 같은 큰 기업은 고립되어 있지 않습니다. 경쟁사를 포함하여 고객들, 글로벌 경제, 지정학적 현상, 재정 및 통화 정책, 자본 접근 등 외부요인이 있습니다.


Correlated stocks

이번 포스팅에서는 먼저 삼성전자와 유의미한 상관관계를 갖고 있는 기업들을 찾아볼 것입니다. 전체적으로는 상관관계가 있는 기업을 찾기 위해, 종가데이터를 이용하여 correlation을 구하는 것 방법의 문제점과 해결 방법에 대해 알아보도록 하겠습니다.

Environment
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split


Configuration


2008년 1월 2일부터 2019년 1월 25일의 데이터를 사용할 것입니다. (7년은 training 목적, 3년은 validation 목적)


Input:
train, test = train_test_split(samsung_df, test_size=0.3, shuffle=False)
print('There are {} number of days in the dataset.'.format(samsung_df.shape[0]))
print('train set : {}, test set : {}'.format(train.shape[0], test.shape[0]))
print('train period : {} ~ {}'.format(train.index[0], train.index[-1]))
print('test period : {} ~ {}'.format(test.index[0], test.index[-1]))

Output:
There are 2739 number of days in the dataset.
train set : 1917, test set : 822
train period : 2008-01-02 ~ 2015-09-16
test period : 2015-09-17 ~ 2019-01-25






먼저 전체 주가 데이터를 symbol을 column으로 하여 데이터프레임을 생성한 뒤 데이터를 입력합니다.

Input:
all_df.head(2)

Output:




이제 특정 기업과 나머지 모든 기업에 대한 correlation을 구합니다. 여기서 먼저 correlation을 구하기 위한 함수를 정의해줍니다. 종목들마다 종가데이터가 있는 정도가 다르기 때문에 nan값에 대한 처리를 해주는 것이 중요합니다.

def search_string(gr, column, strings_list):
    if isinstance(strings_list,str):
        strings_list = [strings_list]
    if isinstance(column, str):
        #### if column is not a list but a string, it means there is only one column to search
        return gr[gr[column].str.contains('|'.join(strings_list),na=False)]
    else:
        gr_df = pd.DataFrame()
        counter = 0
        for col in column:
            if counter == 0:
                gr_df =  gr[gr[col].str.contains('|'.join(strings_list),na=False)]
                counter += 1
            else:
                gr_df.append(gr[gr[col].str.contains('|'.join(strings_list),na=False)])
                counter += 1
        return gr_df

    
def top_correlation_to_name(stocks, column_name, searchstring, top=10, abs_corr=False):
    incl = [x for x in list(stocks) if x not in column_name]
    ### First drop all NA rows since they will mess up your correlations.
    stocks.dropna(inplace=True)
    ### Now find the highest correlated rows to the selected row ###
    try:
        index_val = search_string(stocks, column_name,searchstring).index[0]
    except:
        print('Not able to find the search string in the column.')
        return
    ### Bring that selected Row to the top of the Data Frame
    df = stocks[:]
    df["new"] = range(1, len(df)+1)
    df.loc[index_val,"new"] = 0
    stocks = df.sort_values("new").drop("new",axis=1)
    stocks.reset_index(inplace=True,drop=True)
    ##### Now calculate the correlation coefficients of other rows with the Top row
    try:
        if abs_corr == True:
            cordf = pd.DataFrame(stocks[incl].T.corr().abs().sort_values(0,ascending=False))
        else:
            cordf = pd.DataFrame(stocks[incl].T.corr().sort_values(0,ascending=False))
    except:
        print('Cannot calculate Correlations since Dataframe contains string values or objects.')
        return
    try:
        cordf = stocks[column_name].join(cordf)
    except:
        cordf = pd.concat((stocks[column_name],cordf),axis=1)
    #### Visualizing the top 5 or 10 or whatever cut-off they have given for Corr Coeff
    if top >= 1:
        top10index = cordf.sort_values(0,ascending=False).iloc[:top,:3].index
        top10names = cordf.sort_values(0,ascending=False).iloc[:top,:3][column_name]
        top10values = cordf.sort_values(0,ascending=False)[0].values[:top]
    else:
        top10index = cordf.sort_values(0,ascending=False)[
            cordf.sort_values(0,ascending=False)[0].values>=top].index
        top10names = cordf.sort_values(0,ascending=False)[
            cordf.sort_values(0,ascending=False)[0].values>=top][column_name]
        top10values = cordf.sort_values(0,ascending=False)[
            cordf.sort_values(0,ascending=False)[0].values>=top][0]
    #### Now plot the top rows that are highly correlated based on condition above
    stocksloc = stocks.iloc[top10index]
    #### Visualizing using Matplotlib ###
    stocksloc = stocksloc.T
    stocksloc = stocksloc.reset_index(drop=True)
    stocksloc.columns = stocksloc.iloc[0].values.tolist()
    stocksloc.drop(0).plot(subplots=True, figsize=(15,10),legend=False,
                         title="Top %s Correlations to %s" %(top,searchstring))
    [ax.legend(loc=1) for ax in plt.gcf().axes]
    plt.tight_layout()
    plt.show()
    
    return dict(zip(top10names, top10values))


그 후, 함수를 사용하기 위해 전처리를 해줍니다.

Input:
all_df_T = all_df.T
all_df_T.reset_index(drop=False, inplace=True)
all_df_T.head(1)

for col in incl:
    all_df_T[col] = all_df_T[col].map(lambda x: float(x))


Output:




Input:
top_correlated_companies = top_correlation_to_name(all_df_T, 'index', '005930', 5, abs_corr=True)


Output:




주가를 기반으로 유의미한 상관관계를 갖는 종목은 이와 같은 결과가 나왔습니다.


Input:
for key, value in top_correlated_companies.items():
    print('{} : {}'.format(company_list.loc[company_list.종목코드 == key, '회사명'].values[0], value))   


Output:

삼성전자 : 1.0
오리온홀딩스 : 0.9480981638541061
제일기획 : 0.9368736502664881
비에이치 : 0.9202494270558285
농우바이오 : 0.9143668553498088


위 목록에 대한 놀라운 사실은 오리온 홀딩스가 삼성그룹 계열사보다 삼성전자와 더 관련이 있다는 것입니다. 이것을 더 자세히 조사해 봅시다.

위와 같은 주식 차트처럼 "trendy"한 시계열 데이터에 대한 것 중 하나는 오해의 소지가 있는 결론으로 이어질 수 있습니다.

각 차트는 시간과 관련이 있기 때문에 한 주식 차트가 다른 차트에 대해 회귀 할 때 주가와 같은 "trendy"한 시계열 데이터가 까다로울 수 있습니다. 그들은 모두 시간과 상관 관계가 있기 때문에 강하지만, 종종 가짜 관계를 나타낼 것입니다.

따라서 주가와 같은 "trendy"한 시계열 데이터는 "nonstationary"로 간주됩니다.(즉, 시간에 따라 변화하는 평균 및 분산을 갖는 것)

그렇기 때문에 시계열 데이터를 처리 할 때 당신은 일반적으로 그들이 시간에 독립적으로 상관 관계가 있는지 알고 싶어할 것입니다. 한 series의 variations이 다른 것의 variations과 일치 하는지 여부를 알고 싶을 겁니다. 이 때, "Trend"의 존재는 당신을 혼동시킬 수 있으므로 피해야합니다.

따라서 데이터에서 "trend"을 제거하기 위해 다음의 작업을 수행했습니다.

먼저 전체 시계열을 1의 기간으로 차이를 두었습니다. 이것은 지난 기간동안 포트폴리오에서 모든 "일일 수익률"을 얻었음을 의미합니다. 우리는 이제 삼성전자의 일일 수익률과 가까운 correlation을 갖는 종목들로 비교할 것입니다.

우리의 데이터 프레임에 적용된 "diff (1)"함수로 pandas에서 이것을 쉽게 수행 할 수 있습니다. 우리는 기존의 주식 포트폴리오에서 differnce를 하도록 하겠습니다. .


Input:
all_df_diff = all_df.diff(1)
all_df_diff = all_df_diff.iloc[1:,:]
all_df_diff_T = all_df_diff.T
all_df_diff_T.reset_index(drop=False, inplace=True)

for col in incl:
    all_df_diff_T[col] = all_df_diff_T[col].map(lambda x: float(x))

top_correlated_companies = top_correlation_to_name(all_df_diff_T, 'index', '005930', 5, abs_corr=True)

for key, value in top_correlated_companies.items():
    print('{} : {}'.format(company_list.loc[company_list.종목코드 == key, '회사명'].values[0], value))   


Output:



삼성전자 : 1.0
삼성전기 : 0.4065839894458186
SK하이닉스 : 0.3751230260001406
LG디스플레이 : 0.36649793644842443
삼성증권 : 0.35648431858304086




새로운 차트의 흥미로운 점은 이전보다 삼성전자와의 상관관계가 훨씬 낮다는 것입니다. "trend"를 제거했음에도 불구하고 상관관계가 있는 종목들을 보면 기존의 결과와는 매우 다릅니다. 삼성의 계열사가 주를 이루고 관련되어 있는 종목들이 결과로 나오는 것을 확인할 수 있습니다. 이 간단한 tool을 통해서 우리는 상관관계가 있는 종목들을 도출해 낼 수 있습니다. 이처럼 시계열의 데이터에서 얻을 수 있는 "trend"가 있는 데이터는 분명히 차이를 둬야된다는 것은 매우 중요합니다.



다음 포스팅에서는 이 상관관계가 있는 종목 데이터를 이용하는 방법에 대해 알아보겠습니다.












Macroeconomic forecasting with Gaussian processes






정확한 거시경제 예측은 사업 결정, 금융 거래, 그리고 정치인과 경제학자들에 의한 정책 결정의 근거로서 필수적입니다. 전통적으로 시계열 데이터에 대한 선형 회귀 또는 밀접하게 관련된 방법을 통해 수행되었습니다. 
본 포스팅에서는 인기 있는 비선형적 방법인 가우스 프로세스 회귀 분석을 사용하여 여러 국가의 GDP를 예측하여 전통적인 기법보다 더 나은 결과를 얻을 수 있는지 여부를 확인하고자 합니다.

가장 중요한 거시경제변수는 아마도 국내총생산(GDP)일 것입니다. 그것은 한 지역에서 판매되는 모든 상품과 서비스의 가치를 측정하기 때문입니다. 따라서 우리는 GDP 예측에 초점을 맞출 것입니다.

전체적으로는 다음과 같이 구성됩니다.

1. 먼저 데이터를 로드하고 변환한 다음, 
2. simple baseline method 및 multivariate time-series regression을 평가하고 
3. 마지막으로 가우스 프로세스(GP) 회귀 분석과 비교합니다.

Environment

우리는 pandas, statsmodels, scikit-learn 패키지를 사용할 것입니다. 
콘솔이나 터미널에 아래와 같은 명령어로 설치합니다. 
    > pip3 install pandas
    > pip3 install statsmodels
    > pip3 install sklearn



Configuration

첫 째로, 우리는 configuration을 특정할 것입니다. 만약 다른 나라, 기간, indicators가 필요하다면 코드를 바꾸시면 됩니다.


Input:

# out-of-sample로 사용할 년도의 수 
#(실제 GDP와 비교하여 매년 국가별로 하나의 예측을 할 것입니다)
nyears = 10
# GP regression에 사용할 lag의 수
lags = 5
# Indicator labels과 the World Bank API에서의 이름
indicators  = {"gdp"        : "NY.GDP.MKTP.CD",
               "population" :    "SP.POP.TOTL",
               "inflation"  : "FP.CPI.TOTL.ZG"}
nindicators = len(indicators)
# 예측하기 위한 변수, indicator labels 중에 하나여야 함
target_variable = "gdp"
# Countries to include in the data, specified as ISO country codes
countries  = ['au','ca','de','es','fr','gb','jp','us']
ncountries = len(countries)
# 데이터 셋의 시작 연도와 마지막 연도
start_year = 1976
end_year   = 2018


Data

Loading

먼저 우리는 몇몇의 거시경제 지표들을 the World Bank HTTP API를 통하여 다운받을 것입니다. 여기서 Python의 requests 패키지를 사용하게 됩니다.

먼저 우리가 위에 configuration에서 설정했던 각각 다른 나라들, indicator로 채워질 template url을 특정합니다. 우리가 URL에 request할 때, 그 데이터들은 json 형식으로 fetched 될 것입니다. 우리는 그것들을 pandas dataframe에 넣을 것입니다.

import requests
import pandas as pd
template_url = "http://api.worldbank.org/v2/countries/{0}/indi"
template_url += "cators/{1}?date={2}:{3}&format=json&per_page=999"

# Countries는 세미 콜론으로 분리됩니다.
country_str = ';'.join(countries)
raw_data = pd.DataFrame()
for label, indicator in indicators.items():
    # template URL을 채웁니다.
    url = template_url.format(country_str, indicator, start_year, end_year)

    # 데이터를 request하고
    json_data = requests.get(url)

    # JSON String을 python object로 변경합니다.
    json_data = json_data.json()

    # 반환되는 데이터는 리스트이며, 첫 번째 element는 meta데이터,
    # 두 번째 element가 실제 데이터입니다.

    json_data = json_data[1]

    # 모든 데이터 포인트를 loop하며 value들을 dataframe으로 확장합니다.
    for data_point in json_data:
        country = data_point['country']['id']
        # 각각 나라, indicator로 variable을 만듬
        item = country + '_' + label

        year = data_point['date']

        value = data_point['value']

        # DataFrame으로 Append
        new_row = pd.DataFrame([[item, year, value]],
                               columns=['item', 'year', 'value'])
        raw_data = raw_data.append(new_row)
# 데이터를 피벗하여 columns을 따라 특정 연도를 얻고, rows를 따라 variable을 얻습니다.
raw_data = raw_data.pivot(index='year', columns='item', values='value')

# rows와 columns 출력 테스트
print('\n', raw_data.iloc[:10, :5], '\n')

Output:



Exploration

plots을 통해 데이터를 explore해보도록 하겠습니다.

Input:
import matplotlib.pyplot as plt
for lab in indicators.keys():
    
    indicator = raw_data[[x for x in raw_data.columns 
                              if x.split("_")[-1] == lab]]
    indicator.plot(title=lab)
    plt.show()

Output:




US의 GDP 성장율이 클수록 인구의 증가가 빠르다는 것을 부분적으로 설명할 수 있을 것입니다. 이것은 우리의 모델에 의해 captured 되어야 합니다.

Transformation

우리는 우리 모델의 데이터를 사용하기 전에, 적절한 모델로 transform해줘야 합니다.


Input:

import numpy as np

# 절대 값 대신에 우리는 상대적인 변화율을 이용할 것입니다.
# Nan값 때문에 오류가 발생할 수 있습니다.
data = np.log(raw_data).diff().iloc[1:,:]

# NaN을 0으로 채움.
data.fillna(0, inplace=True)

# 각 Series에서 평균값을 뺌
data = data - data.mean()

# index의 데이터 타입을 변경
data.index = pd.to_datetime(data.index, format='%Y')

# target variable 데이터만 뽑아서 target 변수에 넣음.
target = data[[x for x in data.columns if x.split("_")[-1] == target_variable]]


Evaluation

모든 모델들은 같은 방법으로 평가됩니다. 데이터의 마지막 연도를 예측하기 위해 우리는 각 나라의 이전 년도 데이터를 이용하여 모델을 훈련합니다. 각 예측에서 우리는 실제 값과 예측된 값의 차이를 제곱하여 error를 계산합니다. 그리고 mean을 구한 뒤, 제곱근을 취함으로써 우리는 root mean squared error (RMSE)를 구할 수 있습니다.



 ŷ𝒾 는 forecast 값,  𝘺𝒾 는 타겟 변수의 실제 값, 그리고 m은 우리가 예측할 년도의 개수입니다.

Baseline forecasts

우리는 먼저 simple baseline method 로 performance를 확인 해 본 뒤, subsequent methods와 비교해 볼 것입니다. baseline method는 간단하게 목표 변수의 이전 관측치와 동일한 변화율을 예측할 것입니다.

더 복잡한 방법은 naive baseline forecast보다 두드러지게 outperform하는 경우에만 사용하는 것이 좋습니다. the principle of Occam's Razor와 the KISS principle을 지키는 것이 좋습니다.

Input:

errors = target.iloc[-nyears:] - target.shift().iloc[-nyears:]
# Root mean squared error
rmse = errors.pow(2).sum().sum()/(nyears*ncountries)**.5
print('\n\t' + '-' * 18)
print("\t| Error: ", np.round(rmse, 4), '|')
print('\t' + '-' * 18 + '\n')


Output:






Multivariate time series


우리는 이제 multivariate time series regression의 performance를 조사해 볼 것입니다.
계량 경제학에서는 Vector Autoregression (VAR)이라고도 불립니다.


d는 독립 변수의 수, 𝜀는 lag의 수, εt 는 error term,  βi,jβi,j 는 추정된 파라미터입니다.
시계열 분석에 대한 자세한 내용을 알기 위해서는 Brockwell과 Davis의 "Time Series: Theory and Methods"와 Hamilton의 "Time Series Analysis"를 추천합니다.

모델을 fit하기 위해서 우리는 statsmodels 패키지를 사용합니다. 여기서 VAR 구현은 최소 제곱을 사용하여 매개 변수를 추정합니다. 하나의 lag를 이용하여 model을 훈련시킵니다. 즉, 독립 변수의 가장 최근 이전 값에서 대상 변수를 regression하지만, lag의 수를 설정을 지원하는 automatic methods도 있습니다. the Akaike Information Criterion (AIC) 나 Bayesian Information Criterion (BIC) 등이 있습니다.


Input:

from statsmodels.tsa.api import VAR
# Sum of squared errors
sse = 0
for t in range(nyears):
    
    # Create a VAR model
    model = VAR(target.iloc[t:-nyears+t], freq='AS')
    
    # Estimate the model parameters
    results = model.fit(maxlags=1)
    
    actual_values = target.values[-nyears+t+1]
    
    forecasts = results.forecast(target.values[:-nyears+t], 1)
    forecasts = forecasts[0,:ncountries]
sse += ((actual_values - forecasts)**2).sum()
# Root mean squared error
rmse = (sse / (nyears * ncountries))**.5
print('\n\t' + '-' * 18)
print("\t| Error: ", np.round(rmse, 4), '|')
print('\t' + '-' * 18 + '\n')

Output:



우리는 복잡한 VAR모델이 거시 경제 예측을 위해서 baseline model과 거의 동일하다는 것을 알 수 있습니다.


Gaussian process regression


우리는 이제 Gaussian process regression을 이용하여 GDP를 예측할 것입니다. 우리의 모델은 이전과 비슷합니다.
𝘺𝑡는 타겟 변수의 관측치입니다. 각 𝓍𝑡는 독립 변수의 관측된 벡터입니다.   𝑓(𝓍)는 regression 함수이고 noise term ε𝑡은 분산 α를 갖는 normal (Gaussian) distribution을 가지고 있습니다. 각 out-of-sample 예측에서 우리는 타겟 변수 y의 n년 간의 관측된 값을 column vector로 넣고 y로 나타낼 것입니다. 우리는 또한 각 관측치가 행렬에서 행을 차지하는 n년간 독립 변수의 관측치의 matrix를 X라고 할 것입니다. 여기서 각 관찰은 변수의 lagged values들을 포함할 것입니다.

회귀 함수 𝑓 (𝓍)가 임의의 매개 변수를 가진 선형 함수인 대신에, 함수는 이제 랜덤한 값을 가지므로 각 점 𝓍𝑡에서의 값은 정규 분포의 확률 변수이고 두 개의 확률 변수 𝑓(𝓍𝑡)와 𝑓(𝓍𝑠)는 소위 공분산 함수 (또는 커널) 𝑘(𝓍𝑡, 𝓍𝑠)에 의해 주어지며, 이것들은 지정되어야 합니다. 𝑓(𝓍) 함수는 '가우시안 프로세스'라 불립니다. error term이 정상적으로 분포되기 때문에 목표 값은 𝑡 = s이고 𝑘 (𝓍𝑡, 𝓍𝑠) 이면 𝑘 (𝓍𝑡, 𝓍𝑠) +𝑎 와 같은 공분산으로 정규 분포됩니다.

𝘺𝑡 𝓍𝑡 에 대해 nn 개의 데이터 포인트를 사용하여 모델을 추정하고, 우리가 𝑛+₁ 의 예측을 토대로 새로운 테스트 포인트 𝓍𝑛+₁을 가지고 있다고 가정합시다. 주어진 y, 𝑋 ,𝓍𝑛+₁ 에서 f(𝓍𝑛+₁의 조건부 분포는 또한 정규 분포를 가지며  ŷ𝑛+₁ 의 예측을 𝑓(𝓍𝑛+₁)의 조건부 기대 값으로 삼을 수 있습니다.  잘 알려진 공식인 multivariate Gaussian distribution은 아래와 같습니다.

K는 n X n 행렬 (행 t와 열 s에 대한 엔트리는  𝑘 (𝓍𝑠, 𝓍𝑡)로 주어지고, 𝐼는 항등 행렬이며, 𝐤는 𝑘(𝓍𝑡,𝓍𝑛+₁)에 의해 주어진 t를 갖는 길이 n의 열 벡터입니다.

classification에도 사용되는 Gaussian process methods를 더 읽기 위해서는, Rasmussen 과 Williams의 "Gaussian Processes in Machine Learning"을 보는 것을 추천합니다.

Gaussian process regression은 scikit-learn 패키지를 이용합니다. 각 예측 연도에 대해 과거 타겟 변수의 관측치들의 벡터 y와 독립 변수의 관측치들의 data matrix X를 생성합니다.
우리는 이것들을 GaussianProcessRegressor 클래스에 제공하여 모델을 estimate한 다음 다음 해에 대한 예측을 할 것입니다. 이전과 마찬가지로 RMSE를 사용하여 오류를 계산합니다.

우리는 아래와 같은 common Gaussian covariance function을 사용할 것입니다.

∥v∥   vector vv의 길이이고 , σσ 는 매개변수입니다.


Input:

from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF

# 우리는 covariance function의 매개변수를 일반적인 covariance function의
# heuristic인 데이터 포인트의 median으로 사용합니다.
# The 'alpha' 인수는 잡음 분산이며, 우리가 covariance 매개변수와 동일하게 설정합니다.

gpr = GaussianProcessRegressor(kernel=RBF(0.1), alpha=0.1)
# 각 예측의 estimation/fitting을 위한 데이터 포인트의 수
ndata = target.shape[0] - nyears - lags
print(ndata)
# Sum of squared errors
sse = 0
for t in range(nyears):

    # 타겟 변수의 관측치
    y = np.zeros((ndata, ncountries))
    # 독립 변수의 관측치
    X = np.zeros((ndata, lags * ncountries * nindicators))

    for i in range(ndata):
        y[i] = target.iloc[t + i + 1]
        X[i] = data.iloc[t + i + 2:t + i + 2 + lags].values.flatten()

    gpr.fit(X, y)

    x_test = np.expand_dims(data.iloc[t + 1:t + 1 + lags].values.flatten(), 0)
    forecast = gpr.predict(x_test)

    sse += ((target.iloc[t].values - forecast) ** 2).sum()

rmse = (sse / (nyears * ncountries)) ** .5
print('\n\t' + '-' * 18)
print("\t| Error: ", np.round(rmse, 4), '|')
print('\t' + '-' * 18 + '\n')


Output:

우리는 지금까지 얻은 결과를 정리해보면 Gaussian process regression을 사용하여 얻은 결과는 baseline과 linear regression models과 비교하여 약간의 성능 개선이 있다는 것을 확인할 수 있었습니다.


옵션 가격결정 & The "Greeks"





1. 옵션 가격결정

이번 포스팅은 옵션 가격 결정과 Greeks에 대해 알아보도록 하겠습니다.

the Greeks를 이해하는 것, 내재 변동성, time decay(감쇠) 등 옵션 가격에 영향을 주는 요소들을 고려해 주는 것은 이 산업에서 성공적인 비지니스를 이룰 수 있는지와 없는지를 구별해 줄만큼 매우 중요한 요소입니다.

하지만 시장 변화에 따라 단일 옵션 또는 복수의 옵션이 포함된 포지션의 가격에 어떤 일이 발생할지 예측하는 것은 어려울 수 있습니다. 옵션은 많은 다른 요소들이 포함되어 있기 때문입니다. 따라서 옵션가격이 항상 주식의 가격과 함께 움직이는 것처럼 보이지 않기 때문에, 어떤 요소들이 옵션의 가격에 기여하고 그들이 가지는 영향을 이해하는 것이 중요합니다.

옵션 트레이더들은 종종 옵션 포지션의 델타, 감마, 베가, 세타를 이용합니다. 이것들은 종합적으로 "Greeks"라고 불리며 수량화 할 수있는 팩터들에 대한 옵션 가격의 민감도를 측정할 수 있는 방법입니다.

여기서 사람들이 흔히들 착각을 합니다. 중요한 것은, Greeks는 가격을 결정하는 것이 아니라는 것입니다. Greeks는 단지 주가 변동, 내재 변동성, 시간 등에 대한 옵션가격 변동이 일어날 수 있는 것을 반영합니다. 즉, Greeks는 앞을 내다보는 용도이지, 가격 결정을 하는 것이 아니라는 것입니다. 이것은 아주 중요한 차이입니다.


 
옵션 가격은 크게는 두 개의 카테고리로 분류가 됩니다.
첫 번째는 Intrinsic Value(내재 가치), Time Value(시간 가치)입니다.


1.1. Intrinsic Value


내재 가치에 대해 먼저 알아보자면,
만약 당신이 50의 Strike Price(행사가격)를 가지고 있는 콜 옵션이 있고
현재 Spot Price(현물가격)가 55라면 당신은 옵션의 5의 내재 가치를 가지고 있는 것입니다.
왜냐하면 당신은 50에 산 뒤, 즉시 55에 팔 수 있기 때문이죠.
간단하게 행사가격과 현물가격의 차이라고 생각할 수 있습니다.


1.2. Time Value


두 번째로는 시간 가치입니다.
이것이 문제입니다. 사람들은 대부분 내재 가치는 쉽게 얻지만, 이 시간 가치가 기초 자산의 가격 변동과 더불어 옵션 가격 변동에 많은 관련이 있기 때문입니다.
내재 가치는 linear한 관계에 있다면 이 시간 가치는 약간 다릅니다.


1.2.1. Time to Maturity


먼저 Time to Maturity(기간)은 만기가 얼마나 남았는지 입니다.

만기가 긴 옵션은 더 고평가 됩니다. 왜냐하면 그 계약이 성사되기 까지 시간이 오래 걸리기 때문입니다.


1.2.2. Volatility


다음은 Volatility(변동성)입니다. 이것은 여기서 핵심 요소입니다.
변동성이 높다면 옵션 가격은 상승합니다. 콜, 풋 모든 쪽에서 상승하게 되는데, 기초자산의 변동성이 크면 클수록 기초자산의 가격이 행사가격을 넘어 In-the-Money상태로 갈 확률이 높아지게 됩니다. 하루에 0.1%씩 오르고 내리는 주식 보다는 상한가 하한가를 보이며 움직이는 주식이 더 높은 옵션프리미엄을 가진다는 이야기입니다.


1.2.3. Rate of Interest


마지막으로는 Rate of Interest(이자율)입니다.

이것은 rho입니다. 여기서는 rho에 대해서 자세하게 설명하지 않겠습니다. 이것은 Time to Maturity와 Volatility 같이 계약 만기가 더 길어질수록 이자율은 옵션 가치에 더 큰 영향을 미치게 됩니다. 60일 이내의 옵션의 경우에는 이것의 영향이 거의 존재하지 않습니다.
그렇기 때문에 main Greek으로 다루진 않겠지만 이러한 것이 있다는 것을 알아두면 좋게습니다.

이렇게 기본적인 옵션 가격결정에 대해 알아보았으며, 이제는 실제 Greek에 대해 알아 보도록 하겠습니다.




2. The Greeks


우리가 좀 전까지 다뤘던 Option Pricing을 Greeks으로 바꿔보면 그림과 같이 5가지의 Greeks이 있습니다. 기본적으로 4가지의 중요한 Greeks은 Delta, Gamma, Vega, Theta입니다. 그리고 Rho까지 총 5가지의 Greeks입니다. 여기서 Rho는 중요 요소가 아니지만 무시하지는 않을 것입니다.

2.1. Delta


델타(Delta) = 옵션가격변화 / 기초자산의 변화

델타는 기본적으로 내재 가치에 대한 관계를 보여주는 역할을 합니다. 기초 자산의 변화에 따른 옵션 가치의 변화로 표현합니다.
만약 콜옵션이 Deep OTM(깊은 외가격상태)에 있을 경우 콜옵션의 델타는 0에 가까울 것입니다. 만약 기초자산의 가격이 조금 오르더라도 콜옵션은 아직 OTM일 것이기 때문에 가격의 변화가 거의 없을 것이기 때문입니다.
그리고 콜옵션이 Deep ITM에 있는 경우 콜옵션의 델타는 거의 1에 가까울 것입니다.
기초 자산 가격변화와 거의 같은 비율로 콜옵션의 가격이 변하게 될 것이기 때문입니다.

2.2. Gamma


감마(Gamma) = 델타 가격변화 / 기초자산의 변화

감마는 맨 위 그림과 연결되진 않지만 델타와 관련이 있습니다. 감마는 기본적으로 변화율, 혹은 델타의 acceleration amount입니다.

2.3. Vega


Vega-Volatility. 
베가(Vega) = 옵션 가격변화 / 주가지수의 변화

외우기 쉽죠. 베가는 기초자산의 가격변동성의 변화에 따른 옵션가격의 변화 정도를 말합니다.
가격 변동성은 말씀 드렸다시피 시간가치를 결정하는 데에 가장 중요한 변수입니다. 변동성이 증가하면 시장의 불확실성이 높아져 시간가치가 증가하죠.
가격 변동성이 상승할 것을 예상한다면 등가격 옵션의 매수를 고려하고, 반대일 경우에는 매도를 고려합니다. 이는 등가격옵션의 베가가 가장 크기 때문입니다.

2.4. Theta


Theta-Time to Maturity.
세타(Theta) = 옵션 가격변화 / 시간의 변화

세타는 시간의 경과함에 따른 옵션가격의 변화 정도를 말합니다. 옵션은 만기일에 가까워질수록 시간가치가 줄어듭니다. 세타는 이러한 시간소멸효과를 측정한 것으로, 현재의 옵션시장가격과 익일의 이론가격과의 차이를 나타냅니다.
세타는 베가와 마찬가지로 등가격옵션일 때 가장 크고 내가격이나 외가격으로 갈수록 작아지게 됩니다.

2.5. Rho

Rho - Rate of Interest
로(Rho) = 옵션 가격변화 / 이자율의 변화

로는 이자율의 변화에 따른 옵션값의 변화를 뜻합니다. 일반적으로 콜옵션 매수자는 금리가 오르면 유리하고 반대로, 풋옵션 매수자는 금리가 내려가면 유리합니다.




앞서 1편에서 알아보았던 내용을 이어가도록 하겠습니다.
저도 정리하면서 추상적으로 알고있던 내용들을 확실히 알아가서 좋네요.


  • 일반 투자자들의 ELW 주문 등 통상의 전산 처리 과정
  • 스캘퍼가 ELW 시세차익을 확보하기 위한 필요 조건
  • 스캘퍼의 거래방법
  • 알고리즘 매매
  • 증권사의 전산 시스템
  • 일반투자자들의 오해
  • ELW VIP 시스템 구축이 위법한 행위에 해당하는지 여부
  • 결론


증권사의 전산 시스템


전산 시스템 구성 현황도는 위와 같다.

가) 일반 고객 단말과 연결된 주문 처리 시스템

(1) 알고리즘 매매 방식을 이용하지 않는 경우 (ⓓ)


주문 전송 경로 : 

고객이 자신의 컴퓨터에 설치되어 있는 HTS 등을 통하여 주문 지시를 하면 그 주문 정보는 공용망인 인터넷을 통하여 HTS, WTS 서버에 도달한다. 위 HTS, WTS 서버가 바로 공소사실에 기재된 BEP 서버에 해당한다. 접수된 주문 정보는 원장처리시스템이 설치되어 있는 주문 AP 서버로 전달되고, 그곳에서 원장처리절차를 거친 뒤 주문 FEP 서버로 전달된다. 주문 AP 서버에 설치되어 있는 시스템은 주문에 대해 기본적으로 64개 주문유효성 항목에 대한 확인절차를 거친다.
주문 FEP 서버는 거래소 전산 시스템과 증권사 전산 시스템을 연결시켜 주는 '주문 프로세스'가 직접 연결되어 있는 서버로, 고객의 주문을 거래소에 전송하는 마지막 관문에 해당한다.

시세 접수 경로:

먼저 한국거래소가 증권사로부터 접수한 주문 호가 정보와 스스로 체결시킨 매매에 대한 체결 정보를 모두 한국거래소의 자회사인 (주)코스콤으로 전달하면, 코스콤은 그 중 호가 잔량 정보는 '마스터 파일(Master File)'이라고 불리는 원장 파일에 모두 기록한 뒤 위 Master File에 기재되어 있는 정보를 금융상품 별로 분류하여 증권사에 전송하고, 매매 체결 정보는 그대로 증권사에 전송한다.

증권사는 위 정보들을 '시세 수신 스위치(switch)'를 통해 수신한다. 이 때 증권사가 수신한 호가 잔량 정보는 기계어와 각종 프로그래밍언어의 형태로 되어 있는 이른바 미가공 원데이터(raw data)이다. 따라서 증권사는 위 데이터를 고객 컴퓨터에 전송하기 전에 가공하는 절차를 거치는데, 그 과정에서 고객들의 수요에 맞게 시세 정보를 편집하기도 한다.

위와 같은 가공, 편집 절차는 일반적으로 증권사 전산 시스템 내의 '시세 FEP 서버'를 통해 이루어지고, 그 가공, 편집에 소요되는 시간은 평균적으로 0.001초 정도로 알려져 있다.

00증권의 경우 시세 정보가 '한국거래소 - 코스콤 - 00증권 시세수신 스위치 - 시세 FEP 서버 - HTS, WTS 서버 - 인터넷 공용망 - 고객의 컴퓨터 또는 모바일기기'이다.


위 사진은 미가공 데이터의 예시이다.

(2) 알고리즘 매매 방식을 이용하는 경우 (ⓒ)

주문 전송 경로:

알고리즘 매매 방식을 이용하는 경우는 API를 이용하여 개발하는 경우나 증권사에서 제공하는 알고리즘 매매 전용 서버에 고객이 원하는 방식으로 설계된 알고리즘 프로그램을 탑재하는 방식으로 나눠지는데, 전자는 앞서 말한 경우와 같고 여기선 후자에 대해서 설명하겠다. 00증권의 경우에는 'CATS(Computer Aided Trading System) 자동매매 시스템'이라는 전산 시스템을 설치하여 두고 있다. 전산 시스템 구성 현황도의 ⓒ에 해당한다. 
위 CATS 자동매매서버에는 일차적으로 00증권이 개발한 알고리즘 매매 프로그램이 탑재되어 있다. CATS 자동매매시스템을 이용하는 고객들의 주문은 CATS 자동매매서버에서 자체적으로 생성된다. 위 서버에 주문을 내도록 설계된 프로그램이 탑재되어 있기 떄문이다. 따라서 이 경우에는 BEP 서버를 통한 주문 접수 절차가 존재하지 아니한다.
CATS 자동매매서버에서 일단 발주된 주문은 HTS 등을 이용한 주문과 마찬가지로 주문AP 서버로 보내져서 일반적인 원장처리절차를 거쳐 주문 FEP를 통하여 거래소에 전송된다.

시세 접수 경로:

'한국거래소 - 코스콤 - 00증권 시세 수신 스위치 - 시세 FEP 서버 - CATS 자동매매 서버'이다.

나) 기간 FIX 단말과 연결된 주문 처리 시스템 (ⓑ)


주문 전송 경로:

기관 FIX 단말과 연결된 주문 처리 시스템은 개인투자자들을 대상으로 제공되는 시스템이 아니다. 대부분의 증권사들은 기관투자자나 외국인투자자들을 대상으로 그들의 수요에 맞게 설계된 별도의 주문 처리 시스템을 운용하고 있다. 이들의 수요가 개인투자자들과 큰 차이를 보이는 부분은 앞서 본 경쟁려 있는 '주문 집행 알고리즘'에 대한 요구, 대량의 주문을 지연 없이 처리하고 주문 정보를 증권사에 노출시키지 않기 위해 '일반 고객과 구분된 주문 처리 시스템'에 대한 요구, 그리고 기관투자자가 자신들의 대규모 금융자산운용을 위하여 직접 설계하고 운영하고 있는 그들의 전산 시스템과 가장 효율적으로 결합할 수 있는 '맞춤형 시스템'에 대한 요구 등이다.
이 경우 기관 투자자들이 FIX 단말기를 통해 직접 대량의 주문을 위탁하는 지시를 입력하면, 그 지시 내용은 FIX 자동매매서버로 전달된다. 어느 경우이든 FIX 자동매매서버자체에서 주문이 발주되므로 개별 주문에대한 별도의 접수 절차는 존재하지 아니한다.

나아가 FIX 자동매매시스템의 또 다른 특징은, 별도의 사후적인 원장처리절차가 존재하지 아니한다는 것이다. FIX 자동매매시스템은 앞서 본 바와 같이 기관투자자 등을 대상으로 한 시스템으로, 00증권의 경우 위 시스템을 이용하는 고객은 국내 자산운용사, 투자자문사, 외국 금융기관 등으로 구성된 66개의 법인 또는 개인이다. 그런데 이러한 고객들은 한국거래소 파생상품시장 업무규정 제133조에 의하여 사전위탁증거금이 면제되는 투자자들로 각 주문에 대하여 증거금이 충분한지 여부를 원장처리절차에 의하여 확인할 의무가 없다. 또 증권사들을 대체로, 증거금 이외의 주문유효성확인 항목과 관련하여서는 자신들의 주문집행 알고리즘 자체에서 그 유효성 항목에 맞추어 주문이 발주되도록 설계하여 두고 있다. 
결국 00증권에서 FIX 자동매매시스템을 이용하는 고객의 경우 주문 전송 경로는 'FIX 자동매매서버 - 주문 FEP 서버'이다. 그러므로 전산 시스템의 구성 현황도 중 가장 주문 전달 속도가 빠르다.

시세 접수 경로:

'한국거래소 - 코스콤 - 00증권 시세수신 스위치 - FIX 자동매매서버'이다.
시세 FEP 서버를 걸쳐서 시세정보를 가공, 편집하는 절차가 생략되므로 그만큼 시세정보를 받는 시간이 빨라지게 된다.

다) 대신 DMA 시스템 (ⓐ)


주문 전송 경로:

DMA 시스템은 투자자가 금융상품에 대한 자신의 주문을 거래소에 직접 제출하는 방식을 DMA라고 한다. 물리적으로 증권사 전산 시스템을 이용하지 않고 거래소에 주문이 전달되는 보증형 DMA(Sponsored DMA) 방식과 증권사 전산 시스템을 이용하여 거래소에 제출하는 전통적 DMA 방식으로 나뉜다. 원칙적으로 증권사 내부의 업무 처리 절차가 별도로 존재하지 않는다. 

다만 전통적 DMA 방식의 경우에는, 각국의 거래소에서 증권사에게 증권사 전산 시스템 상에 사전에 '일정한 통제장치'를 갖추어 둘 것을 요구하는 경우가 많다. 위와 같은 요구에 따라 증권사는 고객의 주문 중 일정한 요건을 갖추지 못한 주문들이 거래소로 그대로 전달되는 것을 막기 위한 사전적인 통제장치를 두고 있따. 위와 같은 사전적 통제장치의 예가 호가적정성 확인 장치, 리스크 관리 장치 등이다.

전통적 DMA 방식은 고객의 입장에서 증권사에 자신의 주문 정보를 노출시키지 않거나 또는 빠른 속도로 거래소에 자신의 주문을 전달하는 데에 초점을 두고 설계된 것으로, 증권사는 기관투자자 등 DMA 방식을 이용하는 특정고객들과 증권사를 전용회선으로 연결한다. 그 후 고객이 스스로 가지고 있는 수단에 의하여 자신의 주문지시를 그 전용회선을 통해 전송하면, 그 주문시지시는 증권사가 서례해둔 전산 시스템의 상의 일정한 경로를 따라 거래소에 그대로 전달된다.

다만 우리나라의 경우 자본시장법 제388조에서 거래소의 회원 즉 금융기관을 통하지 않고서는 한국거래소에서 거래를 할 수 없도록 규정하고 있으므로 보증형 DMA 방식의 주문은 허용되지 않는다.

위 시스템의 경우 DMA 방식의 주문 서비스를 이용하고자 하는 고객들의 주문 처리를 위하 전용서버인 DMA 서버 자체에 해당 고객들이 직접 개발한 알고리즘 프로그램을 DMA 서버에 탑재할 수 있도록 설계되어 있고, DMA 서버 자체에서 주문이 발주되어 DMA 원장 서버를 거친 뒤 주문 FEP 서버를 통하여 거래소에 주문이 전송되도록 설계되어 있다.

DMA 원장 서버는 기본적으로 주문 AP 서버와 마찬가지로 원장처리절차를 이행하기 위하여 설치된 서버이지만, 주문 AP 서버와 다른 2가지 특징이 있다. 

첫 번째는 주문 AP 서버와는 달리 디스크에 저장되어 있는 정보를 읽어서 주문과 비교하는 방식을 사용하지 않고, '메모리 방식'에 저장되어 이는 정보를 읽는 방식,, 즉 프로세서에 의하여 이미 활성화되어 있는 정보를 읽어서 주문과 비교하는 방식을 사용한다는 것이다.

둘째는 주문과 비교대상이 되는 정보의 양이 다르다. 주문 AP 서버의 디스크에는 모든 고객의 정보가 담겨있지만, DMA 원장 서버에는 DMA 서버를 통해 주문을 전달하기로 증권사와 사전에 약정이 되어있는 해당 고객들의 정보만이 메모리 방식으로 활성화 되어 있다.
이렇게 일반 고객들의 원장처리시스템 보다 간이화되어 있다는 의미에서, 위와 같은 원장처리절차를 '가원장 방식'이라고 부르기도 한다.

시세 접수 경로:

'한국거래소 - 코스콤 - 00증권 시세수신 스위치 - DMA 서버'이다.

라) LP와 ELW 서버의 주문 처리 시스템


(1) 대신 LP 시스템


주문 전송 경로:

위 주문 장치는 블랙숄즈 모델에 의하여 호가를 결정하고 그 호가에 따라 LP의 주문을 발주하는 알고리즘 프로그램이 탑재되어 있다.
LP의 주문은 위 알고리즘 프로그램에 의하여 자동으로 이루어지므로, 물리적으로는 위 ELW-LP에서 주문이 발주된다. 해당 주문은 주문 AP 서버로 전달되어 원장처리절차를 거친 뒤 주문 FEP 서버로 다시 전달된다. 이 경우 원장처리절차와 관련하여 한가지 특징은, 주문 AP 서버에 설치되어 있는 디스크에 저장된 DB를 이용하여 주문유효성 항목을 확인하지만, 총 32개 항목만을 확인하도록 설계되어 있다.

시세 접수 경로:

'ELW-LP' 서버에 탑재되어 있는 알고리즘 프로그램은 미가공 원데이터를 이용하도록 설계되어 있다. 따라서 이 경우 시세정보는 '코스콤으로부터 미가공 원데이터를 직접 수신하도록 설계되어 있다. 따라서 이 경우 시세 정보 접수 경로는
'한국 거래소 - 코스콤 - 00증권 시세수신 스위치 - ELW-LP 서버'이다.


(2) ELW VIP 시스템 (ⓔ) - 이 사건 스캘퍼들에게 제공된 시스템


주문 전송 경로:

위 시스템은 우선 고객이 개발한 알고리즘 매매 프로그램을 ELW 시스템 트레이딩 서버에 직접 탑재할 수 있도록 되어 있다. 따라서 고객이 주문 발주 기능을 갖춘 알고리즘 매매 프로그램을 위 서버에 탑재하면 위 서버 자체에서 주문이 발주가 이루어지게 된다. 
위 서버에 설치된 알고리즘 매매 프로그램에서 직접 발주된 주문은 VIP 주문 서버로 전달되어 원장처리절차를 거치게 된다. VIP 주문 서버는 주문  AP 서버와는 달리 디스크를 사용하지 않고 앞서 본 메모리 방식으로 주문 유효성 항목을 확인하고, 나아가 64가지가 아니라 ELW 거래에 필요한 19가지 항목만 확인하도록 되어 있다.
위와 같은 원장처리절차를 거치고 나면 해당 주문 정보는 주문 FEP 서버로 전달된다. 결국 이 사건 스캘퍼들에게 제공된 시스템에 의한 주문 전송 경로를 요약하면, 
'ELW 시스템 트레이딩 서버 - VIP 주문 서버 - 주문 FEP 서버'가 된다.

시세 접수 경로:

'한국거래소 - 코스콤 - 00증권 시세수신 스위치 - ELW 시스템 트레이딩 서버'이다.

마) 주문프로세스 배분


전산 시스템 구성 현황도에는 나타나 있지 않지만, 주문 FEP 서버로부터 거래소 전산시스템을 연결시켜 주는 전송선을 '주문프로세스'라고 부른다. 주문 프로세스는 거래소 회원관리규정의 요건을 충족하는 증권사들에게 거래소가 배정하도록 되어 있는데, 현재 증권사들은 증권사의 규모에 따라 최대 8개에서 최대 30개까지의 주문프로세스를 배정받아 사용하고 있다.


일반 투자자들의 오해


(1) 일반투자자들 사이에 퍼져 있는 오해의 내용

앞서 본 바와 같이 증권사로부터 속도 관련 서비스를 제공받은 스캘퍼들은 기본적으로 LP 또는 자신들과 마찬가지로 속도 관련 서비스를 제공받은 다른 스캘퍼들과 경쟁하는 관계에 있을 뿐이고, 위 스캘퍼들의 거래로 인하여 일반투자자들이 매매기회를 상실하는 비율은 사실상 무의미할 정도로 미미하다.

(2) 오해의 원인 - 간헐적으로 전송되는 ELW 호가 잔량 정보

LP는 기초자산 가격이 변동된 이후 0.028초 내지 0.036초 사이에 자신의 호가를 변경한다.
코스콤은 '호가 잔량 정보'와 '매매 체결 정보' 두 가지 정보를 각기 다른 방식으로 전송한다.
즉, 호가 잔량 정보는 간헐적으로 전송하는 반면 매매 체결 정보는 모든 정보를 누락 없이 실시간으로 전송한다. 따라서 같은 금융상품 종목에 대한 것이라고 하더라도 증권사가 수신하는 위 두 가지 정보는 일시적으로 차이가 나는 때가 많다. 그러나 증권사는 위 두 가지 정보 사이의 일시적인 불일치를 조정하여 일치시키는 작업을 하지는 아니한다. 

따라서 코스콤에서는 이들 종목의 호가 잔량 정보에 대하여는 소위 '마스터 루핑(Master Looping)'이라는 방식을 이용하여 정보를 전송한다. 
마스터 루핑 반식이란, 일단 모든 호가 잔량 정보를 마스터 파일(Master File)에 기재하여 종목별로 정리한 뒤, 별도의 호가전송 프로세스를 두고 호가전송 프로세스가 다시 위 마스터 파일에 있는 ELW 종목들을 순차로 읽으면서 그 직전에 읽었을 때와 비교하여 호가 잔량 정보가 변경된 종목이 있으면 그 종목만을 인지하여 그에 대한 호가 잔량 정보를 전송하도록 하는 방식이다. 즉 호가전송 프로세스를 통해서 전송하는 정보의 양을 통제하는 것이다.

여기서 중요한 것은 위 호가전송 프로세스의 초당 최대 호가전송 건수가 한정되어 있다는 것이다. 최대 호가전송 건수를 초과하는 나머지 초과 종목들에 대해서는 최초의 변동 시점으로부터 1초가 지난 이후부터 호가 잔량 정보의 전송이 시작되는 것이다. 이런 의미에서 마스터 루핑 방식을 '호가 잔량 정보를 간헐적으로 전송하는 방식'이라고 표헌하는 것이다.


ELW VIP 시스템 구축이 위법한 행위에 해당하는지 여부

문제가 되는 공문의 내용 3가지)

1. 스캘퍼들이 시장을 교란할 가능성이 있으므로 LP의 호가 제출기간을 늘려 위 가능성을 차단하되 LP 자체에 대한 규제 역시 강화하고,
2. 증권사가 스캘퍼들을 우대하는 행위에 대하여 대응하겠다.
3. 거래소 매매체결과 관련한 '시간우선원칙'의 훼손을 우려

3번에 해당하는 공문은 앞서 본 보증명 DMA 중 순수 DMA를 금지하고, 증권사 FEP 서버와 한국거래소 사이의 주문프로세스를 특정 위탁자에게 전용회선으로 배정하는 것을 금지하는 내용이다.

나머지 내용들은 생략하겠습니다. 정리하자면, 문제가 안 된다는 내용입니다.


결론

1. ELW는 동일한 내용의 옵션 상품에 비하여 높은 가격으로 최초에 판매되고(평균 24%이상 고가임.) 그 후로는 시간가치의 감소로 인하여 내가격의 ELW를 제외한 나머지 종목은 모두 만기가 가까워질수록 가격이 0원에 수렴하게 되는 '초고위험 상품'이다. 옵션 상품에 비하여 높은 가격 때문에 기관 투자자들과 외국인투자자들은 ELW 시장에 거의 참여하고 있지 않고, 소액 투자로 큰 이익을 노리는 개인투자자들이 대부분을 차지하고 있다.

2. ELW 시장은 '1(LP) 대 다수(주로 개인투자자들)'의 대향적 관계가 형성되어 있고, LP가 ELW 가격결정력을 행사할 뿐만 아니라 '장 초반 공급독점, 장 중 대량 호가 제출, 장 막판 수요돚ㄱ점'의 형태로 우월적인 지위를 누리고 있다. 이는 다수 대 다수의 대향적 관계가 형성되어 있는 일반 유가증권시장과는 매우 다른 특수한 구조이다. 그런데 내가격의 ELW를 제외한 나머지 ELW 종목의 가격이 만기가 가까워질수록 0원에 수렴하게 되므로, 현재 개인투자자들이 다수 활용하고 있는 '만기가 얼마 남지 않은 저가의 외가격 ELW에 대한 투자 방식'으로는 단기간 내의 기초자산의 가격이 개인투자자들이 원하는 방향으로 급격하게 변동하여 행사가격에 진입'하는 경우 매우 이례적인 경우를 제외하고는 대부분의 개인투자자들이 손실을 보게 된다.

3. 2009년 하반기부터 우리나라 ELW 시장에 등장하기 시작한 것으로 알려져 있는 스캘퍼들은, 딜러인 LP의 호가 제시 과정에 많게는 0.016초 정도의 'LP 지연 효과'가 발생한다는 점을 이용하여 그 틈새를 파고들어 대부분 LP를 상대로 매도, 매수함으로써 수익을 추구하는 투자자들이다. 일반투자자들의 거래 기회를 박탈하는 경우가 거의 없다고 판단되는 이유는
1) LP는 스스로 ELW 호가를 변경하지 않는 경우에는 투자자들을 유인하기 위하여 호가 물량을 지속적으로 재공급해주고,
2) 스스로 ELW 호가를 변경하는 경우에는 인간이 인식할 수 없을 정도의 빠른 속도로 호가를 변경하기 때문이다.

그럼에도 일부 일반투자자들이 스캘퍼가 자신의 거래 기회를 박탈한다고 오해하는 이유는, 한국거래소의 자회사인 코스콤이 증권사를 통해 투자자들에게 전송하는 시세 정보 중 'ELW 호가 잔량 정보'가 지연 전송되거나 누락되기 떄문이다. 코스콤은 마스터 루핑 방식으로 전송하는 'ELW 호가잔량 정보'의 초당 전송건수를 점진적으로 증가시키고 있으나, 코스콤과 시세 FEP 서버를 연결하는 회선 대역폭의 한계로 인하여 현재에도 여전히 평균적으로 1.3 내지 1.4초의 전송 지연이 일어나고 있다. 

4. 이 사건에서 00증권이 스캘퍼에게 제공한 속도 관련 서비스들의 5가지 구성 요소들을 대부분 증권사들이 주로 기관투자자들과 외국인투자자들을 대상으로 기존부터 제공해 온 DMA 서비스의 일부이다. 또 알 고리즘 매매 프로그램을 증권사 내부 서버에 탑재하는 서비스는 증권사가 알고리즘 매매를 원하는 일반투자자들에게 기존에 제공하여 온 서비스와 사실상 동일하다. 위 DMA 서비스 및 알고리즘 매매 서비스에 대하여는 현재까지 법률에서 이를 금지하는 규정을 두거나 금융 감독 기관에서 위 서비스 자체를 제공하지 않도록 규제한 적이 없다. 
나아가 금융위원회, 금융감독원, 한국거래소 등 금융 감독 기관은 현재까지 '주문 처리과정에서 속도의 차이가 없어야 한다.'는 원칙을 명확하게 선언하거나 그 실현가능한 방법과 기준을 제시한 바가 없다.




여기까지 고빈도 매매에 대한 판결문을 분석해보았습니다.
HFT 자료가 부족한 한국 시장에서 이렇게 상세한 정보를 얻기는 쉽지가 않은 것 같습니다.

고빈도 매매의 전체적인 흐름을 알기위해 HFT에 대한 자본시장과 금융투자업에 관한 법류위반 항목에 무죄가 판결된 사건을 분석해보도록 하겠습니다.

2011년 11월 28일에 판결선고가 이루어진 사건입니다.
168페이지에 해당하는 판결문이기 때문에 방대한 양의 분석을 해야 합니다.
판결문 전문을 읽고 싶은 분은 아래의 링크에서 다운받으시면 됩니다.

판결문

저는 이 판결문에서 아래의 항목들에 대해 중점적으로 다뤄보도록 하겠습니다.
앞 부분은 관련 지식에 대한 부분들이 많고 뒷 부분으로 갈수록 점점 시스템에 대한 부분들이 많이 나오니까 전부 알아보시는 것을 추천드립니다.
이번 편에서는 위의 4가지만 알아보도록 하겠습니다.


  • 일반 투자자들의 ELW 주문 등 통상의 전산 처리 과정
  • 스캘퍼가 ELW 시세차익을 확보하기 위한 필요 조건
  • 스캘퍼의 거래방법
  • 알고리즘 매매
  • 증권사의 전산 시스템
  • ELW VIP시스템의 각 구성요소들에 대한 개별적인 검토
  • 일반투자자들의 오해
  • ELW VIP 시스템 구축이 위법한 행위에 해당하는지 여부
  • 결론



일반 투자자들의 ELW 주문 등 통상의 전산 처리 과정

일반 투자자가 ELW를 매매 시, 통상의 경우, 증권회사 전산망 외부에서 일반 투자자 개인 PC의 HTS 프로그램을 이용하여 ELW 매매주문을 발송하는바, 그 매매 주문은 인터넷 통신망을 통하여 
1. 증권회사 내부 접속서버 (일명 BEP 서버)에 접속
2. 증권회사의 상품주문서버에서 원장확인절차(본인확인, 계좌유효성확인, 증거금 확인 등) 금융상품 매매 주문 처리가 이루어진 후
3. 거래소와 직접 연결된 증권회사 내부 대외계 서버(일명 FEP 서버)를 거쳐 매매 주문이 도달된다.

또한 일반 투자자가 특정 ELW 매매의사 결정을 위해 필수적인 정보인 해당 ELW 및 ELW 기초자산과 관련된 시세정보는 
거래소의 자회사인 KOSCOM - 증권회사 시세 FEP 서버 - 시세정보 편집이 이루어지는 증권회사 시세서버 - 증권회사 BEP 서버 - 일반 투자자 PC 의 순서로 전달된다.

스캘퍼가 ELW 시세차익을 확보하기 위한 필요 조건


ELW 시장에서는 스캘퍼가 매매차익을 얻기 위해서는 LP가 ELW 가격변동 요인을 ELW 가격에 반영시키 전에(즉, LP가 기존 매도호가를 취소하고 새로운 매매호가를 제시하기 전에) 기이 형성된 가격으로 매수한 다음 새로운 매매호가가 제시되면 이를 매도하여야 하고, 이를위해서는 LP가 ELW 호가를 변동시킬 것으로 예상되는 특정 ELW 종목에 대한 스캘퍼의 매매 주문이 일반 개미투자자나 다른 스캘퍼보다 빠르게 증권회사를 거쳐 거래소에 도달시켜 매매가 체결되도록 할 필요가 있다.

특히 ELW 시세차익 확보를 위해 컴퓨터 프로그램화된 초단타 매매 전략을 사용하는 스캘퍼의 입장에서는, 자신의 알고리즘 매매 프로그램이 탑재된 컴퓨터에서 이루어진 ELW 매매 주문이 인터넷 통신망을 통하여 증권회사에 전송될 경우에 나타날 수 있는 '매매 정보 등 DATA 전송 속도의 저하'를 방지하고 그 DATA 전송 속도를 가능한 빠르게 하여야 하며, 또한 1초당 수십 건 까지 계속하여 자동으로 발송될 수 있는 스캘퍼의 ELW 매매 주문이 증권회사 내에서 신속히 처리되도록 'ELW 주문 처리속도를 향상'시키는 것이 ELW 시세차익 확보의 필요조건이 된다.

이를 위해서,


(1) DATA 전송 소요시간을 단축시키기 위해, 스캘퍼 컴퓨터와 거래소 사이 전산망의 물리적 총 거리를 단축시키거나 스캘퍼 컴퓨터와 증권회사를 인터넷으로 연결하여 ELW 매매 DATA를 전송하는 경우 반드시 거치게 되는 중계 및 보안장치(라우터, 방화벽 등) 등을 거치지 않도록 하는 방법이 필요하고, 이를 위해서는 스캘퍼의 ELW 알고리즘 매매 프로그램이 탑재된 컴퓨터를 증권회사 내부 전산망에 직접 연결시키고, 

(2) 스캘퍼 전용 증권회사의 BEP · 상품주문처리 서버 · FEP 서버를 설치 및 전용하거나(스캘퍼 전용 증권회사 서버 이용) 

(3) 주문의 유효성 관리 항목을 스캘퍼 주문 ELW 주문에는 

1. 소수의 스캘퍼 정보로만 구성된 DB를 구축, 사용하여 스캘퍼 정보를 검색, 확인하는데 소요되는 시간을 단축시키고 
2. 주문의 유효성 관련 확인 항목 역시 일부를 생략시켜 처리 소요시간을 단축시키거나 (가원장확인) 

(4) 스캘퍼는 증권회사의 시세정보 편집 등의 절차가 생략된 채 시세 정보를 받아야 한다.(시세정보 우선제공)


스캘퍼의 ELW 거래기법

대부분의 LP가 호가를 결정하기 위한 이론가를 계산 할 때 블랙숄즈 모델을 사용한다는 사실은 증권사에는 널리 알려져 있다. 따라서 스캘퍼는 ELW가격에 대한 독립적인 가치평가를하지 않고 LP가 사용하는 블랙숄즈 모델을 이용하여 LP의 호가를 예측하게 된다. 예측방법은 다음과 같다.

블랙숄즈 모델에서 사용되는 6가지 요인 중 내재변동성을 제외한 5가지 요인은 LP와 관계없이 결정되어 있는 것이기 때문에 LP와 동일한 방식으로 ELW 이론가를 계산해내기 위해서는 내재변동성 항목만 알아내면 된다.
LP가 사용한 과거의 내재변동성 수치를 알아내는 일은 어렵지 않다. 당해 ELW 종목의 과거 특정 시점에서의 기초자산 가격과 LP의 매도 · 매수호가를 알면, 앞서 본 블랙숄즈 모델이라는 계산식을 사용하여 역산하는 수학적인 방법을 통해 그 특정 시점의 내재변동성 수치를 추정할 수 있기 떄문이다. 그런데 위 내재변동성 항목은 매분 매초 실시간으로 변경되는 것이 아니고 장 중 수차례 변경되는 것에 불과하다. 

스캘퍼들은 이러한 점에 착안하여, 과거의 기초자산 가격 및 LP의 호가변화와 관련된 충분한 데이터를 인식 · 수집하고 이를 기초로 내재변동성 수치를 추정한 뒤 기초자산 가격을 기초로 LP가 새롭게 제출할 호가를 예측하는 기능을 갖춘 전산 프로그램을 개발한다.

(1) 스캘퍼의 매수방법

스캘퍼는 위와 같이 개발한 전산 프로그램을 통하여 ELW의 매수시기를 포착하게 된다. 기초자산의 가격이 변동된 경우 중 그 변동의 결과로 인하여 LP가 호가를 변경할 것이라고 예측되는 순간, 구체적으로 LP가 호가를 높일 것이라고 예측되는 순간에 앞서 본 LP 지연효과를 이용하여 LP가 호가를 변경하기 직전, 즉 LP이 기존 호가물량이 취소되기 직전에 그 호가물량을 매수한다.


00증권이 LP로 활동하는 경우 약 0.028초 내지 0036초의 LP 지연효과가 발생했다. 그런데 00증권의 전산데이터 확인 결과, 이 사건 스캘퍼들의 주문은 발주에서 거래소 도달까지 소요되는 시간이 LP의 주문보다 0.008초 내지 0.0016초 전 빠른 것으로 나타났다. 그렇다면 스캘퍼들의 주문은 가장 빠를 때에는 기초자산 가격이 변동한 시점으로부터 0.020초가 지난 시점에 거래소에 도달하게 된다. 따라서 이 사건 스캘퍼들은 LP가 자신의 호가를 변경하기 전에 변경 전 매도 호가 물량에 대해서 매수주문을 체결시킬 수 있게 된다.

(2) 스캘퍼의 매도방법

스캘퍼가 위와 같이 ELW를 매수하게 되면 그 직후, 즉 0.008초 내지 0.016초 후에 LP가 호가를 높이게 된다. 그 후 스캘퍼가 확보한 ELW 물량을 매도하는 방법ㅇ로는 다음과 같은 두 가지 방법이 있다.

첫 번째는 스캘퍼가 최소한의 매매차익을 얻을 수 있을 정도로 LP가 ELW 호가를 높일 때까지 기다렸다가 그 정도로 호가가 오르면 바로 차익을 실현하는 방식이다.
이 경우에는 LP의 호가가 스캘퍼의 매수시점보다 2틱 이상 높아져야 한다.

두 번쨰는 LP의 호가가 몇 틱이 오르는지에 대하여는 아무런 관심을 두지 아니하고, 오직 기초자산 가격의 변동으로 인하여 LP가 호가를 하락시킬 것으로 예측되는 시점을 기다렸다가 LP 지연효과를 이용하여 LP가 기존 호가를 취소하기 직전에 매도하는 방식이다.

첫 번째 방식은 LP의 호가가 1틱 상승했다가 다시 하락하는 경우에 손실을 피할 수 없다는 단점이 있는 반면, 두 번째 방식은 1틱 올랐던 LP의 호가가 다시 원상태로 돌아가려고 하는 것으로 예측되는 때에는 그 직전에 ELW를 매도함으로써 수수료부담을 초과하는 매매차손을 회피할 수 있어 위와 같은 단점이 없다.

알고리즘 매매

알로기즘이란 과업을 수반하는 일련의 지시인데, 이렇나 지시 중 인간의 의사표시에 의하지 않고 컴퓨터 프로그램 등과 같이 자동화된 방법으로 이루어지는 지시에 따라 금융상품의 매매 기회를 인지하고 주문을 집행하는 매매유형을 알고리즘 매매라고 한다.

알고리즘 매매에 필요한 요소는 '알고리즘 프로그램', '위 프로그램을 탑재하는 전산 시설' 등이다.

알고리즘 매매는 그 유형을 다시 전략 알고리즘(strategy algorithm)과 주문집행 알고리즘(execution algorithm)으로 분류할 수 있다.

전략 알고리즘이란 매매기회를 인지하고 매수, 매도의 의사결정을 내리는 과정 자체를 자동화 한 매매유형으로, 알고리즘 프로그램으로 하여금 각종 분석지표, 즉 가격의 움직임, 거래량, 일중 시간대 등을 분석하여 매수 또는 매수 주문을 낼 것인지 여부를 자동으로 결정하도록 하는 매매유형이다.

이와 달리 주문집행 알고리즘은 주로 증권사가 기관투자자의 주문 내용을 위탁받아서 그 위탁취지대로 구체적인 주문을 거래소에 전달하는 과정에서 사용되는 알고리즘이다.
통상 기관투자자는 대량의 거래를 하기 때문에 증권사에 자신의 주문 내용을 위탁할 때 '종목, 목표수량, 목표가격' 등을 범위로 지정하는데, 그 지정된 범위 내에서 실제로 기관투자자에게 얼마나 유리하게 대량의 거래를 체결시킬 수 있는지 여부는 증권사가 구체적으로 주문수량을 어떻게 분할하여 어느 시점에 주문을 내느냐에 따라 달라질 수 있다. 이 부분과 관련하여 주문수량 분할 및 주문 시점 등에 의한 의사결정만을 자동화 한 매매유형을 주문집행알고리즘이라고 한다. 주문집행알고리즘 프로그램에 의하여 이루어지는 의사결정의 예로는 시간 분할 (time slice) 주문, 거래량 가중 평균 가격(volume weighted average price) 주문, 시간 가중 평균 가격(time weighted average price) 주문 등이 있다.

최근에 저는  한국 시장에 특화된 HFT 시스템을 만들고 싶어졌습니다.
HFT가 한국에서는 불가능하다는 의견이 상당히 지배적이지만 그래도 도전을 해보고 싶습니다.
관련 자료가 너무 적어서 자료 검색에 어려움을 겪게 되네요.
관심이 생겨서 알게 된 내용들을 정리할 겸 공유하도록 하겠습니다.


고빈도 매매(High Frequency Trading)를 위한 준비 사항

Requirements for High Frequency Trading


1. 회사 등록 (Registering your company)

첫 번째 단계는 회사 등록을 하는 과정이 필요합니다. 
트레이딩 회사를 기업, 파트너쉽, LLP(Limited Liability Partnership) 혹은 개인으로 등록 할 수 있습니다. 만약 투자자들과 헤지펀드를 등록하기 위해서는 규제에 대한 승인과 법률에 대한 조항들을 통과해야 합니다.

2. 트레이딩에 필요한 자본 (Capital required for Trading for Operations)

거래비용만 본다면, HFT에 필요한 자본은 대개 LFT(Low-Frequency Trading)에 필요한 자본보다 적습니다. 그러나 트레이딩 작업 수행에 필요한 자본은 일반적으로 매우 비용이 더 많이듭니다. HFT의 경우에는 인프라와 기술이 아주 중요하게 작용하기 때문입니다.


3. 트레이딩 패러다임 (Trading Paradigm)


트레이딩 패러다임, 쉽게 말하면 모델 혹은 철학이라고 생각 할 수 있겠습니다. 
어떤 패러다임을 적용할 것인지 결정해야 합니다. 가장 일반적인 트레이딩 철학은 알파를 찾는 것에 초점을 맞추는 것보단 전략에 의해 최적의 가격을 찾는 것입니다. 
HFT 트레이딩 전략은 극도로 빠른 속도로 주문을 체결해야 합니다.
주로 시장 조성(Market making), 스캘핑(Scalping), 차익거래(Arbitrage)를 포함합니다.




4. 시장 접근 (Access to Market)


한국과 해외의 시장은 형태가 사뭇 다릅니다. 해외의 경우 간접 시장접속은 대면 거래를 말하지만 한국에서는 HTS라고 할 수 있습니다. 증권사가 만든 전자거래 시스템을 통하여 시장에 접근하기 때문입니다. 하지만 DMA(Direct Market Access)는 트레이더가 만든 전자거래시스템을 통하여 시장에 접근할 수 있습니다. DMA용 시스템을 개발 할 때 증권사가 제공하는 서비스는 대략 3가지 입니다.

1. 저지연 시세서비스(시세스위치에서 시세를 직접 수신하는 서비스)
2. 특화주문고객을 위하여 빠른 속도의 미니원장과 FEP 서비스
3. 원장시스템과의 연결 서비스

현재 DMA를 제공하는 국내 증권사 목록입니다. (변동 가능성 있습니다.)
KR선물
케이프투자증권
동부증권
유진투자선물
삼성선물
NH선물
현대선물주식회사
대신증권
이베스트투자증권
삼성증권
메리츠종금증권
미래에셋대우
SK증권
유안타증권
신한금융투자
한국투자증권
교보증권
하나금융투자
NH투자증권
하이투자증권

HFT 전략은 수수료에도 아주 민감하다는 점도 유의해야 합니다.


5. 인프라 구축 (Infrastructure Requirements)


중점을 둬야 할 부분은 장소 배치, 하드웨어, 네트워크 장비, 네트워크 선입니다.

a) 장소 배치 (Colocation)


장소배치는 서버가 증권사 네트워크가 있는 곳과 같은 구역에 있어야 한 다는 것을 의미합니다.
주문이 체결되는 부분에서 상당히 큰 부분으로 작용됩니다.

b) 하드웨어 (Hardware)


많은 기업들은 알고리즘 트레이딩을 위한 서버를 만듭니다.
하드웨어를 커스터마이징해서 퍼포먼스를 증가시키는 것도 가능합니다.


c) 네트워크 장비(Network Equipment)


여기서는 주로 라우터(Routers), 모뎀(Modems), 스위치(Switches) 그리고 네트워크 인터페이스 컨트롤러 (NICs)와 FPGA를 포함합니다. 

라우터와 모뎀은 거래소와 호환이 되는지 버전을 확인해야 합니다. 

NICs는 컴퓨터가 네트워크에 연결되는 것을 돕는 이더넷 카드(Ethernet cards)입니다.

FGPA는 Field-Programmable Gate Array의 약자입니다. HDL(hardware description language)로 프로그래밍이 가능한 집적 회로입니다. 일반적인 프로세서는 메모리에 있는 프로그램을 불러와서 CPU에서 해독하여 작업을 실행하지만 FGPA는 아예 프로세서 내부 회로를 직접 변경해서 특정 작업에 맞춘 프로세서입니다.

d) 네트워크 선(Network Lines)


1. 트레이딩 리스 선(Trading Lease Line)

거래소로 보내는 주문에 쓰이는 선입니다. 주문을 적절히 보내기 위해서 선마다 다른 대역폭을 제공합니다.

2. 마켓 데이터 리스 선(Market Data Lease Line)

이 선은 마켓 데이터를 받는데에 쓰입니다. 마켓 데이터를 받는 방법에는 두 가지 방법이 있습니다.
아래와 같습니다.

-> Tick By Tick (TBT)
틱 데이터는 연속적인 틱들의 집합입니다. "틱"은 가장 최근에 일어난 주문에 대한 정보입니다.
크게 호가정보, 체결정보, 체결+호가정보로 구분됩니다.
호가정보는 각 호가(Order Book)의 가격, 잔량, 주문 건수 등의 정보를 포함합니다.
체결정보는 시장가 주문의 체결가격과, 체결수량, 그리고 누적 체결수량 등의 정보를 포함합니다.  



-> 스냅샷 데이터(Snapshot Data)
스냅샷 데이터는 거래소나 증권사의 저장되어있는 저장 장치에서 데이터를 받아오는 것입니다.
틱데이터와 달리 일정한 시간 간격을 두고 생성된다는 점이 특징입니다.

3. 거래소들과 연결 (Lines between Exchanges)

이것은 Smart Order Routing 이라고 불리는 SOR을 사용합니다. SOR은 여러 거래소에 주문을 낼 수 있도록 합니다. 하지만 이것은 거래소간 가격이 다른 해외 거래소를 사용하는 경우에 필요하다고 볼 수 있겠습니다.



6. 알고리즘 트레이딩 플랫폼(Algorithmic Trading Platform)

알고리즘 트레이딩 플랫폼은 주로 세가지로 나눠집니다.

a) 마켓 데이터 어댑터 (Market Data Adapter)

MDA는 거래소 데이터를 받고 트레이딩 시스템이 사용가능하도록 포맷을 변환합니다.

b) 복잡한 이벤트 처리 엔진 (Complex Events Processing Engine)

CEP는 주요 전략이 들어있는 시스템의 뇌 같은 역할을 합니다.

c) 오더 라우팅 시스템 (Order Routing System)

CEP가 변환한 포맷으로 정보를 ORS에 보냅니다. FIX는 거래소에서 가장 널리 쓰이는 포맷입니다.  FIX는 주식, 선물, 옵션, 채권 등 다양한 금융 상품들을 거래하기 위한 표준 프로토콜입니다.
금융 상품 거래의 참여자들간의 통신을 표준화 해주는 역할을 합니다.

7. 백테스팅 (Backtesting)

백테스팅은 과거의 정보를 토대로 시뮬레이션을 수행하여 퍼포먼스를 확인하는 것입니다.
대부분의 ATP(Arbitrage Trading Program)의 백테스팅 플랫폼은 백테스트 데이터 기간의 
수익&손실, 위험, 퍼포먼스 통계을 결과값으로 얻도록 사용합니다.
그 다음 전략을 "테스트 마켓"에서 사용하여 실제 시장에서 사용 할 때 기술적으로 결함이 없는지를 확인합니다.



8. 리스크 매니지먼트 (Risk Management)

리스크 매니지먼트는 일반적으로 시장 위험을 모니터링하는데에 중점을 둡니다.
그러나 HTF에서는 조작상의 위험이 더 위험합니다. 
기술, 네트워크, 데이터 입출력의 결함은 재앙이 될 수 있습니다.
그렇기 때문에 수 차례에 걸쳐 데이터나 다른 예외 사항을 잡아 내고 
뭔가 잘못 되었을 때 전략을 즉시 정지 할 수 있도록 만들어야 합니다. 
수 초간의 거래가 큰 손실로 이뤄지기 때문에 중요한 부분입니다.







이상 10가지의 준비사항들에 대해 알아보았습니다.
다음 시간에는 5번에 해당되는 인프라 구축에서 NIC와 제가 언급하진 않았지만
추가적으로 고려중인 RDMA와 TOE에 대해서 알아보도록 하겠습니다.
아무래도 속도의 싸움인 HFT이기 때문에 이런 부분에 대해서 알아두면 좋을 것 같습니다.