퀀트 쌍 거래 전략
쌍 거래에서 이익을 찾는 비밀.
"퀀트 (Quants)"는 수익성있는 거래 전략을 개발하기 위해 정량 분석을 사용하는 시장 조사 업체를위한 월가의 이름입니다. 즉, 수익률이 높은 거래 기회를 신성화하기 위해 회사 또는 거래 수단 간의 가격 비율 및 수학적 관계를 통해 수량을 빗어냅니다. 1980 년대에 Morgan Stanley를 위해 일하는 퀘스트 그룹은 쌍 무역이라고 불리는 전략으로 금을 받았습니다. 주요 투자 은행의 기관 투자가와 독점 거래 데스크는 그 이후이 기술을 사용 해왔고 많은 사람들이 전략으로 깔끔한 수익을 냈습니다.
투자 은행가와 뮤추얼 펀드 매니저가 수익성있는 거래 전략을 대중과 공유하는 것이 거의 불가능하기 때문에 인터넷의 출현 때까지 쌍 무역은 전문가 (그리고 약간의 개인)의 비밀로 남아있었습니다. 온라인 거래는 실시간 금융 정보를 열어 모든 유형의 투자 전략에 대한 초보자의 접근성을 제공했습니다. 페어 트레이드가 개인 투자자와 소규모 상인을 끌어 들여 더 넓은 시장의 움직임에 대한 위험 노출을 헤지하기를 원하는 것은 오랜 시간이 걸리지 않았습니다.
목표는 쌍의 가격 비율이 표준 편차의 x 배수 일 때 상호 연관성이 높은 두 개의 거래 차량을 매치하는 것입니다. "x"는 과거 데이터를 사용하여 최적화됩니다. 쌍이 평균 추세로 돌아 가면 한쪽 또는 양쪽 위치에서 수익이 발생합니다.
쌍 무역을 디자인하는 첫 번째 단계는 상호 연관성이 높은 두 종목을 찾는 것입니다. 일반적으로 기업은 동일한 산업 또는 하위 분야에 있지만 항상 그런 것은 아닙니다. 예를 들어, QQQQ (나스닥 100) 또는 SPY (S & amp; P 500)와 같은 지수 추적 주식은 우수한 쌍 거래 기회를 제공 할 수 있습니다. 일반적으로 함께 거래되는 두 지수는 S & P 500과 다우 존스 유틸리티 평균입니다. 두 지수의 간단한 가격 도표는 상관 관계를 보여줍니다.
예를 들어 GM과 Ford의 상관 관계가 높은 두 가지 사업을 살펴 보겠습니다. 둘 다 미국 자동차 제조업체이기 때문에 그들의 주식은 함께 움직이는 경향이 있습니다.
다음은 Ford와 GM 간의 가격 비율에 대한 주간 차트입니다 (Ford의 주가를 GM의 주가로 나누어 계산). 이 가격 비율은 때로는 "상대 성과"(상대 강도 지수, 완전히 다른 것과 혼동되어서는 안됨)라고도합니다. 가운데 흰 선은 지난 2 년간 평균 가격 비율을 나타냅니다. 노란색과 빨간색 선은 평균 비율로부터 각각 1 ~ 2 표준 편차를 나타냅니다.
아래 차트에서 가격 비율이 첫 번째 또는 두 번째 편차에 도달하면 수익 가능성을 확인할 수 있습니다. 이러한 수익성있는 다양성이 발생할 때 실적이 저조한 사람에게는 길게, 그리고 지나친 사람에게는 짧은 자리를 차지할 때입니다. 짧은 판매로 인한 수입은 긴 포지션의 비용을 충당하는 데 도움이 될 수 있으므로 페어를 저렴한 가격으로 판매 할 수 있습니다. 쌍의 위치 크기는 주식 수보다는 달러 가치와 일치해야합니다. 이 방법은 하나의 5 % 이동은 다른 하나의 5 % 이동과 동일합니다. 모든 투자와 마찬가지로 거래가 적자로 전환 될 수있는 위험이 있으므로 쌍 거래를 구현하기 전에 최적의 중단 손실 포인트를 결정하는 것이 중요합니다.
선물 계약을 사용한 예.
선물 시장의 쌍 거래는 선물 계약과 주어진 지수의 현금 포지션 사이의 차익 거래를 포함 할 수 있습니다. 선물 계약이 현물 포지션보다 앞서 나갈 때, 상인은 미래를 누락시키고 인덱스 트래킹 주식을 오랫동안 보면서 이익을 얻으려고 노력할지도 모릅니다. 종종 지수 또는 상품과 선물 계약 간의 움직임은 너무 빡빡하여 가장 빠른 상인 만 이익을 얻습니다. 종종 컴퓨터를 사용하여 눈 깜짝 할 사이에 엄청난 순위를 자동으로 실행합니다.
옵션을 사용한 예제.
수익성의 증거.
페어 트레이딩 기술에 관심이있는 사람들은 Ganapathy Vidyamurthy의 책 Pairs Trading : Quantitative Methods and Analysis에서 더 많은 정보와 교육을 찾을 수 있습니다.
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 Fund)에 적용됩니다. 그들은:
목표는이 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 일의 최대 인출 시간이 길어졌습니다! 이 전략은 거래 비용의 총액으로 수행되므로 실제 성과가 악화 될 가능성이 있습니다.
다음 단계.
이것을 라이브 설정에서 배포 할 수익성 높은 전략으로 전환하는 데 필요한 많은 연구 작업이 있습니다. 연구의 잠재적 인 방법은 다음과 같습니다.
매개 변수 최적화 - 교차 검증 그리드 검색 또는 기계 학습 최적화의 일부 형식을 통해 Kalman 필터의 매개 변수를 변경합니다. 그러나 이로 인해 과거 데이터에 과도하게 적용될 수 있습니다. 자산 선택 - ETF의 추가 또는 대안 쌍을 선택하면 포트폴리오에 다양성을 추가하는 데 도움이되지만 전략의 복잡성뿐만 아니라 거래 횟수 (및 거래 비용)가 증가합니다.
앞으로의 기사에서는 다양한 거래 전략에 대해 이러한 절차를 수행하는 방법을 고려할 것입니다.
참조.
양적 거래 시작하기?
QuantStart 목록을 구독해야하는 3 가지 이유 :
1. 퀀트 트레이딩 레슨.
계량 거래를 시작하는 데 도움이되는 힌트와 팁으로 가득한 무료 10 일간 코스에 즉시 액세스 할 수 있습니다!
2. 모든 최신 내용.
매주 나는 퀀트 스타트에서 모든 활동의 포장을 보내드릴 것입니다. 그래서 당신은 결코 다시 글을 놓치지 않을 것입니다.
현실감 넘치는 퀀 트레이딩 팁.
QuantStart.
빠르게 성장하는 소매점 퀀텀 트레이더 커뮤니티를 지원하는 Quantcademy 개인 회원 포털에 가입하십시오. 당신은 당신의 가장 중요한 퀀트 트레이딩 질문에 대답 할 준비가되어있는 지식이 풍부하고 마음이 맞는 퀀트 트레이더 그룹을 찾을 수 있습니다.
퀀트 트레이딩에 관한 나의 eBook을 확인해보십시오. 여기서 저는 파이썬 툴로 수익성 높은 체계적인 트레이딩 전략을 만드는 법을 가르쳐드립니다.
Python 및 R을 사용하여 시계열 분석, 기계 학습 및 베이지안 통계를 사용하는 고급 거래 전략에 관한 새로운 전자 책을 살펴보십시오.
2014 년 2 월 20 일 Michael Halls-Moore
이 기사에서는 첫 번째 일중 거래 전략을 고려할 것입니다. 그것은 고전적인 거래 아이디어, 즉 "거래 쌍"을 사용할 것입니다. 이 경우 우리는 뉴욕 증권 거래소 (NYSE)에서 거래되고 미국 주식 시장 지수 인 S & amp; P500을 거래하려고하는 두 개의 ETF (Exchange Traded Funds), SPY 및 IWM을 사용할 예정입니다. 러셀 2000, 각각.
이 전략은 ETF 쌍을 갈망하여 하나의 금액을 단락시킴으로써 ETF 쌍 사이에 "확산"을 광범위하게 창출합니다. 장단기 비율은 통계적 공적분 시계열 기법을 활용하는 등 다양한 방법으로 정의 할 수 있습니다. 이 시나리오에서는 롤링 선형 회귀를 통해 SPY와 IWM 사이의 헤지 비율을 계산할 것입니다. 그러면 SPY와 IWM간에 z - 점수로 표준화 된 "확산"을 만들 수 있습니다. 거래 신호는 스프레드가 평균으로 되돌아 갈 것이라는 믿음으로 z - 점수가 특정 임계 값을 초과 할 때 생성됩니다.
전략의 근거는 SPY와 IWM이 대규 모 및 소규모 미국 기업 그룹의 경제와 동일한 상황을 대략적으로 특성화한다는 것입니다. S-P500 지수와 Russell 2000 지수를 별도로 (예 : small-cap / large-cape) 영향을 미칠 수 있기 때문에 전복은 가격의 스프레드를 취하면 평균 반전이되어야한다는 것이 전제입니다. 뚜렷한 차이, 재조정 날짜 또는 거래 차단), 장기 물가 연동이 가능할 것입니다.
전략.
전략은 다음 단계로 수행됩니다.
데이터 - SPY 및 IWM의 1 분 막대는 2007 년 4 월에서 2014 년 2 월 사이에 얻어집니다. 처리 - 데이터가 올바르게 정렬되고 누락 된 막대가 서로 삭제됩니다. 스프레드 - 두 ETF 간의 헤지 비율은 롤링 선형 회귀 분석을 통해 계산됩니다. 이것은 1 bar만큼 앞으로 이동하고 회귀 계수를 다시 계산하는 전환 확인 창을 사용하여 $ \ beta $ 회귀 계수로 정의됩니다. 따라서 막대 $ b_i $에 대한 헤지 비율 $ \ beta_i $는 $ k $ 막대의 룩백을 위해 포인트 $ b_ $ ~ $ b_ $에 걸쳐 계산됩니다. Z-Score - 스프레드의 표준 점수는 일반적인 방식으로 계산됩니다. 이것은 스프레드의 (샘플) 평균을 빼고 스프레드의 (샘플) 표준 편차로 나눈 것을 의미합니다. 이것에 대한 이론적 근거는 z - 점수가 무 차원 양이므로 문턱 값 매개 변수를 더 쉽게 해석 할 수 있도록하는 것입니다. 나는 의도적으로 계산에 미리보기 바이어스를 도입하여 얼마나 미묘한가를 보여 주었다. 그것을 시도하고보십시오! 거래 - 긴 신호는 음수의 z 점수가 사전 결정된 (또는 사후 최적화 된) 임계 값 아래로 떨어지면 발생하며 짧은 신호는 이와 반대입니다. 탈출 신호는 절대 z - 점수가 추가 임계 값 아래로 떨어지면 생성됩니다. 이 전략을 위해 나는 (임의로) $ | z | = 2 $의 절대 진입 임계치와 $ | z | = 1 $의 퇴계 임계치를 선택했다. 퍼짐에있는 평균 되돌리기 행동을 추측하는 것은, 희망적으로 그 관계를 붙잡고 긍정적 인 성과를 제공 할 것입니다.
아마도 전략을 깊이있게 이해하는 가장 좋은 방법은 실제로 그것을 구현하는 것입니다. 다음 섹션에서는이 평균 회귀 전략을 구현하기위한 전체 파이썬 코드 (단일 파일)에 대해 설명합니다. 이해를 돕기 위해 코드를 자유롭게 주석 처리했습니다.
파이썬 구현.
모든 Python / pandas 자습서와 마찬가지로이 자습서에서 설명한대로 Python 연구 환경을 설정해야합니다. 설치가 끝나면 첫 번째 작업은 필요한 Python 라이브러리를 가져 오는 것입니다. 이 역 테스트를 위해서는 matplotlib과 pandas가 필요합니다.
내가 사용하고있는 특정 라이브러리 버전은 다음과 같습니다.
도서관을 가져 오십시오.
다음 함수 create_pairs_dataframe은 두 개의 기호로 된 일간 막대를 포함하는 두 개의 CSV 파일을 가져옵니다. 우리의 경우 SPY와 IWM이 될 것입니다. 그런 다음 두 원본 파일의 인덱스를 사용하는 별도의 데이터 프레임 쌍을 만듭니다. 누락 된 거래 및 오류로 인해 타임 스탬프가 다를 수 있으므로 일치하는 데이터가 보장됩니다. 이는 판다 (pandas)와 같은 데이터 분석 라이브러리를 사용하면 얻을 수있는 주요 이점 중 하나입니다. "상용구"코드는 매우 효율적으로 처리됩니다.
다음 단계는 SPY와 IWM 사이에서 회전하는 선형 회귀를 수행하는 것입니다. 이 인스턴스에서 IWM은 예측 자 ( 'x')이고 SPY는 응답 ( 'y')입니다. 100 개의 막대로 구성된 기본 전환 확인 기간을 설정했습니다. 위에 논의 된 바와 같이 이는 전략의 매개 변수입니다. 전략이 강력하다고 판단 되려면 수익률 프로필 (또는 다른 실적 측정치)을 전환 기간의 볼록 함수로보고 싶을 것입니다. 따라서 코드의 후반부에 특정 범위에 대한 룩백 기간을 변경하여 민감도 분석을 수행 할 것입니다.
일단 회전 베타 계수가 SPY-IWM에 대한 선형 회귀 모델에서 계산되면 데이터 프레임 쌍에 추가하고 빈 행을 삭제합니다. 이것은 트리밍 기준과 같은 룩백 크기와 동일한 첫 번째 막대 집합을 구성합니다. 그런 다음 두 개의 ETF를 SPY 및 IWM의 $ - \ beta_i $ 단위로 보급합니다. 분명히 실제 구현에서는 불가능한 IWM의 양을 취하는 것이 현실적인 상황은 아닙니다.
마지막으로 스프레드의 평균을 빼고 스프레드의 표준 편차로 정규화 한 스프레드의 z - 점수를 만듭니다. 여기에는 다소 미묘한 미리보기 바이어스가 있습니다. 나는 연구에서 실수를하는 것이 얼마나 쉬운 지 강조하고 싶었 기 때문에 의도적으로 코드에 남겨 두었습니다. 평균 및 표준 편차는 전체 확산 시계열에 대해 계산됩니다. 이것이 진정한 역사적 정확성을 반영한 것이라면, 이 정보는 암시 적으로 미래의 정보를 사용하기 때문에 이용 가능하지 않았을 것입니다. 따라서 우리는 회전 평균과 표준 편차를 사용하여 z 점수를 계산해야합니다.
create_long_short_market_signals에서 거래 신호가 생성됩니다. 이것들은 z - 스코어가 음의 z - 스코어를 초과 할 때 스프레드를 길게하고 z - 스코어가 양의 z - 스코어를 능가 할 때 스프레드를 짧게하여 계산됩니다. 이탈 신호는 z 점수의 절대 값이 다른 (크기가 더 작은) 임계 값보다 작거나 같으면 주어집니다.
이 상황을 달성하기 위해서는 전략이 시장의 "내부"인지 "외부"인지를 각 바에 대해 알아야합니다. long_market과 short_market은 길고 짧은 시장 위치를 추적하기 위해 정의 된 두 변수입니다. 불행하게도 이것은 벡터화 된 접근 방식과 달리 반복적 인 방식으로 코드를 작성하는 것이 훨씬 간단하므로 계산이 느립니다. 요구되는 1 분 막대에도 불구하고.
CSV 파일 당 700,000 개의 데이터 포인트를 사용하여 구형 데스크탑 컴퓨터에서 계산하는 것이 상대적으로 빠릅니다!
pandas DataFrame (일반적인 작업은 아니지만)을 반복하려면 iterrows 메서드를 사용해야합니다. iterrows 메서드는 반복 할 수있는 생성기를 제공합니다.
이 단계에서 실제 장 / 단 신호를 포함하도록 쌍을 업데이트하여 시장에 있어야하는지 여부를 결정할 수 있습니다. 이제 우리는 포지션의 시장 가치를 추적 할 수있는 포트폴리오를 만들어야합니다. 첫 번째 작업은 길고 짧은 신호를 결합하는 위치 열을 만드는 것입니다. 여기에는 $ (1,0, -1) $, long / market 위치를 나타내는 $ 1 $, (종료해야하는) 위치가없는 $ 0 $ 및 short / market position을 나타내는 $ -1 $의 요소 목록이 포함됩니다 . sym1 및 sym2 열은 각 막대를 닫을 때 SPY 및 IWM 위치의 시가를 나타냅니다.
일단 ETF 시장 가치가 창출되면, 모든 바의 끝에서 총 시장 가치를 산출하기 위해 ETF 시장 가치를 합산합니다. 그런 다음 해당 Series 객체의 pct_change 메소드를 통해 반환 스트림으로 변환됩니다. 후속 코드 줄은 나쁜 항목 (NaN 및 inf 요소)을 정리하고 마지막으로 완전한 형평 곡선을 계산합니다.
__main__ 함수는이 모든 것을 하나로 결합합니다. 일중 CSV 파일은 datadir 경로에 있습니다. 특정 디렉토리를 가리 키도록 아래 코드를 수정해야합니다.
전략이 전환 확인 기간과 얼마나 중요한지 판단하려면 다양한 전환에 대한 실적 측정 항목을 계산해야합니다. 성능 측정 값과 $ [50,200] $의 룩백 범위 인 포트폴리오의 최종 총 백분율 수익률을 10 씩 증가시켜 선택했습니다. 다음 코드에서 이전 함수가이 범위에서 for 루프로 래핑 된 것을 볼 수 있습니다 다른 임계 값은 고정되어 있습니다. 마지막 작업은 matplotlib를 사용하여 lookbacks 대 line charts를 반환하는 것입니다.
전환 확인 기간과 수익의 차트를 볼 수 있습니다. 110 막대와 같은 룩백 (lookback) 주위에는 "전역"최대 값이 있습니다. 룩백이 수익과 무관 한 상황을 보았다면 우려의 원인이었을 것입니다.
SPY-IWM 선형 회귀 헤지 비율 비유 기간 분석.
상향 경 사진 주식 곡선없이 백 테스팅 기사를 완성 할 수 없습니다! 따라서 누적 수익률과 시간의 곡선을 플로팅하려는 경우 다음 코드를 사용할 수 있습니다. 전환 확인 매개 변수 연구에서 생성 된 최종 포트폴리오를 플로팅합니다. 따라서 시각화하려는 차트에 따라 룩백을 선택해야합니다. 차트는 비교를 돕기 위해 같은 기간에 SPY의 수익률을 표시합니다.
다음과 같은 주식 곡선 차트는 100 일의 전환 기간 동안 발생합니다.
SPY-IWM 선형 회귀 헤지 비율 비유 기간 분석.
SPY의 축소는 금융 위기 기간 중 2009 년에 중요하다는 점에 유의하십시오. 전략은 또한 현 단계에서 변동성이있었습니다. 또한이 기간 동안 S & P500 지수를 반영하는 SPY의 강세 경향으로 인해 작년 실적이 다소 악화되었음을 유의하십시오.
스프레드의 z - 점수를 계산할 때 미리보기 바이어스를 고려해야합니다. 또한 이러한 모든 계산은 거래 비용없이 수행되었습니다. 이 전략은 일단 이러한 요소가 고려되면 매우 열악하게 수행됩니다. 학비, 입찰 / 매도 및 미끄러짐은 모두 현재 밝혀지지 않았습니다. 또한이 전략은 매우 비현실적인 ETF의 소수 단위로 거래되고 있습니다.
추후 기사에서 우리는 이러한 요소들을 고려하여 훨씬 더 정교한 이벤트 중심의 백 테스터 (backteter)를 만들 것이며, 우리의 주식 곡선 및 성과 지표에 대한 신뢰도를 상당히 높일 것입니다.
양적 거래 시작하기?
QuantStart 목록을 구독해야하는 3 가지 이유 :
1. 퀀트 트레이딩 레슨.
계량 거래를 시작하는 데 도움이되는 힌트와 팁으로 가득한 무료 10 일간 코스에 즉시 액세스 할 수 있습니다!
2. 모든 최신 내용.
매주 나는 퀀트 스타트에서 모든 활동의 포장을 보내드릴 것입니다. 그래서 당신은 결코 다시 글을 놓치지 않을 것입니다.
현실감 넘치는 퀀 트레이딩 팁.
페어 트레이딩 전략 [엑셀 모델]
쌍 무역.
페어 트레이딩은 하나의 주식 / 자산의 긴 포지션과 통계적으로 관련된 다른 주식 / 자산의 포지션을 상쇄시키는 트레이딩 전략입니다. 페어 트레이딩은 가격이 역사적인 추세로 돌아갈 것을 의미하는 평균 반전 전략입니다.
이 Excel 모델을 사용할 수있는 사용자는 누구입니까?
알고리즘 및 퀀트 거래에 관심이있는 사람들, 통계적 재정 거래에 대해 배우고 자하는 사람들.
그것이 어떻게 도움이됩니까?
이 탁월한 모델은 다음과 같은 이점을 제공합니다.
평균 반향의 적용을 배우십시오 쌍 거래의 이해 거래 매개 변수 최적화 통계적 재정 거래의 중요한 수익을 이해하십시오.
왜 당신은 거래 모델을 다운로드해야합니까?
트레이딩 로직은 시트의 셀에 코딩되어 있으므로 사용자가 편리하게 파일을 다운로드하고 분석하여 이해를 향상시킬 수 있습니다. 뿐만 아니라 더 나은 결과를 얻기 위해 숫자를 중심으로 놀 수 있습니다. 기사에 지정된 것보다 더 높은 수익을 제공하는 적절한 매개 변수를 찾을 수 있습니다.
모델 설명.
이 예에서 우리는 MSCI와 Nifty 쌍을 주식 시장 지수로 간주합니다. 우리는이 쌍에 평균 회귀 전략을 구현합니다. 평균 복귀는 정지 된 시계열의 특성입니다. 우리가 선택한 쌍이 평균 반향이라고 주장하기 때문에 우리는 그것이 평범함을 따르는 지 여부를 테스트해야합니다. 다음 다이어그램은 Nifty와 MSCI의 대수 비율을 플로팅 한 것입니다. 처음에는 2.088의 평균값으로 되돌아가는 평균 인 것처럼 보였으 나 Dicky Fuller Test를 사용하여 통계적 유의성을 가지고 정지 상태인지 여부를 테스트했습니다. Cointegration output table의 결과는 가격대가 고정되어있어 되돌아 간다는 것을 보여줍니다. Dicky Fuller Test 통계 및 상당히 낮은 p - 값 (& lt; 0.05)은 우리의 가정을 확인시켜 준다. 선택된 회귀 쌍에 대해 평균 회귀가 성립한다고 판단되면 가정과 입력 매개 변수를 지정합니다.
가정.
간략화를 위해 입찰가 스프레드를 무시합니다. 가격은 5 분 간격으로 제공되며 5 분 마감 가격으로 거래됩니다. 이것은 분리 된 데이터이기 때문에 위치의 스퀘어 링은 양초의 끝에, 즉 5 분의 끝에 사용 가능한 가격으로 발생합니다. 일반 세션 (T) 만 거래됩니다. 거래 비용은 Nifty의 경우 0.375 달러이며 MSCI의 경우 1.10 달러입니다. 각 거래의 증거금은 990 달러 (대략 1000 달러)입니다.
입력 매개 변수.
아래에 언급 된 입력 매개 변수의 모든 값은 구성 가능합니다.
평균 10 개의 촛불 (촛불 하나 = 5 분마다 가격)이 고려됩니다. 구매를 위해 +2의 "z"점수를, 판매를 위해 -2를 계산합니다. $ 100의 정지 손실과 $ 200의 이익 한도가 설정됩니다. MSCI 거래 주문량은 50 (1 lot)이고 Nifty는 6 (3 lot)입니다.
시장 데이터 및 거래 매개 변수는 12 번째 줄부터 스프레드 시트에 포함됩니다. 따라서 열 D를 참조 할 때 D12부터 참조가 시작되어야 함이 분명해야합니다.
Excel 모델의 열 설명.
열 C는 MSCI의 가격을 나타냅니다.
열 D는 Nifty 가격을 나타냅니다.
E 열은 Nifty와 MSCI의 대수 비율입니다.
F 열은 10 개의 촛불 평균을 계산합니다. 평균 계산에는 10 개의 값이 필요하기 때문에 F12에서 F22까지의 값이 없습니다. 공식 = IF (A23> $ C $ 3, AVERAGE (INDEX ($ E $ 13 : $ E $ 1358, A23- $ C $ 3) : E22), & # 8221;)는 평균이 계산되어야 함을 의미합니다 사용할 수있는 데이터 샘플이 10보다 큰 경우 (즉 셀 C3에 지정된 값) 그렇지 않으면 셀이 비어 있어야합니다. 셀 F22를 고려하십시오. 해당 셀 A22의 값은 10입니다. A22> $ C $ 3이 실패하므로 해당 셀의 항목이 비어 있습니다. 다음 셀 (F23)은 A23 & gt; $ C $ 3이 참이기 때문에 값을 갖는다. 수식의 다음 비트.
평균 (INDEX ($ E $ 13 : $ E $ 1358, A23- $ C $ 3) : E22)은 열 E 데이터의 마지막 10 개 (셀 C3에서 언급 한 것)의 양초를 계산합니다. 표준 편차가 계산되는 열 G에 대해 유사한 논리가 유지됩니다. "z"점수를 계산하기위한 공식은 z = (x -) / (σ)입니다. 여기에서 x는 표본 (열 E)이고 평균값 (열 F)이며 σ는 표준 편차 (열 G)입니다.
열 I는 거래 신호를 나타냅니다. 입력 매개 변수에서 언급했듯이 "z"점수가 -2보다 낮 으면 구매하고 +2 이상으로 판매하면 판매합니다. 우리가 구매를 말할 때, 우리는 멋진 3 개의 로트에서 긴 포지션을 가지고 있고 MSCI의 1 로트에서 짧은 포지션을 가지고 있습니다. 마찬가지로 우리가 판매라고 말할 때, 우리는 MSCI의 1 로트에서 long position을 가지며, Nifty의 3 로트에서 짧은 포지션을 가지고 따라서 포지션을 제곱합니다. 우리는 항상 열린 자세를 취하고 있습니다. 이것이 의미하는 바를 이해하려면 두 거래 신호가 "매수"와 "매도"를 고려하십시오. 앞서 설명한 "구매"신호의 경우, 우리는 3 장의 멋진 미래와 1 장의 MSCI 미래를 살 것입니다. 일단 위치가 잡히면 상태 열, 즉 열 M을 사용하여 위치를 추적합니다. 위치가 계속되는 동안 각 새 행에서 정지 손실 (셀 C6에서 언급했듯이) 또는 수익을 얻는 지 (셀 C7)이 맞았다. 정지 손실에는 USD -100의 값이 주어지며, 즉 미화 100 달러의 손실이 발생하고 C6 셀과 C7 셀에 각각 미화 200 달러의 가치가 주어집니다. 포지션이 손절매 또는 이익을 얻지는 못하지만, 우리는 그 거래를 계속하고 열 I에 나타나는 모든 신호를 무시합니다. 거래가 손절매 또는 이익을 얻는다면 우리는 다시 열 나는 열 I에서 신호를 사거나 팔자 마자 새로운 거래 포지션을 열었습니다.
열 M은 지정된 입력 매개 변수를 기반으로 한 거래 신호를 나타냅니다. 열 I에는 이미 거래 신호가 있고 M은 우리의 거래 포지션의 상태에 대해 알려줍니다. 즉, 길거나 짧거나 이익을 예약했거나 중단 손실시 종료되었습니다. 거래가 종료되지 않은 경우 이전 촛불의 상태 열 값을 반복하여 다음 촛불 위치로 이동합니다. 가격 움직임이 주어진 TP 또는 SL을 위반하는 방식으로 발생하면 우리는 "TP"및 "SL"로 각각 표시하여 우리의 입장을 정사각형으로 만듭니다.
열 L은 시장 진입을 나타냅니다. 기간 종료 시점의 포트폴리오 위치를 지정합니다. 입력 매개 변수에 지정된대로 MSCI 1 개와 Nifty 3 개를 거래합니다. 따라서 우리가 거래 할 때 적절한 가격 차이 (매매 여부에 따라)에 롯트 수를 곱한 값이됩니다.
열 N은 거래의 손익 상태를 나타냅니다. P / L은 우리가 우리의 입장에서 벗어 났을 때에 만 계산됩니다. O 열은 누적 이익을 계산합니다.
출력 테이블에는 몇 가지 성능 메트릭이 표로 구성되어 있습니다. 모든 손실 거래에서 손실은 3699 달러이며 TP를 치는 거래에서 얻는 이익은 9280 달러입니다. 따라서 총 P / L은 $ 9280- $ 3699 = $ 5581입니다. 손실 거래는 거래 포지션에서 돈을 잃는 거래입니다. 수익성있는 거래는 성공을 거두는 거래입니다. Average profit is the ratio of total profit to the total number of trades. Net average profit is calculated after subtracting the transaction costs which amounts to $91.77.
Comments
Post a Comment