기본 콘텐츠로 건너뛰기

令和5年5月3日気になるニュース

yahooニュース 産経新聞、首相「腹を割って意見交換」 7、8日に訪韓し尹大統領と会談  岸田文雄首相は1日(日本時間2日)、7~8日の日程で韓国を訪問し、尹錫悦(ユン・ソンニョル)大統領と会談する方向で調整(ちょうせい)していると明らかにした。訪問先(ほうもんさき)のガーナで記者団の取材に答えた。首相は尹氏が3月に来日(らいにち)した際(さい)、首脳同士が相互(そうご)に訪問する「シャトル外交」の再開(さいかい)で合意(ごうい)しており、その第1弾(いちだん)となる。 続いて、日本政府は4月28日に韓国を輸出手続き簡略化などの優遇措置の対象国となる「グループA(旧ホワイト国)」に再指定(さいしてい)する方針を発表したが、首相の訪韓(ほうかん)で成果(せいか)を示(しめ)せるかが焦点(しょうてん)になると書いていました。 日韓関係が改善されているようでうれしい記事でした。

AFML Chapter 3. Bollinger Band, Rolling Volatility

 이벤트 기반의 표본 추출

포트폴리오 매니저는 시장 구조적 변화, 추출된 신호 혹은 미시 구조적 현상 등 어떤 사건이 발생한 후에 사후 판단하여 베팅을 한다. 이러한 이벤트들은 대개 변동성 확대, 스프레드의 이탈, 거시경제지표 등과 연계되어 있을 수 있다.
프라도 교수는 이벤트를 중대한 것으로 특징지을 수 있고, 머신러닝을 활용해 이벤트가 발생한 부분을 Labeling하여 학습시키면 충분히 예측할 수 있는 학습기를 만들수 있다고 한다. (후에 기술하겠지만, Meta Labeling 기법의 가장 중요한 아이디어라고 할 수 있다)

Cumulative Sum filter는 품질 통제 기법으로서 측정값이 목표값의 평균으로부터 얼마나 벗어났는지 확인하는 필터이다. 즉, 시장흐름의 기대값을 벗어나면 이벤트가 발생되었다고 보는 것이다. 물론, 여기서 기대값을 정하는 것은 사용자의 영역이므로 Hyper Parameter라고 볼 수 있다.

CUSUM Filter

Locally stationary process에서 발생한 관측값을 생각해 보자. 누적 합계는 다음과 같이 정의한다.

$$ S_t = \max \{0, S_{t-1} + y_t - E_{t-1}[y_t]\}$$

여기서 경계 조건은 $ S_0 = 0 $이다. 이 절차는 특정 임계값에 대해 $ S_t \leq h $를 만족하는 첫 번째 시간 $t$에서의 행동을 추천할 것이다.$y_t \geq E_{t-1}[y_t] - S_{t-1}$일 때마다 $S_t=0$이다.
0 floor는 $S_t$가 음수가 되지 못하도록 하방 편차를 무시할 것을 의미한다. 그 이유는 필터가 모든 재설정 레벨 0으로부터 위로 발산하는 시퀀스를 식별하도록 설정됐기 때문이다.
특히 임계값은 다음의 경우에 활성화된다

$$ S_t \leq h \Leftrightarrow \exists \tau \in [1,t] \Big| \sum_{i=\tau} ^t (y_i - E_{I-1} [y_t]) \leq h$$

이러한 개념은 upper bound와 lower bound 모두 적용이 가능하다. 이는 대칭 $\mathbf{CUSUM}$ 필터를 형성한다.

\begin{align}S_t^+ = \max\{0, S^+_{t-1} + y_t - E_{t-1}[y_t]& \}, ~~~ S_0 ^ + = 0\\ S_t^- = \min\{0, S^-_{t-1} + y_t - E_{t-1}[y_t]& \}, ~~~ S_0 ^ - = 0\\     S_t = \max\{S_t^+, S_t^-\} \end{align}

$S_t \leq h$일 때만 바를 표본 추출한다. Financial Machine Learning Library에서는 다음과 같이 간편하게 사용이 가능하다. 아래의 결과는 KOSPI 200 선물 2020년 가격 데이터의 표본 추출된 결과이다.

import FinancialMachineLearning as fml
event = fml.cumsum_events(dollar['price'], limit = 6)
cusum_event = dollar.iloc[event,:]
dollar['cumsum filter'] = np.nan
dollar.iloc[event, -1] = 1



Rolling Volatility

VaR (Value at Risk) 혹은 많은 경우에서 변동성의 추정은 긴 기간동안의 risk를 이용해 추정한다. 그러나 이러한 방식의 위험 추정은 한편으로는 과소 추정을 하거나, 어떨 때에는 과대 추정의 문제를 야기할 수 있다. 때문에, Bollinger Band 구축을 위한 Volatility를 아래와 같은 방법으로 일별 평균 변동성으로 구하면 현재 수준의 적절한 위험 구간을 설정할 수 있다.

import FinancialMachineLearning as fml
close = dbars.price.copy()
dailyVol = fml.getDailyVolatility(close)


Triple Barrier Method

Prado(2018)는 2개의 Horizontal Barrier, 1개의 Vertical Barrier를 이용해 가장 먼저 도달한 Barrier를 이용하여 Labeling하는 방법을 고안하였다. 두 개의 Horizontal Barrier는 각각 손실 한도와 이익 실현 한도이며, Vertical Barrier는 포지션의 보유 기간을 의미한다. 상단 수평 베리어에 도달하면 1로, 하단 수평 베리어에 도달하면 -1로 Labeling하며, Vertical Barrier에 먼저 도달한 경우 포지션 보유 기간 내에서 수익의 달성 여부를 통해 1과 -1중 하나로 Labeling 하면 되거나, 0으로 Labeling을 한다. (저자는 전자의 경우를 선호한다고 한다)
Financial Machine Learning Library에서는 다음과 같이 간편하게 Triple Barrier 구축이 가능하다

import FinancialMachineLearning as fml
minRet = .001
ptSl = [1,2]
ma_events = fml.triple_barrier(close, tEvents, ptSl, target, minRet, cpus, t1 = t1, side = side)

Bollinger Band

Triple Barrier Method를 통해서 아래와 같이 매도 매수 Signal을 구축할 수 있다. 
days=5로 지정한 그래프이지만, 기간을 줄이고 signal이 많아질 경우 더 빈번하게 표본 추출된다. 그 신호가 True Positive인지 False Positive인지 다시한번 확인하는 과정이 필요한데, 이는 차후 Machine Learning을 통해 판단하는 것으로 한다.

댓글

이 블로그의 인기 게시물

Random Forest 파헤치기

Random Forest Random Forest Random Forest는 weak Learner로 Decision Tree를 이용하는 일종의 bagging Algorithm이다. (배깅 학습기라는 뜻은 아니다) Machine Learning 분야에서 Support Vector Machine과 같이 가장 많이 사용하는 분류모형 중 하나이다. Random Forest Class는 다음 특징을 가진다. Keyword Argument의 대부분은 DecisionTreeClassifier와 같다. Random Forest에서 Tree의 수가 많아질수록 예측에 유리하지만 시간이 많이 걸리고, 한계적인 이득은 체감한다. Random Forest의 Base Model로는 보통 Deep Tree를 많이 사용한다. Shallow tree는 상대적으로 분산이 작지만 상당한 편의를 발생시킨다. 반면 Deep Tree는 분산이 큰 반면 편의가 작으므로 여러 결과의 평균을 예측에 사용하면 분산을 줄이는 효과가 있다. Random Features Random Forest는 훈련 과정에서 무작위로 추출한 Feature Set만을 사용한다. 이는 모형들 사이의 Correlation을 감소시킨다 Missing Value와 관련된 문제를 효과적으로 완화시킨다. 오늘은 Random Forest와 Decision Tree의 기본 구조를 알고 있다고 가정하고 Keyword Argument 중 중요한 것들을 중심으로 소개하고자 한다. class_weight {class_label:weight} 형식의 클래스와 연결된 가중치이다. 만약 주어지지 않는다면, 모든 Class는 하나의 가중치로 되어 있다. 다중 출력 문제의 경우 dict 목록을 y 열과 같은 순서로 제공할 수 있다. 다중 출력(다중 레이블 포함)의 경우 자체 dict의 모든 열의 각 클래스에 대해 가중치를 정의해야 한다. 예를 들어 4개 클래스의 다중 레이블 분류 가중치는 [{1:1}, {2:5}, {3:1}, {4:1} 대신 [{0:1,

Team Q Research

  Q research Naver blog Qraft에 계신 선배님과 서강대학교 학부생이 함께 만든 퀀트 리서치 팀입니다. 주로 Machine Learning과 Quantitative Finance 분야를 다루며, 최근 연구 분야는 ML분류기에서 나온 Accuracy를 확률로써 해석하기 위해 Probability Calibration을 통해 보정하고, Bet size를 정하는 Secondary Model로써 활용하는 것을 연구중입니다. 이외에도 Machine Learning 분류기와 Neural Network를 사용하여 투자 집행에 도움이 되는 실전 전략 연구를 수행하고 있습니다.

Portfolio Analysis, Mean Variance Frontier

  포트폴리오 이론에서의 기대수익률     포트폴리오 기대수익률은 개별 자산의 기대수익률의 가중치를 고려하여 만든 포트폴리오의 기대수익률이다 mean - variance space     자산 투자에 있어서 기대수익률을 위해서는 투자의 리스크를 감수해야 한다. 즉, 위험 한 단위가 증가할 때 기대수익률 또한 증가한다. Indifference Curve     Risk Averse의 성향이 많은 개인 투자자는 위험에 대해 기피하는 경향이 있다. 따라서, 위험 한 단위가 증가할 때마다 기대수익률을 더 많이 받으려고 하는 경향을 보인다. 따라서 무차별 곡선은 우상향하며, 기울기는 체증한다. 반면, Risk lover의 Indifference Cuve의 기울기는 체감한다. Portfolio Risk     포트폴리오의 리스크는 각 자산의 기대수익률간의 편차로 계산한다.  Example     2000년 1월부터 2020년 12월까지 기간동안 고려한 자산은 다음과 같다 스페인 국채 10년물  KOSPI 주가지수 S&P 주가지수 원유 선물 천연가스 선물 금 선물 구리 선물 import numpy as np import pandas as pd import matplotlib.pyplot as plt % matplotlib inline csv data의 변수명은 다음과 같이 정의한다 data : 수익률 데이터 cycle : 경기순환 사이클 데이터  import한 데이터는 다음과 같이 세가지 형식으로 분류한다 df = pd . concat ([ data . iloc [:, 1 :], cycle . iloc [:, 1 :]], axis = 1 ) # 전체 데이터 df_up = df [ df . cycle == 1 ] # 경기 확장기의 데이터 df_down = df [ df . cycle == 0 ] # 경기 후퇴기의 데이터 noa = len ( df . columns [: - 1 ]) # 포트폴리오 구성자산의 갯수