백테스팅을 위한 연속 선물 계약

저자:선함, 2019-03-18 10:48:28, 업데이트:

선물 계약에 대한 간략한 개요

미래에셋대우 (期貨) 는 미래에 지정된 날짜에 기본 자산의 양을 구매하거나 판매하기 위해 두 당사자 사이에 작성된 계약의 형태이다. 이 날짜는 배달 또는 만료로 알려져 있습니다. 이 날짜가 도달하면 구매자는 계약 결성 날짜에 합의된 가격에 판매자에게 물리적 기본 (또는 현금 동등) 을 제공해야합니다.

실용적으로 선물은 거래소에서 거래된다 (오버 더 카운터 - OTC 거래와는 달리) 기본 물량과 품질에 대한 표준화. 가격은 매일 시장에 표시된다. 선물은 믿을 수 없을 정도로 유동적이며 투기 목적으로 많이 사용됩니다. 선물은 종종 농업 또는 산업 물품의 가격을 헤지하기 위해 사용되었지만 선물 계약은 주식 지수, 외환 가치의 금리율과 같은 가시적 또는 가시적 인 기본에 의해 형성 될 수 있습니다.

다양한 거래소에서 미래에셋 계약에 사용되는 모든 기호 코드의 자세한 목록은 CSI 데이터 사이트: 미래에셋 정보 엽에서 찾을 수 있습니다.

선물 계약과 주식 소유의 주요 차이점은 선물 계약이 만료 날짜에 따라 제한된 가용성 창을 가지고 있다는 사실이다. 어느 순간에도 동일한 기본에 다양한 선물 계약이 모두 만료 날짜가 다를 수 있습니다. 가장 가까운 만료 날짜를 가진 계약은 가까운 계약으로 알려져 있습니다. 양적 거래자로서 우리가 직면하는 문제는 언제든지 거래 할 수있는 여러 계약의 선택이 있다는 것입니다. 따라서 우리는 주식이나 외환의 경우와 같이 연속적인 흐름이 아닌 중복되는 시간 일련의 선택권을 가지고 있습니다.

이 문서의 목표는 이러한 복수의 시리즈에서 연속적인 계약의 흐름을 구성하는 다양한 접근 방식을 설명하고 각 기술과 관련된 타협을 강조하는 것입니다.

지속가능한 미래계약 체결

기본 계약에서 연속적인 계약을 생성하려는 주된 어려움은 계약이 종종 동일한 가격으로 거래되지 않는다는 것입니다. 따라서 한 가지에서 다음으로 부드러운 스플레이스를 제공하지 않는 상황이 발생합니다. 이것은 콘탕고 및 백워더레이션 효과 때문입니다. 이 문제를 해결하는 데 다양한 접근법이 있습니다.

일반적 접근 방법

불행히도 금융 산업에서 선물 계약을 결합하기 위한 단일 표준 방법은 없습니다. 궁극적으로 선택한 방법은 계약을 사용하는 전략과 실행 방법에 크게 달려 있습니다. 단일 방법이 존재하지 않는 사실에도 불구하고 몇 가지 일반적인 접근법이 있습니다.

뒷면/앞면 (파나마) 조정

이 방법 은 여러 계약 상의 gap을 완화 시키는데 각 계약은 개별적인 배달이 인접한 계약과 원활하게 결합하도록 이동한다. 따라서 만료 시 이전 계약 상의 오픈/클로즈가 일치한다.

파나마 방법의 주요 문제는 트렌드 편향을 도입하는 것을 포함하며, 이는 가격에 큰 변동을 가져올 수 있습니다. 이것은 충분히 역사적 계약에 대한 부정적인 데이터로 이어질 수 있습니다. 또한 값의 절대적 변화로 인해 상대적 가격 차이의 손실이 있습니다. 이것은 수익을 계산하는 것이 복잡하다는 것을 의미합니다.

비례적 조정

비례 조정 접근법은 주식에서 주식 분할을 처리하는 조정 방법과 유사합니다. 연속 계약에서 절대적 전환을 취하기보다는 오래된 결제 (폐기) 가격과 최신 오픈 가격의 비율을 사용하여 역사 계약의 가격을 비례적으로 조정합니다. 이는 비율 수익률 계산의 중단없이 지속적인 흐름을 허용합니다.

비례적 조정의 주요 문제는 절대 가격 수준에 의존하는 모든 거래 전략도 올바른 신호를 실행하기 위해 유사하게 조정되어야한다는 것입니다. 이것은 문제와 오류에 취약한 과정입니다. 따라서 이러한 유형의 연속 흐름은 직접 백테스팅 연구와 달리 요약 통계 분석에만 유용합니다.

롤오버/영원 시리즈

이 접근법의 본질은 각각의 계약의 직선적으로 가중된 비율을 여러 날 동안 취함으로써 각각의 계약들 사이에서 더 원활한 전환을 보장함으로써 연속적인 계약의 계약을 만드는 것입니다.

예를 들어, 5번의 평준화 날을 고려해보자. 1일, P1의 가격은 먼 계약 가격 (F1) 의 80%와 가까운 계약 가격 (N1) 의 20%에 해당한다. 마찬가지로, 2일, 가격은 P2=0.6×F2+0.4×N2이다. 5일, P5=0.0×F5+1.0×N5=N5이 있고 계약은 단지 가까운 가격의 연속이 된다. 따라서, 5일 후 계약은 먼 계약에서 가까운 계약으로 순조롭게 전환된다.

롤오버 방식의 문제는 5일 내내 거래가 필요하기 때문에 거래 비용을 증가시킬 수 있다는 것입니다.

이 문제에 대한 다른 덜 일반적인 접근 방식도 있지만 우리는 여기서 그들을 피할 것입니다.

파이썬과 판다에서 롤-리턴 형식

이 문서의 나머지 부분은 상시 시리즈 방법을 구현하는 데 집중할 것입니다. 이것은 백테스팅에 가장 적합합니다. 전략 파이프 라인 연구를 수행하는 유용한 방법입니다.

우리는 연속적인 가격 시리즈를 생성하기 위해 WTI 원유 nearfar 선물 계약 (기호 CL) 을 꿰매기 위해 있습니다. 작성 시점 (2014년 1월), 가까운 계약은 CLF2014 (일) 이며 먼 계약은 CLG2014 (February) 입니다.

선물 데이터 다운로드 수행 하기 위해 나는 Quandl 플러그인을 사용 했다. 당신의 시스템에 올바른 파이썬 가상 환경을 설정 하 고 터미널에 다음을 입력 하 여 Quandl 패키지를 설치 하는 것을 확인:

import datetime
import numpy as np
import pandas as pd
import Quandl

주요 작업은 퓨처스_롤오버_웨이트 함수에서 수행됩니다. 시작 날짜 (최근 계약의 첫 번째 날짜), 계약 결제 날짜 (시효_데이터), 계약의 기호 및 계약을 롤 오버 할 수 있는 날 수 (전면 5일까지) 의 사전이 필요합니다. 아래 코드는 설명됩니다:

def futures_rollover_weights(start_date, expiry_dates, contracts, rollover_days=5):
    """This constructs a pandas DataFrame that contains weights (between 0.0 and 1.0)
    of contract positions to hold in order to carry out a rollover of rollover_days
    prior to the expiration of the earliest contract. The matrix can then be
    'multiplied' with another DataFrame containing the settle prices of each
    contract in order to produce a continuous time series futures contract."""

    # Construct a sequence of dates beginning from the earliest contract start
    # date to the end date of the final contract
    dates = pd.date_range(start_date, expiry_dates[-1], freq='B')

    # Create the 'roll weights' DataFrame that will store the multipliers for
    # each contract (between 0.0 and 1.0)
    roll_weights = pd.DataFrame(np.zeros((len(dates), len(contracts))),
                                index=dates, columns=contracts)
    prev_date = roll_weights.index[0]

    # Loop through each contract and create the specific weightings for
    # each contract depending upon the settlement date and rollover_days
    for i, (item, ex_date) in enumerate(expiry_dates.iteritems()):
        if i < len(expiry_dates) - 1:
            roll_weights.ix[prev_date:ex_date - pd.offsets.BDay(), item] = 1
            roll_rng = pd.date_range(end=ex_date - pd.offsets.BDay(),
                                     periods=rollover_days + 1, freq='B')

            # Create a sequence of roll weights (i.e. [0.0,0.2,...,0.8,1.0]
            # and use these to adjust the weightings of each future
            decay_weights = np.linspace(0, 1, rollover_days + 1)
            roll_weights.ix[roll_rng, item] = 1 - decay_weights
            roll_weights.ix[roll_rng, expiry_dates.index[i+1]] = decay_weights
        else:
            roll_weights.ix[prev_date:, item] = 1
        prev_date = ex_date
    return roll_weights

무게 매트릭스가 생성 된 후 개별 시간 시리즈에 적용 할 수 있습니다. 주요 기능은 가까운 및 먼 계약을 다운로드하고, 둘 모두를위한 단일 데이터 프레임을 만들고, 롤오버 무게 매트릭스를 구성하고 마지막으로 두 가격의 연속 시리즈를 적절히 가중화합니다.

if __name__ == "__main__":
    # Download the current Front and Back (near and far) futures contracts
    # for WTI Crude, traded on NYMEX, from Quandl.com. You will need to 
    # adjust the contracts to reflect your current near/far contracts 
    # depending upon the point at which you read this!
    wti_near = Quandl.get("OFDP/FUTURE_CLF2014")
    wti_far = Quandl.get("OFDP/FUTURE_CLG2014")
    wti = pd.DataFrame({'CLF2014': wti_near['Settle'],
                        'CLG2014': wti_far['Settle']}, index=wti_far.index)

    # Create the dictionary of expiry dates for each contract
    expiry_dates = pd.Series({'CLF2014': datetime.datetime(2013, 12, 19),
                              'CLG2014': datetime.datetime(2014, 2, 21)}).order()

    # Obtain the rollover weighting matrix/DataFrame
    weights = futures_rollover_weights(wti_near.index[0], expiry_dates, wti.columns)

    # Construct the continuous future of the WTI CL contracts
    wti_cts = (wti * weights).sum(1).dropna()

    # Output the merged series of contract settle prices
    wti_cts.tail(60)

출력은 다음과 같습니다.

2013-10-14 102.230 2013-10-15 101.240 2013-10-16 102,330 2013-10-17 100.620 2013-10-18 100.990 2013-10-21 99.760 2013-10-22 98,470 2013-10-23 97.000 2013-10-24 97.240 2013-10-25 97.950 ... ... 2013-12-24 99.220 2013-12-26 99.550 2013-12-27 100.320 2013-12-30 99.290 2013-12-31 98,420 2014-01-02 95.440 2014-01-03 93.960 2014-01-06 93.430 2014-01-07 93.670 2014-01-08 92,330 길이: 60, d형: float64

이제 두 계약에 걸쳐 연속적인 시리즈가 있음을 알 수 있습니다. 다음 단계는 백테스팅 필요에 따라 다양한 해에 걸쳐 여러 배달을 수행하는 것입니다.


더 많은