QuantStart.
빠르게 성장하는 소매점 퀀텀 트레이더 커뮤니티를 지원하는 Quantcademy 개인 회원 포털에 가입하십시오. 당신은 당신의 가장 중요한 퀀트 트레이딩 질문에 대답 할 준비가되어있는 지식이 풍부하고 마음이 맞는 퀀트 트레이더 그룹을 찾을 수 있습니다.
퀀트 트레이딩에 관한 나의 eBook을 확인해보십시오. 여기서 저는 파이썬 툴로 수익성 높은 체계적인 트레이딩 전략을 만드는 법을 가르쳐드립니다.
Python 및 R을 사용하여 시계열 분석, 기계 학습 및 베이지안 통계를 사용하는 고급 거래 전략에 관한 새로운 전자 책을 살펴보십시오.
2016 년 8 월 15 일 Michael Halls-Moore 작성
일반적인 퀀트 트레이딩 기법은 공적분 관계를 형성하고 평균 회귀 접근법을 활용하여 트레이딩 전략을 수립하는 두 가지 자산을 취하는 것을 포함합니다. 이는 두 자산 (ETF 쌍과 같은)간에 선형 회귀 분석을 수행하고이를 사용하여 각 자산의 얼마나 많은 부분을 특정 임계 값에서 길고 짧은지를 결정함으로써 수행 할 수 있습니다.
이러한 전략의 주요 관심사 중 하나는 두 자산 간의 헤징 비율과 같은 이러한 구조적 관계를 통해 도입 된 모든 매개 변수가 시간에 따라 변할 수 있다는 것입니다. 즉, 전략 기간 동안 고정되지 않습니다. 수익성을 높이기 위해 시간이 지남에 따라 헤징 비율을 조정하는 메커니즘을 결정할 수 있다면 유용 할 것입니다.
이 문제에 대한 한 가지 접근법은 룩백 (lookback) 윈도우가있는 롤링 선형 회귀를 이용하는 것입니다. 이것은 기울기와 절편이 공적분 관계의 최신 행태를 "따르도록"모든 막대의 선형 회귀를 업데이트하는 것을 포함한다. 그러나 전략에 또 다른 무료 매개 변수, 즉 전환 확인 기간이 도입됩니다. 이는 교차 검증을 통해 최적화되어야합니다.
보다 정교한 접근법은 "진정한"헤지 비율을 관찰되지 않은 숨겨진 변수로 취급하고 "시끄러운"관측으로 그것을 추정하려고하는 상태 공간 모델을 이용하는 것입니다. 여기서는 각 자산의 가격 데이터를 의미합니다.
칼만 필터는이 작업을 정확하게 수행합니다. 이전 기사에서 우리는 칼만 필터 (Kalman Filter)에 대해 심도있게 살펴 보았고 베이지안 업데이트 프로세스로 어떻게 보일 수 있는지 살펴 보았습니다.
이 기사에서는 Pykalman Python 라이브러리를 통해 Kalman Filter를 사용하여 ETF 쌍 사이의 기울기와 요격 비율 (따라서 헤징 비율)을 동적으로 추정하는 데 도움을줍니다.
이 기술은 궁극적으로 새로운 QSTrader 오픈 소스 거래 시스템으로 다시 시험 될 것이며, 이는 지난 몇 년 동안 그러한 전략의 성과가 어떻게 변화했는지를 알 수있게 해줄 것입니다.
이 게시물의 내용은 Algo Engineer 블로그를 운영하는 Aidan O'Mahoney가 작성한 게시물에서 크게 영향을 받았으며 확장되었습니다.
칼만 필터의 간략한 요약본.
칼만 필터에 대한 더 자세한 수학적 기사를 읽으려면 이전 기사를 읽어보십시오. 여기에서 요점을 간단히 요약 해 보겠습니다.
우리가 사용할 상태 공간 모델은 두 개의 행렬 방정식으로 구성됩니다. 첫 번째는 상태 또는 전이 방정식으로 알려져 있으며 상태 변수 집합 $ \ theta_t $이 한 기간에서 다음 기간으로 어떻게 변경되는지 설명합니다. 전이 행렬 $ G_t $와 정규 분포 시스템 잡음 $ w_t $에 의해 주어진 이전 상태에 대한 선형 의존성이있다. $ G = G_t $는 일반적인 의미에서 전환 행렬 자체가 시간에 따라 달라짐을 의미합니다.
\ begin \ theta_t = G_t \ theta_ + w_t \ end.
그러나 이러한 상태는 종종 관찰 할 수 없으며 우리는 $ y_t $로 주어진 시간 인덱스마다 관측에 액세스 할 수 있습니다. 관측치에는 또한 관측 행렬 $ F_t $를 통한 선형 성분과 정상적으로 분포 된 측정 잡음이 포함 된 관측식이 $ v_t $로 주어집니다.
\ begin y_t = F_t \ theta_t + v_t \ end.
상태 공간 모델과 칼만 필터에 대한 자세한 내용은 이전 기사를 참조하십시오.
칼만 필터에 선형 회귀를 포함.
이 단계에서 가장 중요한 질문은이 상태 공간 모델을 활용하여 정보를 선형 회귀 분석에 통합하는 방법입니다.
선형 회귀 분석을위한 MLE의 이전 기사에서 다차원 선형 회귀 분석을 통해 응답 값 $ y $는 피쳐 입력 $ $의 선형 함수라는 것을 알 수 있습니다.
여기서 $ \ beta ^ T = (\ beta_0, \ beta_1, \ ldots, \ beta_p) $는 절편 $ \ beta_0 $와 기울임 $ \ beta_i $의 전치 벡터를 나타내며 $ \ ε \ sim \ mathcal (\ mu) , \ sigma ^ 2) $는 오류 기간을 나타냅니다.
우리가 1 차원적인 환경에 있기 때문에 $ \ beta ^ T = (\ beta_0, \ beta_1) $ 및 $ = \ begin 1 \\ x \ end $로 간단히 쓸 수 있습니다.
우리는 우리 시스템의 (숨겨진) 상태를 벡터 $ \ beta ^ T $에 의해 주어 지도록 설정합니다. 이것은 우리의 선형 회귀의 절편과 기울기입니다. 다음 단계는 내일의 요격과 기울기가 오늘날의 요격과 기울기가 임의의 시스템 잡음을 추가한다고 가정하는 것입니다. 이것은 랜덤 워크 (random walk)의 특성을 제공하며, 그 동작은 화이트 노이즈 및 랜덤 워크에 대한 이전 기사에서 자세히 논의됩니다.
변환 행렬이 2 차원 indentify 행렬 인 경우 $ G_t = $. 이것은 상태 공간 모델의 절반입니다. 다음 단계는 실제로 한 쌍의 ETF 중 하나를 "관측"으로 사용하는 것입니다.
칼만 필터를 ETF 쌍에 적용.
관찰 방정식을 형성하려면 ETF 가격 결정 시리즈 중 하나를 "관찰 된"변수, $ y_t $로 선택하고 $ x_t $로 주어지는 다른 하나는 위와 같이 선형 회귀 공식을 제공해야합니다.
\ begin y_t & = & F_t _t + v_t \\ & = & (\ beta_0, \ beta_1) \ begin 1 \\ x_t \ end + v_t \ end.
따라서 선형 공간 회귀 모형을 상태 공간 모델로 재구성하여 칼만 필터 (Kalman Filter)를 통해 새로운 가격 포인트가 도착할 때 절편과 기울기를 추정 할 수 있습니다.
TLT 및 ETF.
우리는 2 개의 고정 수입 ETF, 즉 iShares 20+ Treasury Bond ETF (TLT)와 IShares 3-7 년 Treasury Bond ETF (IEI)를 고려할 것입니다. 이 두 ETF는 모두 미국 재무부 채권의 변동성을 추적하므로 유사한 시장 요인에 노출되어 있습니다. 우리는 지난 5 년 정도의 회귀 분석을 분석 할 것입니다.
ETF 가격 산포도.
이제 numpy, matplotlib, pandas 및 pykalman을 비롯한 다양한 Python 라이브러리를 사용하여이 두 증권 간의 동적 선형 회귀의 동작을 분석 할 것입니다. 모든 파이썬 프로그램에서와 마찬가지로 첫 번째 작업은 필요한 라이브러리를 가져 오는 것입니다.
참고 : PyKalman 라이브러리를 설치하려면 pip install pykalman을 실행해야합니다.
다음 단계는 draw_date_coloured_scatterplot 함수를 작성하여 자산 조정 마감 가격 (산산조각은 Aidan O'Mahony가 생산 한 것)에 대한 산점도를 작성하는 것입니다. 산점도는 matplotlib 컬러 맵, 특히 "Yellow to Red"를 사용하여 색상이 지정됩니다. 여기서 노란색은 가격 쌍을 2010 년에, 빨간색은 2016에 가까운 가격 쌍을 나타냅니다.
나는 코드를 주석 처리 했으므로 모든 명령이 무엇을하는지보기가 쉽다. 주요 작업은 colour_map, colors 및 scatterplot 변수 내에서 수행됩니다. 다음 플롯을 생성합니다.
고정 수입 ETF의 산란, TFT 대 IEI.
시간 변화하는 경사와 절편.
다음 단계는 실제로 pykalman을 사용하여 TFT와 IEI 사이의 절편과 기울기를 동적으로 조정하는 것입니다. 이 기능은 더 복잡하며 설명이 필요합니다.
먼저 델타라는 변수를 정의합니다. 이 변수는 시스템 잡음에 대한 전이 공분산을 제어하는 데 사용됩니다. Kalman Filter에 대한 원래 기사에서 $ W_t $로 표시했습니다. 우리는 단순히 이러한 값에 2 차원 항등 행렬을 곱합니다.
다음 단계는 관측 행렬을 만드는 것입니다. 이전에이 행렬을 설명했듯이이 행렬은 TFT의 가격과 단일 값의 시퀀스로 구성된 행 벡터입니다. 이것을 구성하기 위해 numpy vstack 메소드를 사용하여이 두 가격 시리즈를 수직 열을 하나의 열 벡터로 수직으로 쌓은 다음 변환합니다.
이제는 pykalman의 KalmanFilter 클래스를 사용하여 Kalman Filter 인스턴스를 만듭니다. 우리는 관측의 차원 (이 경우 단일성), 상태의 차원 (이 경우 선형 회귀에서 절편과 기울기를 볼 때이 두 개)을 공급합니다.
우리는 또한 초기 상태의 평균과 공분산을 제공해야합니다. 이 경우 우리는 초기 상태 공분산에 대해 2 차원 항등 행렬을 취하는 동안 초기 상태 평균을 절편과 기울기 모두에 대해 0으로 설정합니다. 전이 행렬은 또한 2 차원 항등 행렬에 의해 주어진다.
지정해야 할 마지막 용어는 obs_mat에서 위와 같이 관측 행렬이며 공분산은 1과 같습니다. 마지막으로 전이 공분산 행렬 (델타에 의해 제어 됨)은 위에서 설명한 trans_cov에 의해 주어집니다.
kf Kalman Filter 인스턴스가 생겼으므로 IEI에서 조정 된 가격을 기준으로 필터링 할 수 있습니다. 이것은 우리에게 우리가 겪고있는 절벽과 사면의 국가 수단을 제공합니다. 또한 우리는 국가의 공분산을받습니다.
이것은 모두 calc_slope_intercept_kalman 함수에 래핑됩니다.
마지막으로이 값을 이전 함수에서 반환 된 값으로 그립니다. 이를 달성하기 위해 가격 DataFrame의 인덱스를 사용하여 시간 값 $ t $에서 슬로프의 팬더 DataFrame을 작성하고 가로 채기 만하고 각 열을 서브 그림으로 그립니다.
출력은 다음과 같이 표시됩니다.
ETF TFT와 IEI 간의 선형 회귀의 시변 기울기와 절편.
2011 년의 1.38에서 2016 년의 0.9까지 떨어지는 2011 년에서 2016 년까지 시차가 급격히 변하는 것은 분명합니다. 페어 트레이딩 전략에서 고정 된 헤지 비율을 이용하는 것은 너무 엄격 할 것입니다.
또한 경사의 추정은 비교적 시끄 럽습니다. 위의 코드에서 제공 한 델타 변수로 제어 할 수 있지만 두 ETF 간의 "실제"관찰되지 않은 헤지 비율의 변화에 대한 필터의 응답 성도 감소시키는 효과가 있습니다.
우리가 거래 전략을 개발하게되면 상호 유효성 확인을 다시 사용하여 ETF 쌍의 바구니를 통해이 매개 변수 델타를 최적화해야합니다.
다음 단계.
이제 두 ETF 간의 동적 헤징 비율을 구성 할 수 있었으므로이 정보를 바탕으로 실제로 거래 전략을 수행 할 방법이 필요합니다. 시리즈의 다음 기사에서는 QSTrader를 사용하여 다양한 쌍에 대해 백 테스트를 수행하여 매개 변수와 기간이 다양 할 때 성능이 어떻게 변하는 지 확인합니다.
서지 정보.
"온라인 선형 회귀 분석 (linear linear regression)"을위한 칼만 필터 (Kalman Filter) 활용은 많은 양의 거래자들에 의해 수행되었습니다. Ernie Chan은 EWA와 EWC의 두 가지 ETF 사이의 동적 선형 회귀 계수를 추정하기 위해이 책의 기술 [1]을 활용합니다.
Aidan O'Mahony는 matplotlib과 pykalman을 사용하여이 글의 다이어그램에서 영감을 얻은 회귀 계수를 추정했습니다 (2).
조나단 킨 레이 (Jonathan Kinlay)는 칼만 필터를 시뮬레이션 된 금융 데이터에 적용하는 것에 대해 논의하고 있으며, 잡음이 많은 기간에 생성 된 거래 신호를 억제하거나 잡음이 적은 쌍으로 할당을 늘리는 것이 KF를 사용하는 것이 좋습니다.
R 프로그래밍 언어를 사용하는 칼만 필터에 대한 소개 토론은 Cowpertwait 및 Metcalfe [4]에서 볼 수 있습니다.
참조.
양적 거래 시작하기?
QuantStart 목록을 구독해야하는 3 가지 이유 :
1. 퀀트 트레이딩 레슨.
계량 거래를 시작하는 데 도움이되는 힌트와 팁으로 가득한 무료 10 일간 코스에 즉시 액세스 할 수 있습니다!
2. 모든 최신 내용.
매주 나는 퀀트 스타트에서 모든 활동의 포장을 보내드릴 것입니다. 그래서 당신은 결코 다시 글을 놓치지 않을 것입니다.
현실감 넘치는 퀀 트레이딩 팁.
QuantStart.
빠르게 성장하는 소매점 퀀텀 트레이더 커뮤니티를 지원하는 Quantcademy 개인 회원 포털에 가입하십시오. 당신은 당신의 가장 중요한 퀀트 트레이딩 질문에 대답 할 준비가되어있는 지식이 풍부하고 마음이 맞는 퀀트 트레이더 그룹을 찾을 수 있습니다.
퀀트 트레이딩에 관한 나의 eBook을 확인해보십시오. 여기서 저는 파이썬 툴로 수익성 높은 체계적인 트레이딩 전략을 만드는 법을 가르쳐드립니다.
Python 및 R을 사용하여 시계열 분석, 기계 학습 및 베이지안 통계를 사용하는 고급 거래 전략에 관한 새로운 전자 책을 살펴보십시오.
2016 년 9 월 21 일 Michael Halls-Moore
QuantStart 이전에는 State Space Models 및 Kalman Filters의 수학적 토대와 Pykalman 라이브러리를 ETF 쌍에 적용하여 헤지 비율을 평균 반전 거래 전략의 기초로 동적으로 조정했습니다.
이 기사에서는 Ernest Chan (2012) [1]에 의한 거래 전략에 대해 논의하고 Quantopian [2]에서 Aidan O'Mahony가 테스트했습니다. 우리는 전략을 구현하기 위해 파이썬 기반 오픈 소스 QSTrader 백 테스팅 프레임 워크를 사용할 것이다. Qstrader는 거래 추적 신호를 생성하는 코드에만 집중하면서 위치 추적, 포트폴리오 처리 및 데이터 처리의 "과도한 수행"을 수행합니다.
무역 전략.
페어 트레이딩 전략은 다양한 기간의 미국 재무부 채권의 실적을 추적하는 두 개의 ETF (Exchange Traded Funds)에 적용됩니다. 그들은:
목표는이 ETF 쌍에서 평균 회귀 전략을 수립하는 것입니다.
TLT와 IEI 사이의 합성 된 "확산"은 우리가 실제로 갈망이나 단락에 관심을 갖는 시계열입니다. 칼만 필터는 스프레드를 고정 된 상태로 유지하기 위해 둘 사이의 헤징 비율을 동적으로 추적하는 데 사용됩니다 (따라서 평균 되돌림).
거래 규칙을 만들려면 스프레드가 예상 값에서 너무 멀리 이동 한 시점을 결정해야합니다. 우리는 "너무 멀리"무엇인지 어떻게 결정합니까? 우리는 일련의 고정 된 절대 값을 사용할 수 있지만, 이것은 경험적으로 결정되어야합니다. 이는 최적화가 필요하고 시스템을 과부화하는 추가적인 위험을 초래할 수있는 또 다른 여유 매개 변수를 시스템에 도입합니다.
이러한 값을 만드는 "매개 변수없는"접근 방식 중 하나는 스프레드의 표준 편차의 배수를 고려하여이를 경계로 사용하는 것입니다. 간단히하기 위해 우리는 배수의 계수를 1로 설정할 수 있습니다.
따라서 예측 오차가 스프레드의 음의 표준 편차 아래로 떨어지면 "스프레드를 길게"갈 수 있습니다. 예측 오차가 스프레드의 표준 편차를 초과하면 "스프레드를 짧게"이동할 수 있습니다. 이탈 규칙은 입력 규칙의 반대입니다.
동적 헤지 비율은 시간 $ t $, $ \ theta_t $에서 숨겨진 상태 벡터의 한 구성 요소로 표시되며, $ \ theta ^ 0_t $로 표시됩니다. 이것은 선형 회귀로부터 잘 알려진 "베타"기울기 값입니다.
여기서 "퍼짐을 길게하다"는 것은 TLT를 구매 (longing) $ N $ 단위로 판매 (shorting) $ \ lfloor $를 의미한다. $ \ lfloor $는 $ x $보다 작은 가장 높은 정수를 나타내는 "floor"이다. 후자는 ETF의 전체 수를 거래해야하기 때문에 필요합니다. "확산의 단락"은 이것의 반대입니다. $ N $은 위치의 전체 크기를 제어합니다.
$ e_t $는 예측 오차 또는 시간 $ t $에서의 예측의 잔류 오차를 나타내고, $ Q_t $는 시간 $ t $에서의이 예측의 분산을 나타낸다.
완전성을 위해 여기에 규칙이 지정됩니다.
$ e_t \ lt - \ sqrt $ - 긴 퍼짐 : TLT의 긴 $ N $ 공유와 IEI $ e_t \ ge - \ sqrt $의 짧은 $ \ lfloor $ 단위 이동 - 긴 종료 : TLT의 모든 긴 위치를 닫고 IEI $ e_t \ gt \ sqrt $ - TLT의 짧은 $ N $ 공유로 이동하고 IEI $ e_t \ le \ sqrt $의 $ $ llolo $ 단위로 간다. - 짧게 끝내기 : TLT와 IEI의 모든 짧은 위치를 닫는다. .
칼만 필터의 역할은 $ \ theta_t $와 $ e_t $ 및 $ Q_t $를 계산하는 데 도움이되는 것입니다. $ \ theta_t $는 $ t $에서 TLT와 IEI 사이의 선형 회귀에서의 절편과 기울기 값의 벡터를 나타낸다. 그것은 칼만 필터에 의해 추정됩니다. 예측 오차 / 잔여 $ e_t = y_t - \ hat _t $는 현재 TLT의 예측 된 값과 Kalman 필터의 TLT 추정치 간의 차이입니다. $ Q_t $는 예측의 분산이므로 $ \ sqrt $는 예측의 표준 편차입니다.
이 전략의 구현에는 다음 단계가 포함됩니다.
TLT와 IEI 모두에 대한 일일 시장 OHLCV 막대 수신 IEI의 어제 관찰을 기반으로 TLT 가격을 추정하기 위해 재귀 적 "온라인"칼만 필터를 사용합니다. 칼만 예측치와 실제 값 (종종 예측 오차라고 함)의 차이를 가져옵니다 또는 TLT와 IEI의 스프레드가 예상 값에서 벗어나는 정도를 나타내는 척도 인 잔여 오류. 예상치와 부정적으로 멀리 떨어져있을 때 스프레드가 길어지고 움직임이 예상보다 크게 벗어 났을 때 스프레드를 줄인다. value 계열이 예상 값으로 되돌아 갈 때 long 및 short 위치를 종료합니다.
이 전략을 수행하려면이 백 테스트가 적용되는 기간 동안 OHLCV 가격 데이터를 보유해야합니다. 특히 다음을 다운로드해야합니다.
TLT - 2009 년 8 월 3 일 ~ 2016 년 8 월 1 일 (링크) IEI 2009 년 8 월 3 일 ~ 2016 년 8 월 1 일 (여기 링크)
이 데이터는 결과를 복제하려는 경우 Qstrader 설정 파일에 지정된 디렉토리에 저장해야합니다.
파이썬 QSTrader 구현.
Qstrader는 위치 추적, 포트폴리오 관리, 데이터 수집 및 주문 관리를 처리하기 때문에 우리가 작성해야하는 코드는 전략 객체 자체뿐입니다.
전략은 PortEventHandler와 이벤트 큐를 통해 통신하며, 이를 위해 SignalEvent 객체를 사용합니다. 또한 기본 추상 전략 클래스 인 AbstractStrategy를 가져와야합니다.
QSTrader의 현재 알파 버전에서는 PriceParser 클래스도 가져와야합니다. 이것은 입력의 모든 가격에 큰 배수 ($ 10 ^ 8 $)를 곱하고 위치를 추적 할 때 정수 산술 연산을 수행하는 데 사용됩니다. 이렇게하면 백 테스트의 오랜 기간 동안 누적 될 수있는 부동 소수점 올림 문제가 방지됩니다. 올바른 가격을 얻으려면 PriceParser. PRICE_MULTIPLIER로 모든 가격을 나눠야합니다.
다음 단계는 KalmanPairsTradingStrategy 클래스를 만드는 것입니다. 이 클래스의 일은 Yahoo Finance의 TLT 및 IEI의 일일 OHLCV 막대에서받은 BarEvent를 기반으로 SignalEvent 객체를 생성 할시기를 결정하는 것입니다.
이 수업을 구성하는 데는 여러 가지 방법이 있습니다. 설명의 명확성을 위해 클래스의 모든 매개 변수를 하드 코딩하도록 선택했습니다. 특히 $ \ delta = 10 ^ $ 및 $ v_t = 10 ^ $의 값을 고정했습니다. 이들은 칼만 필터 모델의 시스템 잡음 및 측정 잡음 분산을 나타냅니다. 이것은 클래스의 __init__ 생성자에서 키워드 인자로 구현 될 수도 있습니다. 이러한 접근 방식은 직접적인 매개 변수 최적화를 가능하게합니다.
첫 번째 작업은 시장 데이터가 승인되고 거래 신호가 생성 될 때 업데이트 될 예정이므로 시간 및 투자 된 멤버를 없음으로 설정하는 것입니다. latest_prices는 TLT 및 IEI의 현재 가격을 두 줄로 배열하여 클래스를 통해 편리하게 사용합니다.
다음 매개 변수 집합은 모두 Kalman 필터와 관련이 있으며 여기 및 여기의 이전 두 기사에서 자세히 설명합니다.
마지막 매개 변수 세트에는 요일과 요일을 모두 구매할 ETF의 절대 수량을 추적하는 데 사용되는 요일 및 curtyhedgeqqty가 포함됩니다. 나는 이것을 100,000 USD의 계정 자본으로 2,000 단위로 설정했다.
다음 메서드 _set_correct_time_and_price는 Kalman 필터가 올바른 지점에서 올바른 가격 정보를 모두 사용할 수 있도록하는 "도우미"메서드입니다. 이는 Qstrader와 같은 이벤트 중심의 백 테스트 시스템에서 시장 정보가 순차적으로 도착하기 때문에 필요합니다.
우리는 IEI에 대한 가격을 받았지만 TFT가 아닌 $ K $ 일 수 있습니다. 따라서 TFT와 IEI 시장 이벤트가 모두 이벤트 대기열을 통해 백 테스트 루프에서 도착할 때까지 기다려야합니다. 라이브 거래에서는 며칠의 거래 기간에 비해 거의 즉각적으로 도착하므로 문제가되지 않습니다. 그러나 이벤트 중심의 백 테스트에서 새로운 칼만 필터 업데이트를 계산하기 전에 두 가격이 모두 도달 할 때까지 기다려야합니다.
코드는 후속 이벤트가 현재 날짜인지 여부를 기본적으로 확인합니다. 그렇다면 TLT 및 IEI의 latest_price 목록에 올바른 가격이 추가됩니다. 새로운 날이면 최신 가격이 재설정되고 올바른 가격이 다시 추가됩니다.
이러한 유형의 "하우스 키핑 (housekeeping)"방법은 미래에 QSTrader 코드베이스에 흡수되어 "보일러 플레이트"코드를 작성해야 할 필요성이 줄어들지 만 지금은 전략 자체의 일부를 구성해야합니다.
전략의 핵심은 calculate_signals 메소드에서 수행됩니다. 먼저 정확한 시간과 가격을 설정합니다 (위에서 설명한대로). 그런 다음 TLT와 IEI의 가격을 모두 확인합니다. 이 시점에서 새로운 거래 신호를 고려할 수 있습니다.
$ y $는 IEI의 최신 가격과 동일하게 설정되며 $ F $는 TLT의 최신 가격을 포함하는 관측 매트릭스이며 선형 회귀 분석에서 절편을 나타낼 수있는 단일 자리 표시 자입니다. 칼만 필터는이 최신 가격으로 업데이트됩니다. 마지막으로 예측 오차 $ e_t $와 예측의 표준 편차 인 $ \ sqrt $를 계산합니다. 이 코드를 단계별로 실행 해 보겠습니다. 조금 복잡해 보입니다.
첫 번째 작업은 각각 IEI와 TLT의 가격을 포함하는 스칼라 값 y와 관측 행렬 F를 형성하는 것입니다. 우리는 분산 공분산 행렬 R을 계산하거나 아직 초기화되지 않은 경우 제로 행렬로 설정합니다. 그 후 우리는 관측 yhat와 예측 오차 et의 새로운 예측을 계산한다.
그런 다음 관측 예측 Qt와 표준 편차 sqrt_Qt의 분산을 계산합니다. 여기에서 파생 된 업데이트 규칙을 사용하여 두 가격 사이의 헤지 비율 / 기울기를 포함하는 주 세타의 사후 분포를 얻습니다.
마지막으로 우리는 $ e_t $와 $ \ sqrt $ 값을 기반으로 거래 신호를 생성합니다. 이렇게하려면 "투자"상태가 "긴", "짧은"또는 "없음"중 무엇인지 확인해야합니다. 기울기 $ \ theta ^ 0_t $가 일정 시간 간격으로 조정되면 길거나 짧을 때 cur_hedge_qty 현재 헤지 수량을 조정할 필요가 있음을 주목하십시오.
이것은 Strategy 객체에 필요한 모든 코드입니다. 우리는 또한 모든 트레이딩 로직과 클래스 선택을 캡슐화하기 위해 백 테스트 파일을 생성해야합니다. 특정 버전은 examples 디렉토리에서 사용 된 버전과 매우 유사하며 500,000 USD의 자본을 100,000 USD로 대체합니다.
또한 FixedPositionSizer를 NaivePositionSizer로 변경합니다. 후자는 KalmanPairsTradingStrategy 클래스에서 결정한 ETF 단위의 절대 수량에 대한 제안을 "순진하게"받아 들일 때 사용됩니다. 프로덕션 환경에서는 포트폴리오의 위험 관리 목표에 따라이를 조정해야합니다.
kalman_qstrader_backtest. py의 전체 코드는 다음과 같습니다.
QSTrader가 올바르게 설치되고 데이터가 Yahoo Finance에서 다운로드 된 경우 터미널에서 다음 명령을 통해 코드를 실행할 수 있습니다.
많은 자원 봉사 개발자, 특히 ryankennedyio 및 femtotrader의 노력 덕분에이 코드는 OHLCV 바 데이터에 맞게 최적화되었으며 신속하게 백 테스트를 수행합니다.
전략 결과.
Qstrader에 추가 될 최신 기능 중 하나는 주로 nwillemse가 개발 한 "눈물 시트"입니다. 이 기능은 아직 개발 초기 단계이지만 여기서 설명합니다.
테어 시트는 주로 기관 설정에서 거래 전략에 대한 "단일 호출기"설명으로 사용됩니다. QSTrader 코드베이스의 TearsheetStatistics 클래스는 일반적인 전략 성과 보고서에있는 많은 통계를 복제합니다.
상위 2 개의 그래프는 각각 자본 및 삭감 비율을 나타냅니다. 그 아래에는 월별 및 연간 실적 패널이 있습니다. 마지막으로 자본 곡선, 무역 수준 및 시간 기반 통계가 표시됩니다.
더 크게 보려면 이미지를 클릭하십시오.
주식 곡선은 전략의 첫 해에는 상대적으로 평탄하지만 2011 년에는 급격히 상승합니다. 2012 년에는 전략이 2015 년까지 "수 중"상태로 유지되고 일일 최대 손실률이 15.79 %에 이릅니다. 실적은 2013 년 말 최대 축소에서 2016까지 점진적으로 증가합니다.
이 전략의 연평균 성장률은 8.73 %이며 Sharpe Ratio는 0.75입니다. 또한 2 년 동안 777 일의 최대 인출 시간이 길어졌습니다! 이 전략은 거래 비용의 총액으로 수행되므로 실제 성과가 악화 될 가능성이 있습니다.
다음 단계.
이것을 라이브 설정에서 배포 할 수익성 높은 전략으로 전환하는 데 필요한 많은 연구 작업이 있습니다. 연구의 잠재적 인 방법은 다음과 같습니다.
매개 변수 최적화 - 교차 검증 그리드 검색 또는 기계 학습 최적화의 일부 형태를 통해 칼만 필터의 매개 변수를 변경합니다. 그러나 이로 인해 과거 데이터에 과도하게 적용될 수 있습니다. 자산 선택 - ETF의 추가 또는 대안 쌍을 선택하면 포트폴리오에 다양성을 추가하는 데 도움이되지만 전략의 복잡성뿐만 아니라 거래 횟수 (및 거래 비용)가 증가합니다.
앞으로의 기사에서는 다양한 거래 전략에 대해 이러한 절차를 수행하는 방법을 고려할 것입니다.
참조.
양적 거래 시작하기?
QuantStart 목록을 구독해야하는 3 가지 이유 :
1. 퀀트 트레이딩 레슨.
계량 거래를 시작하는 데 도움이되는 힌트와 팁으로 가득한 무료 10 일간 코스에 즉시 액세스 할 수 있습니다!
2. 모든 최신 내용.
매주 나는 퀀트 스타트에서 모든 활동의 포장을 보내드릴 것입니다. 그래서 당신은 결코 다시 글을 놓치지 않을 것입니다.
현실감 넘치는 퀀 트레이딩 팁.
태그 : 칼만 필터.
성공적인 통계적 차용 증서.
내 블로그 독자 나 투자자와 Q & A에 참여하지 않는 경향이 있습니다. 나는 내 인생에서 내가 원하는 것을하고있는 대부분의 시간을 보낸다. 다른 사람들이 내가하기를 바란다. 연구와 거래를 즐기기 때문에 & # 8230;
Kalman Filter와 ETF 쌍 거래.
이전 기사에서 설명한 칼만 필터 기술을 예제를 통해 설명 할 수 있는지 독자가 묻습니다. 모델 추정을 위해 2006 년 1 월부터 2015 년 2 월까지의 일일 데이터를 사용하여 ETF 쌍인 AGG IEF를 봅시다. 그림 1의 차트에서 알 수 있듯이 & # 8230;
칼만 필터를 사용한 통계적 차용 증서.
이전 글에서 논의한 통계 차익 거래에 대한 공적분 접근법의 문제점 중 하나는 공적분 관계가 거의 정적이지 않다는 것입니다. 이러한 공적분 관계는 자주 변경되고 종종 완전히 무너집니다. 2009 년에 필자는 칼만 필터 (Kalman Filter)를 기반으로 한 쌍 거래에 대한보다 역동적 인 접근 방식을 실험하기 시작했습니다. & # 8230;
Regime 스위칭 모델의 쌍 거래에 대한 실제 적용.
이전 글에서는 시장 상태 모델링에 사용 된 몇 가지 기술을 설명했습니다. 다음은 이러한 기술을 실제로 어떻게 적용 할 수 있는지 보여줍니다. 이 게시물을 pdf 형식으로 여기에서 다운로드 할 수 있습니다. 아래 차트는 ETF 통계적 재정 거래의 단일 쌍에 대한 일일 복리 반품을 보여줍니다. & # 8230;
칼만 필터 학습.
많은 사람들이 칼만 필터링에 대해 들어 봤지만 그 주제는 신비 롭다고 생각합니다. 칼만 필터를 유도하고 그것이 "최적"이라고 수학적으로 증명하는 것은 사실이지만, 다양한 상황에서 다소 강렬 할 수 있습니다. 기본 선형 시스템에 필터를 적용하는 것은 실제로 매우 쉽습니다. 이 Matlab 파일은이를 증명하기위한 것입니다.
No comments:
Post a Comment