파이썬에서의 백 트레이싱 트레이딩 전략


QuantStart.


빠르게 성장하는 소매점 퀀텀 트레이더 커뮤니티를 지원하는 Quantcademy 개인 회원 포털에 가입하십시오. 당신은 당신의 가장 중요한 퀀트 트레이딩 질문에 대답 할 준비가되어있는 지식이 풍부하고 마음이 맞는 퀀트 트레이더 그룹을 찾을 수 있습니다.


퀀트 트레이딩에 관한 나의 eBook을 확인해보십시오. 여기서 저는 파이썬 툴로 수익성 높은 체계적인 트레이딩 전략을 만드는 법을 가르쳐드립니다.


Python 및 R을 사용하여 시계열 분석, 기계 학습 및 베이지안 통계를 사용하는 고급 거래 전략에 관한 새로운 전자 책을 살펴보십시오.


Frank Smietana, 2017 년 7 월 18 일


이 기사에서는 QuantStart의 전문 게스트 기고가 중 한 명인 Frank Smietana가 Python 오픈 소스 백 테스팅 소프트웨어 환경을 설명하고 자신의 프로젝트 요구에 적합한 백 테스팅 프레임 워크에 대한 조언을 제공합니다.


Backtesting은 STS (Systematic Trading Strategy) 프로덕션 프로세스에서 전략 개발과 배포 (라이브 거래) 사이에 가장 중요한 역할을합니다. 전략에 결함이있는 경우 철저한 백 테스팅을 통해이 사실을 알릴 수 있기 때문에 손실 전략이 배포되는 것을 방지 할 수 있습니다.


트레이딩 시뮬레이션 및 라이브 거래를 비롯한 여러 관련 기능이 백 테스트와 겹칩니다. 백 테스트는 기록 데이터를 사용하여 STS 성능을 계량합니다. 트레이딩 시뮬레이터는 거래의 트리거링과 가격대 성능을 가시화함으로써 한 걸음 더 나아가서 백 테스팅을 수행합니다. 시뮬레이트 / 라이브 거래는 테스트 된 STS를 실시간으로 배포합니다. 즉, 거래 신호, 주문 생성, 브로커에게 주문 라우팅, 주문 실행과 함께 위치 유지 등이 있습니다.


대부분의 프레임 워크는 일부 실시간 거래 기능을 포함하여 백 테스팅을 뛰어 넘습니다. 선호하는 브로커 및 데이터 소스와 함께 작동하는 백 테스팅 프레임 워크에서 배포하려는 경우 편리합니다. Quantopian / Zipline은 한 단계 더 나아가 완벽하게 통합 된 개발, 백 테스팅 및 배포 솔루션을 제공합니다.


파이썬 커뮤니티는 6 개 이상의 오픈 소스 백 테스팅 프레임 워크를 사용할 수있어 잘 지원됩니다. 그러나 그들은 개발 및 문서화의 다양한 단계에 있습니다. 오픈 소스 백 테스팅 프레임 워크를 구축하는 팀에서 일하는 것을 즐긴다면 Github repos를 확인하십시오.


백 테스팅 프레임 워크를 평가하기 전에 STS의 요구 사항을 정의하는 것이 좋습니다.


어떤 종류의 자산을 거래하고 있습니까? 대부분의 프레임 워크가 YahooFinance를 통해 미국 주식 데이터를 지원하지만 전략에 파생 상품, ETF 또는 EM 증권이 포함되어 있으면 프레임 워크에서 데이터를 가져 오거나 제공해야합니다. 자산 클래스 범위는 데이터를 뛰어 넘습니다. 프레임 워크가 유한 길이의 미래 및 옵션을 처리하고 롤오버 거래를 자동으로 생성 할 수 있습니까? 비 유동성 시장은 대량 주문을 할 때 얼마나 현실적인 가정을해야합니까?


STS가 구축 한 데이터 빈도 및 세부 정보는 무엇입니까? 모든 틱이나 입찰 / 요청을 요구하는 거래 시스템은 5 분 또는 매시간 간격과는 매우 다른 데이터 관리 문제를 가지고 있습니다. 헤지 펀드 및 HFT 매장은 데이터 양과 빈도를 처리하기 위해 견고하고 확장 가능한 백 테스팅 프레임 워크를 구축하는 데 상당한 투자를했습니다. 일부 플랫폼은 S & P 주식과 같은 다양한 자산 클래스에 대해 1 분의 해결책으로 풍부하고 깊은 데이터 세트를 제공합니다.


STS는 어떤 주문 유형을 요구합니까? 최소, 한계, 정지 및 OCO가 프레임 워크에 의해 지원되어야합니다.


지원 수준 & amp; 필요한 서류. 초기 단계의 프레임 워크는 설명서가 부족하고 커뮤니티 보드 이외의 지원은 거의 없습니다.


Backtesting Framework의 구성 요소.


데이터 및 STS 수집 : 수집 구성 요소는 STS 스크립트 / 정의 파일을 사용하고 테스트에 필요한 데이터를 제공합니다. 프레임 워크가 backtesting 전에 어떤 STS를 다시 코딩해야한다면, 프레임 워크는 STS 테스트 속도를 높이기 위해 가장 유명한 기술 지표에 대한 준비된 기능을 지원해야합니다. 사용자는 프레임 워크에서 제공하는 항목 또는 가져올 수있는 항목을 기준으로 기간을 백 테스트 할 기간을 결정합니다.


성능 테스트는 STS 논리를 요청 된 기록 데이터 창에 적용하고 광범위한 위험 & amp; 최대 삭감, Sharpe & Sortino 비율을 포함한 성능 메트릭. 대부분의 모든 프레임 워크는 주식 곡선 및 deciled 통계를 포함하여 상당한 수의 시각화 기능을 지원합니다.


최적화는 STS 프로세스에서 컴퓨팅 자원의 상당 부분을 필요로하는 경향이 있습니다. STS에서 최적화가 필요한 경우 확장 가능한 분산 / 병렬 처리를 지원하는 프레임 워크에 중점을 둡니다.


기술 지표를 사용하여 개발 된 전략의 맥락에서 시스템 개발자는 각 지표에 대해 최적의 매개 변수 집합을 찾으려고 시도합니다. 가장 간단하게, 최적화는 6 일과 10 일 이동 평균 크로스 오버 STS가 1에서 20 사이의 다른 기간 조합보다 역사적인 테스트 데이터에서 더 많은 이익을 축적했음을 알 수 있습니다. 이미이 간단한 예제를 사용하면 20 * 20 = 400 매개 변수 조합이 계산 & amp; 순위.


포트폴리오 컨텍스트에서 최적화는 포트폴리오의 모든 자산에 대한 최적의 가중치 (단락 및 레버리지 된 수단 포함)를 찾으려고합니다. 주기적으로 포트폴리오가 재조정되어 최적화 된 가중치와 일치하도록 필요한 포트폴리오 보유 물의 매매가 이루어집니다.


위치 조정은 최적화의 추가 사용으로 시스템 개발자가 STS 및 포트폴리오 성능에 대한 레버리지 및 동적 위치 결정의 영향을 시뮬레이션 및 분석 할 수 있습니다.


파이썬에 대한 6 가지 백 테스팅 프레임 워크.


오픈 소스 Python 백 테스팅 플랫폼의 표준 기능에는 다음이 포함됩니다.


이벤트 주도 매우 유연하고 제한없는 라이센스 사전 정의 된 기술 지표의 적절한 수집 표준 성능 메트릭 계산 / 시각화 /보고 기능.


PyAlgoTrade.


PyAlgoTrade는 종이 및 라이브 거래 기능과 함께 완전하게 문서화 된 백 테스팅 프레임 워크입니다. 데이터 지원에는 Yahoo! Finance, Google Finance, NinjaTrader 및 Quandl과 같은 모든 유형의 CSV 기반 시계열. 지원되는 주문 유형에는 Market, Limit, Stop 및 StopLimit가 포함됩니다.


PyAlgoTrade는 Bitstamp를 통한 Bitcoin 거래 및 실시간 Twitter 이벤트 처리를 지원합니다.


bt - 파이썬 백 테스팅.


bt "는 복잡한 거래 전략의 신속한 개발을 촉진하기 위해 쉽게 테스트 할 수 있고, 재사용이 가능하며, 유연한 전략 논리 블록을 만드는 것을 목표로합니다."


이 프레임 워크는 특히 자산 가중치와 포트폴리오 재조정을위한 포트폴리오와 함께 포트폴리오 기반 STS를 테스트하는 데 적합합니다. 다른 시간 빈도 또는 대체 자산 가중치를 실행하는 전략을 수정하면 코드를 미세 조정할 수 있습니다. bt는 파이썬을위한 파이낸셜 함수 라이브러리 인 ffn 위에 구축되었습니다.


백 트레이더.


이 플랫폼은 블로그와 질문 및 기능 요청 게시를위한 활발한 온라인 커뮤니티와 함께 ​​매우 잘 문서화되어 있습니다. Backtrader는 CSV 파일, Pandas DataFrames, 블레이즈 반복기 및 세 브로커의 실시간 데이터 피드를 비롯한 다양한 데이터 형식을 지원합니다. 이러한 데이터 피드는 동시에 액세스 할 수 있으며 서로 다른 시간대를 나타낼 수도 있습니다. 지원되는 중개인은 FX 거래를위한 Oanda 및 대화 형 중개인 및 비주얼 차트를 통한 다중 자산 클래스 거래를 포함합니다.


pysystemtrade.


pysystemtrade 개발자 인 Rob Carver는 왜 또 다른 Python 백 테스팅 프레임 워크를 만들고 프레임 워크 개발에 대한 논쟁에 착수했는지 토론하는 훌륭한 글을 가지고 있습니다. pysystemtrade에 대한 백 테스팅 프레임 워크는 Rob의 책 "Systematic Trading"에서 논의됩니다.


pysystemtrade는 최적화 및 조정 기술이 포함 된 완전한 기능을 갖춘 백 테스터와 인터랙티브 브로커 (Interactive Brokers)를 통한 완전 자동 선물 거래를 비롯한 다양한 로드맵 기능을 나열합니다. 오픈 소스 참여자를 환영합니다.


Zipline은 종이 및 라이브 거래 기능을 갖춘 알고리즘 트레이딩 시뮬레이터입니다. Zipline은 브라우저 기반의 IPython 노트북 인터페이스를 통해 액세스 할 수 있으며 명령 줄 도구 대신 사용할 수있는 쉬운 방법을 제공합니다. Quantopian이 지원하고 개발 한 Zipline은 독립형 백 테스팅 프레임 워크 또는 완전한 Quantopian / Zipline STS 개발, 테스트 및 배포 환경의 일부로 사용할 수 있습니다. Zipline은 10 년간의 역사적인 미국 주식 데이터 및 많은 데이터 가져 오기 옵션을 제공합니다.


QSTrader는 실시간 거래 기능이있는 백 테스팅 프레임 워크입니다. 퀀트 스타트의 설립자 인 마이클 홀즈 무어 (Michael Halls-Moore)는 소매점 퀀트 헤지 펀드와 기관 퀀트 헤지 펀드의 요구를 충족시킬 수있는 강력하고 확장 가능한 플랫폼을 구축하려는 의도로 QSTrader를 출시했습니다. Qstrader는 현재 다양한 시간 범위에서 OHLCV "바"해상도 데이터를 지원하지만 진드기 데이터를 사용할 수 있습니다.


백 테스팅과 라이브 거래는 모두 이벤트 중심으로 이루어 지므로 연구에서 테스트 및 최종 거래에 이르는 전략의 전환을 간소화합니다. 핵심 전략 / 포트폴리오 코드는 두 배포 모두에서 종종 동일합니다.


Qstrader의 주요 이점은 모듈성이므로 특정 위험 또는 포트폴리오 관리 요구 사항을 가진 사람들을 위해 광범위한 사용자 정의 코드를 사용할 수 있습니다.


Backtest 채택.


(잘하면 수익성있는) STS 개발에 대한 보상에 집중하고 전략을 철저히 테스트하는 데 충분한 시간과 자원을 투자하지 않고 자금이 투입된 계좌를 배포하는 것은 인류의 본성입니다. 그러나 백 테스팅은 결함있는 전략을 배치하고 거래 자본을 잃지 않도록하는 게이트 키퍼 일뿐만 아니라 STS 개발 프로세스에 알릴 수있는 여러 가지 진단 기능을 제공합니다. 예를 들어, 두 개의 서로 다른 시간 프레임에 걸쳐 동일한 STS를 테스트하고, 자산 상관 관계의 맥락에서 전략의 최대 축소를 이해하며, 여러 지역에 걸쳐 자산 할당을 백 테스팅하여 더 똑똑한 포트폴리오를 만들 수 있습니다.


향후 게시물에서는 Python이 아닌 환경의 백 테스팅 프레임 워크와 예측 거래 모델 백 테스팅을위한 부트 스트래핑 및 잭 나이프와 같은 다양한 샘플링 기술의 사용에 대해 다룰 예정입니다.


양적 거래 시작하기?


QuantStart 목록을 구독해야하는 3 가지 이유 :


1. 퀀트 트레이딩 레슨.


계량 거래를 시작하는 데 도움이되는 힌트와 팁으로 가득한 무료 10 일간 코스에 즉시 액세스 할 수 있습니다!


2. 모든 최신 내용.


매주 나는 퀀트 스타트에서 모든 활동의 포장을 보내드릴 것입니다. 그래서 당신은 결코 다시 글을 놓치지 않을 것입니다.


현실감 넘치는 퀀 트레이딩 팁.


QuantStart.


빠르게 성장하는 소매점 퀀텀 트레이더 커뮤니티를 지원하는 Quantcademy 개인 회원 포털에 가입하십시오. 당신은 당신의 가장 중요한 퀀트 트레이딩 질문에 대답 할 준비가되어있는 지식이 풍부하고 마음이 맞는 퀀트 트레이더 그룹을 찾을 수 있습니다.


퀀트 트레이딩에 관한 나의 eBook을 확인해보십시오. 여기서 저는 파이썬 툴로 수익성 높은 체계적인 트레이딩 전략을 만드는 법을 가르쳐드립니다.


Python 및 R을 사용하여 시계열 분석, 기계 학습 및 베이지안 통계를 사용하는 고급 거래 전략에 관한 새로운 전자 책을 살펴보십시오.


2014 년 1 월 16 일 Michael Halls-Moore 작성


Backtesting은 과거 실적을 확인하기 위해 과거 데이터에 거래 전략 아이디어를 적용하는 연구 프로세스입니다. 특히 백 테스터는 전략의 미래 성과에 대해 어떠한 보증도하지 않습니다. 그러나 이들은 전략 파이프 라인 연구 프로세스의 필수 구성 요소이므로 프로덕션 환경에 배치되기 전에 전략을 필터링 할 수 있습니다.


이 기사 (그리고 그 뒤에 나오는 기사)에서는 파이썬으로 작성된 기본적인 객체 지향적 인 백 테스팅 시스템이 설명 될 것이다. 이 초기 시스템은 주로 "교육 지원"으로, 백 테스팅 시스템의 여러 구성 요소를 시연하는 데 사용됩니다. 기사를 진행하면서보다 정교한 기능이 추가 될 것입니다.


Backtesting 개요.


강력한 백 테스팅 시스템을 설계하는 과정은 매우 어렵습니다. 알고리즘 트레이딩 시스템의 성능에 영향을 미치는 모든 구성 요소를 효과적으로 시뮬레이션하는 것은 어렵습니다. 데이터 세분성 부족, 브로커의 주문 라우팅 불투명, 주문 대기 시간 및 기타 요인들이 백 테스트 된 성능 대 전략의 "진정한"성능을 변경하기 위해 공모합니다.


백 테스트 시스템을 개발할 때 성능을 평가하는 데 중요한 요소가 더 많이 발견됨에 따라 지속적으로 "처음부터 다시 작성"하려는 경향이 있습니다. 역 테스팅 시스템은 이제까지 완성되지 않았으며 개발 중에 시스템에 충분한 요소가 포착되었다는 판단을 내려야합니다.


이러한 우려를 염두에두고 여기에 제시된 백 테스터는 다소 단순 할 것이다. 추가 문제 (포트폴리오 최적화, 리스크 관리, 거래 비용 처리)를 모색 할 때 백 테스터는 더욱 강력해질 것입니다.


역 테스팅 시스템의 유형.


일반적으로 두 가지 유형의 백 테스팅 시스템이 있습니다. 첫 번째는 연구 중심이며 초기 단계에서 주로 사용됩니다. 이 단계에서는 더 심각한 평가를 위해 많은 전략을 테스트합니다. 이러한 연구 백 테스팅 시스템은 Python, R 또는 MatLab로 작성되는 경우가 많습니다. 개발 속도가이 단계의 실행 속도보다 더 중요하기 때문입니다.


두 번째 유형의 백 테스팅 시스템은 이벤트 기반입니다. 즉, 거래 실행 시스템 자체와 유사 (동일하지 않은 경우)하는 실행 루프에서 백 테스트 프로세스를 수행합니다. 전략의보다 철저한 평가를 제공하기 위해 시장 데이터 및 주문 실행 프로세스를 현실적으로 모델링합니다.


후자의 시스템은 종종 실행 속도가 필수적인 C ++ 또는 Java와 같은 고성능 언어로 작성됩니다. 저주파 전략 (여전히 intraday 임에도 불구하고)의 경우, Python은이 맥락에서 사용하기에 충분합니다.


객체 지향 연구 Backtester in Python.


객체 지향 연구 기반 백 테스팅 환경의 설계 및 구현에 대해 지금 논의 할 것입니다. 객체 지향은 다음과 같은 이유로 소프트웨어 설계 패러다임으로 선택되었습니다.


각 구성 요소의 인터페이스를 미리 지정할 수 있으며 프로젝트가 진행됨에 따라 각 구성 요소의 내부를 수정 (또는 교체) 할 수 있습니다. 인터페이스를 미리 지정하면 각 구성 요소의 작동 방식을 효과적으로 테스트 할 수 있습니다 (단위 테스트를 통해). 시스템 새로운 구성 요소는 상속 또는 구성에 의해 다른 구성 요소에 또는 추가로 구성 될 수 있습니다.


이 단계에서 백 테스터는 실제 시장의 정확성을 희생하면서 구현의 용이함과 합리적인 수준의 유연성을 위해 설계되었습니다. 특히이 백 테스터는 단일 계측기에서만 작동하는 전략을 처리 할 수 ​​있습니다. 나중에 백 테스터는 일련의 도구를 처리하도록 수정됩니다. 초기 백 테스터의 경우 다음 구성 요소가 필요합니다.


전략 - 전략 클래스는 막대의 팬더 데이터 프레임, 즉 특정 주파수에서 OHLCV (Open-High-Low-Close-Volume) 데이터 포인트의 목록을받습니다. 전략은 신호의 목록을 생성합니다. 신호 목록은 타임 스탬프와 세트 $ \ $의 요소로 구성되어 각각 긴 신호, 보류 신호 또는 단락 신호를 나타냅니다. 포트폴리오 - Backtesting 작업의 대부분은 Portfolio 클래스에서 발생합니다. 위에서 설명한대로 일련의 신호를 받고 현금 구성 요소에 대해 할당 된 일련의 위치를 ​​만듭니다. 포트폴리오 오브젝트의 역할은 주식 거래 곡선을 생성하고 기본 거래 비용을 통합하며 거래를 추적하는 것입니다. 성능 - 성능 개체는 포트폴리오를 취하여 성능에 대한 통계 집합을 생성합니다. 특히 위험 / 수익 특성 (Sharpe, Sortino 및 Information Ratios), 무역 / 수익 메트릭스 및 수익 감소 정보를 출력합니다.


누락 된 것은 무엇입니까?


이 백 테스터는 포트폴리오 / 위험 관리, 실행 처리 (즉, 제한 주문 없음)에 대한 언급을 포함하지 않으며 정교한 거래 비용 모델링을 제공하지도 않습니다. 이 단계에서는 많은 문제가되지 않습니다. 이를 통해 우리는 객체 지향 백 테스터 및 팬더 / NumPy 라이브러리를 만드는 프로세스에 익숙해 질 수 있습니다. 시간이 지나면 개선 될 것입니다.


이행.


이제 각 객체의 구현을 개괄적으로 설명합니다.


Strategy 객체는 예측, 평균 복귀, 모멘텀 및 변동성 전략을 처리하기 때문에이 단계에서는 매우 일반적이어야합니다. 여기서 고려되는 전략은 항상 시계열을 기반으로합니다 (예 : '가격 중심'). 이 백 테스터에 대한 초기 요구 사항은 파생 된 전략 클래스가 진드기 (trade-by-trade prices) 또는 주문 - 서적 데이터가 아닌 입력으로 막대 (OHLCV) 목록을 허용한다는 것입니다. 따라서 여기서 고려되는 가장 정밀한 입도는 1 초의 막대 일 것입니다.


Strategy 클래스는 항상 신호 권장 사항을 생성합니다. 즉, 장 / 단락 또는 지위를 유지한다는 의미에서 포트폴리오 인스턴스에 조언을 제공합니다. 이러한 유연성 덕분에 일련의 신호를 제공하는 여러 가지 전략 "조언자"를 만들 수 있습니다. 이 어드바이저는 입력 된 실제 위치를 결정하기 위해보다 고급 Portfolio 클래스가 수락 할 수있는 신호 세트를 제공합니다.


클래스의 인터페이스는 추상 기본 클래스 방법론을 활용하여 시행됩니다. 추상 기본 클래스는 인스턴스화 할 수없는 객체이므로 파생 클래스 만 만들 수 있습니다. 파이썬 코드는 backtest. py라는 파일에 아래에 나와 있습니다. Strategy 클래스는 모든 하위 클래스가 generate_signals 메소드를 구현해야합니다.


Strategy 클래스가 직접적으로 인스턴스화되는 것을 방지하려면 (추상 클래스이므로!) abc 모듈에서 ABCMeta 및 abstractmethod 객체를 사용해야합니다. __metaclass__라는 클래스의 속성을 ABCMeta와 동일하게 설정 한 다음 generate_signals 메서드를 abstractmethod 데코레이터로 장식합니다.


위의 인터페이스는 간단하지만 각 클래스의 특정 유형에 대해이 클래스가 상속 될 때 더욱 복잡해집니다. 궁극적으로이 설정에서 전략 클래스의 목표는 포트폴리오에 전송할 각 악기에 대한 롱 / 숏 / 홀드 신호 목록을 제공하는 것입니다.


Portfolio 클래스는 거래 논리의 대부분이 상주 할 곳입니다. 이 연구의 경우 포트폴리오는 포지 사이징, 위험 분석, 거래 비용 관리 및 집행 처리 (즉, 시장 개방, 시장 마감 주문) 결정을 담당합니다. 나중 단계에서 이러한 작업은 별도의 구성 요소로 나뉩니다. 지금 그들은 한 클래스에 들어갈 것입니다.


이 클래스는 팬더를 충분히 활용하고 라이브러리가 엄청난 양의 시간을 절약 할 수있는 훌륭한 예를 제공합니다. 특히 "보일러 플레이트 (boilerplate)"데이터 랭킹과 관련하여. 옆으로, 팬더와 NumPy의 주요 트릭은 for d in을 사용하여 모든 데이터 세트를 반복하지 않는 것입니다. 통사론. 이것은 NumPy (팬더의 기반이되는)가 벡터화 된 연산에 의한 루핑을 최적화하기 때문입니다. 따라서 판다를 사용할 때 직접 반복을 거의 볼 수 없습니다 (있는 경우).


포트폴리오 클래스의 목표는 궁극적으로 거래의 순서와 성과 곡선에 의해 분석 될 형평성 곡선을 생성하는 것입니다. 이를 달성하기 위해서는 Strategy 객체의 거래 추천 목록을 제공해야합니다. 나중에 이것은 전략 객체의 그룹이 될 것입니다.


포트폴리오 클래스는 거래 신호의 특정 집합에 대해 자본을 배치하는 방법, 거래 비용을 처리하는 방법 및 어떤 형태의 주문을 활용할 것인지를 알려야합니다. Strategy 객체는 데이터 막대에서 작동하므로 주문 실행시 얻은 가격과 관련하여 가정해야합니다. 어떤 막대의 고가 / 저가가 선험적으로 알려지지 않았기 때문에 거래를 위해 공개 및 마감 가격을 사용할 수만 있습니다. 실제로 시장 질서를 사용할 때 이러한 특정 가격 중 하나에서 주문이 채워질 것이라는 것을 보장하는 것은 불가능하기 때문에 근사치 일 것입니다.


이 백 테스터는 주문에 대한 가정에 덧붙여 마진 / 중개 제약 조건의 모든 개념을 무시할 것이며 유동성 제약없이 자유롭게 모든 수단에서 길고 짧게 갈 수 있다고 가정 할 것입니다. 이것은 분명히 비현실적인 가정이지만, 나중에 풀 수있는 것이다.


다음 목록은 backtest. py를 계속합니다.


이 단계에서 전략 및 포트폴리오 추상 기본 클래스가 도입되었습니다. 우리는 작업중인 "장난감 전략"을 산출하기 위해 이러한 클래스의 구현에서 파생 된 구현을 생성 할 수있는 위치에 있습니다.


RandomForecastStrategy라는 전략의 하위 클래스를 생성하여 시작합니다. 이 전략의 유일한 작업은 임의로 선택된 길고 짧은 신호를 생성하는 것입니다. 이것은 분명 무의미한 거래 전략이지만, 객체 지향 백 테스팅 프레임 워크를 시연함으로써 우리의 요구를 충족시킬 것입니다. 따라서 다음과 같이 random_forecast. py라는 새로운 파일을 임의의 예측 자 목록과 함께 시작합니다.


이제 "구체적인"예측 시스템이 생겼으므로 Portfolio 객체의 구현을 만들어야합니다. 이 객체는 대다수의 백 테스팅 코드를 포함합니다. 두 개의 개별 DataFrames를 생성하기 위해 설계되었습니다. 첫 번째 프레임은 특정 막대에있는 각 악기의 양을 저장하는 데 사용되는 위치 프레임입니다. 두 번째 포트폴리오에는 실제로 초기 자본을 가정 할 때 각 막대의 모든 보유 자산의 시장 가격과 현금 집계가 포함됩니다. 이것은 궁극적으로 전략 성과를 평가할 수있는 주식 곡선을 제공합니다.


Portfolio 객체는 인터페이스에서 매우 유연하지만 트랜잭션 비용, 시장 주문 등을 처리하는 방법을 고려할 때 구체적인 선택이 필요합니다. 이 기본 예제에서는 제한없이 또는 길게 쉽게 계측기를 갈 수 있다고 생각했습니다. 마진, 바의 공개 가격에서 직접 매매 또는 거래 비용 없음 (미끄러짐, 수수료 및 시장 충격 포함) 및 각 거래에 대해 직접 구매할 재고 수량을 지정합니다.


다음은 random_forecast. py 목록의 연속입니다.


이것은 그러한 시스템을 기반으로 한 주식 곡선을 생성하는 데 필요한 모든 것을 제공합니다. 마지막 단계는 모든 것을 __main__ 함수로 묶는 것입니다.


프로그램의 출력은 다음과 같습니다. 선택하신 날짜 범위와 사용 된 임의의 시드에 따라 귀하의 결과가 아래의 산출물과 다를 수 있습니다.


이 예에서 전략은 돈을 잃어 버렸습니다. 이것은 예측 자의 확률 적 특성을 고려할 때 놀랄 일이 아닙니다! 다음 단계는 Portfolio 인스턴스를 허용하고 전략을 필터링하는 결정의 기반이 될 성능 메트릭 목록을 제공하는 Performance 개체를 만드는 것입니다.


또한 Portfolio 객체를 개선하여 거래 비용 (예 : Interactive Brokers 커미션 및 미끄러짐)을보다 현실적으로 처리 할 수 ​​있습니다. Strategy 객체에 예측 엔진을 직접 포함시켜 더 나은 결과를 얻을 수 있습니다. 다음 기사에서 우리는 이러한 개념을보다 깊이 탐구 할 것입니다.


양적 거래 시작하기?


QuantStart 목록을 구독해야하는 3 가지 이유 :


1. 퀀트 트레이딩 레슨.


계량 거래를 시작하는 데 도움이되는 힌트와 팁으로 가득한 무료 10 일간 코스에 즉시 액세스 할 수 있습니다!


2. 모든 최신 내용.


매주 나는 퀀트 스타트에서 모든 활동의 포장을 보내드릴 것입니다. 그래서 당신은 결코 다시 글을 놓치지 않을 것입니다.


현실감 넘치는 퀀 트레이딩 팁.


Jon V.


빅 데이터. 시작. 거래.


빅 데이터. 시작. 거래.


파이썬에서 백 테스팅 시스템 구축 : 또는 두 시간 동안 $ 3400를 잃어 버렸습니다.


백 테스트 시스템을 구축하는 것은 실제로 매우 쉽습니다. 망치기 쉽다는 뜻입니다. 거기에는 훌륭한 라이브러리가 많이 있지만 (그리고 우리는 어느 시점에서 그들을 통해 갈 것입니다.), 저는 항상 이것을 조정하여 미세 조정하는 것을 좋아합니다.


내가 본 모든 백 테스트 시스템에서 우리는 두 가지 범주가 있다고 가정 할 수 있습니다.


오늘 우리는 for-loopers에 대해 이야기 할 것입니다.


"for-loopers"는 가장 좋아하는 백 테스터 유형입니다. 그들은 쓰는 것이 쉽지 만 확장하기에 재미가 있지만 중요한 흐름을 보입니다. 슬프게도 많은 백 테스터가 "for-loopers"입니다 (ps : 이것에 대해 더 나은 이름을 찾아야합니다!).


for-looper는 어떻게 작동합니까? for 루프를 사용하면 (추측 할 수 있듯이). 그것은 다음과 같습니다.


아주 간단한 권리? 이것은 하나의 백 테스팅 시스템이 작동하는 방법이며, 이는 기세 전략을 실행합니다 :


문제는 무엇입니까?


(수평 적으로) 확장하기가 어렵습니다. 여러분의 apply_strategy ()가 백 테스팅과 프로덕션 작업을 계속하기 위해 많은 작업이 필요합니다. 동일한 프로그래밍 언어로 모든 것을 갖추어야합니다.


이것들을 하나씩 차례로 살펴 봅시다.


확장 성. 저는 몇 주 전에 내 등반 전략 중 하나를 최적화하기 위해 등산 알고리즘을 실험했습니다. 아직 실행 중입니다. 2 주 후. 그리고 저는 생계를 유지할 수있는 확장 가능한 시스템을 구축합니다. 왜 아직도 실행 중입니까? 멀티 프로세싱, 디스코, 생산자 / 소비자 (ZeroMQ 사용) 또는 스레드 만 사용하여 속도를 높일 수 있지만 일부 문제는 "당황스럽지 않습니다"(예, 실제로 작성한 단어가 아니라 실제 용어입니다). 이처럼 백 테스터를 확장하는 작업량 (특히 동일한 기계 학습을 수행하려는 경우)은 엄청납니다. 당신은 할 수는 있지만 잘못된 길입니다.


생산과 백 테스팅이 동기화되었습니다. 내가 이것에 물린 시대. 내가 잃어버린 거래를 상기 할 수 있습니다. "나는 왜이 거래에 참가 했습니까?" 또는 나의 오래된 시간 좋아하는 "왜 지금 멈춰 멈춤이 적용 되었습니까?".


이야기 시간 : 나는 전략을 최적화하고 항상 이익을 확보하기 위해 무역이 이익을 얻은 후에 후행 중지를 할 수 있다면 어떤 일이 일어날지를 알기 위해 백 테스터를 운영하기위한 아이디어를 가지고있었습니다. Backtesting은 수익의 13 % 증가와 매 매 거래 손실로 인해 매력적이었습니다. 나는 내 고향이 2 시간 만에 3400 달러를 잃은 후에 그것을 알아 냈습니다 (매우 비싼 교훈).


apply_strategy를 동기화 상태로 유지하는 것은 매우 어렵고 분산 방식으로 수행하려는 경우 거의 불가능합니다. 그리고 "거의"동일한 두 가지 버전의 전략을 갖고 싶지는 않습니다. 3400 달러를 절약하지 않는 한.


다른 언어 사용하기 파이썬을 좋아합니다. 그리고 얼랭. 그리고 Clojure. 그리고 J. And C. And R. 그리고 Ruby (실제로 Ruby를 싫어합니다.) 내 시스템에서 다른 언어의 힘을 활용할 수 있기를 바랍니다. 나는 잘 검증 된 라이브러리가 있고 거기에 커다란 커뮤니티가있는 R의 전략을 시험해보고 싶다. Erlang이 내 코드와 C를 확장하여 데이터를 정리하려고합니다. 당신이 성공하기를 원한다면 (거래뿐만 아니라), 이용 가능한 모든 자원을 편견없이 사용할 수 있어야합니다. R 개발자와 어울리는 델타 헤지 펀드 및 시각화 방법, Sharpe 비율이 거짓말 일 수있는 이유에 대해 많은 것을 배웠습니다. 모든 언어는 다른 군중을 가지고 있으며 많은 사람들이 시스템에 아이디어를 부어 주길 원합니다. 다른 언어로 apply_strategy를 시도하면 (2)와 함께 행운을 빕니다.


너 지금 확신 해? 글쎄, for-loopers가 초기 테스트를 수행하는 좋은 방법이라는 것을 당신에게 확신시키려는 것이 아닙니다. 그것은 내가 시작한 방법이며, 많은 전략을 위해 그들을 파이프 라인으로 보내지 않습니다. "더 나은"방법 (밤에 잠을 잘 수 있도록)은 이벤트 생성기입니다.


다음으로 올라와, 가장 간단한 (그러나 가장 성공적인) 백 테스터를 나누고 토론합니다!


더 많은 피드백이 있으면 jonromero에서 ping을하거나 뉴스 레터에 가입하십시오.


법적 근거. 이것은 실험 및 재미를위한 알트 레이팅 플랫폼을 구축하는 방법에 대한 엔지니어링 자습서입니다. 여기에있는 모든 제안은 재정 조언이 아닙니다. 거래 조언을 따랐거나이 시스템을 프로덕션 환경에 배치했기 때문에 돈을 잃어버린다면이 임의의 블로그 (및 / 또는 저)를 비난 할 수 없습니다. 자신의 책임하에 즐기십시오.


기계적인 Forex.


기계 거래 전략을 사용하여 외환 시장에서 거래합니다.


파이썬에서 트레이싱 시스템 Backtesting : 정말 좋은 선택은 아닙니다.


파이썬 언어는 매우 다양하고 사용하기 쉽고 편리합니다. 사용 가능한 아이디어를 코드에 넣는 데 걸리는 시간은이 언어의 다양성에 대한 논의가 없습니다. csv 파일을로드하고 싶습니까? 지표 계산을 수행하고 싶습니까? 일련의 값을 플롯하고 싶습니까? 이 모든 일은 파이썬에서 몇 줄의 코드로 끝낼 수 있지만 C와 포트란 같은 언어로 같은 일을하는 것은 수천 줄의 줄이 아니라면 확실히 전체 페이지를 차지할 것입니다. 그러나 파이썬에는 특히 이벤트 기반의 백 테스트와 관련하여 거래 전략을 테스트하는 데있어서 좋지 않은 선택이되는 몇 가지 단점이 있습니다. 이 포스트에서 필자는 파이썬이 백 테스트 엔진을 코딩하는 데 나쁜 선택이 될 수있는 여러 가지 사항을 살펴보고 왜 & # 8211; 훨씬 더 긴 코딩 시간에도 불구하고 & # 8211; 저수준 언어 사용의 이점은 특정 유형의 테스트에 대한 문제점을 훨씬 능가 할 것입니다. 아래 테스트를 수행하려면 여기에서 코드를 다운로드하십시오.


일반적으로 백 테스트를 수행 할 수있는 두 가지 주요 방법이 있다는 것을 이해하는 것이 중요합니다. 첫 번째는 벡터 기반 백 테스트라고하며 두 번째는 이벤트 기반 백 테스트라고합니다. 벡터 기반 백 테스트를 수행 할 때 거래 결정을 나타내는 벡터를 계산 한 다음 벡터 작업을 수행하여 이러한 변수에서 성과를 추출합니다. 이동 평균 크로스 오버 전략을 벡터 방식으로 백 테스트하고 싶은 경우, 먼저 모든 이동 평균 값이있는 벡터를 계산 한 다음 이동 평균이 더 큰지 또는 작은 지와 함께 부울을 포함하는 두 번째 벡터를 만듭니다. 그런 다음이 값을 사용하여 신호가있는 위치에 따라 형평성을 나타내는 벡터를 계산할 수 있습니다. 벡터 기반 백 테스트는 일반적으로 벡터를 계산하여 모든 작업을 수행 한 다음이 벡터를 사용하여 테스트 결과를 생성합니다. 이는 특정 유형의 시스템에 대한 백 테스트를 수행하는 수학적으로 효율적인 방법입니다.


그러나 벡터 기반 테스트 (이후 게시물에 대해 논의하기 위해 남겨 두겠다)를 사용하면 많은 사람들이 대안을 이끌고 이벤트 기반 테스트를하는 데 많은 단점이 있습니다. 이벤트 기반의 백 테스트에서 사용 가능한 거래 데이터를 반복하고 알고리즘을 각 시점에서 사용할 수있는 모든 정보를 전달합니다. 이것은 실제 시장 실행에 가장 근접한 백 테스트 방법입니다. 전략은 동일한 작업을 수행하고, 데이터를 수신하고 각 시간 단위에 대해 의사 결정을 내릴 때 수행하기 때문입니다. 이러한 이유로 이벤트 기반 백 테스트는 시장에서 거래 될 수있는 모든 전략을 테스트 할 수 있으며 이벤트 기반 백 테스트를 위해 코딩 된 알고리즘은 일반적으로 메커니즘이 동일하기 때문에 실시간 거래를 수정하지 않고도 사용할 수 있습니다. 이벤트 기반의 백 테스팅에서는 전략이 실제 거래에서 (또는 적어도 관리 할 수있는만큼 가까운 곳에서) 수행되었으므로 데이터를 통해 전략을 명시 적으로 모의 실행합니다.


이벤트 기반의 백 테스트 엔진을 파이썬으로 작성하고자한다면 파이썬의 본질 때문에 심각한 문제에 직면하게 될 것입니다. 이 언어로 작성하는 것이 매우 쉽기 때문에 파이썬을 사용하기로 결정했을 것입니다. 하지만 곧 비용이 많이 든다는 것을 알게 될 것입니다. 간단한 데이터 로딩과 이벤트 기반 테스팅을 수행하고 싶다면 위 코드에서 보인 코드를 사용하는 것이 좋습니다. 이 예제는 TEST_60.csv (30 년 무작위로 생성 된 1H 데이터) 파일에서 데이터를로드 한 다음 전체 판다 데이터 프레임을 통해 간단한 루프를 수행하여 각 막대의 평균 20 바 범위를 계산합니다 (매우 간단). 이 간단한 연습을하면 팬더 데이터 프레임에 데이터를로드하는 데 약 12-15 초가 걸립니다. & # 8211; 주로 날짜 분석 때문에 & # 8211; 그런 다음 몇 분 동안 반복적으로 운동을 수행하십시오. 팬더와 같은 라이브러리는 단순히 이러한 유형의 작업을 수행하도록 설계되지 않았기 때문에 팬더 데이터 프레임을 순환하는 것이 매우 느리며 라이브러리 내의 C 기반 함수 내에서 최적화 된 벡터 기반 연산을 위해 설계되었습니다.


판다 (pandas) 나 numpy 같은 라이브러리를 사용할 때 루핑 비용은 실제로 간단한 파이썬리스트를 반복하는 비용보다 훨씬 큽니다. 왜냐하면 이러한 라이브러리는 객체 내에서 단일 요소에 액세스하는 데 비효율적 인 함수를 가지고 있기 때문입니다. 도서관이 디자인 한 것. Pandas 데이터 프레임과 numpy 배열은 반복 할 수 없으며 벡터 기반 연산을 수행하는 데 사용됩니다 (즉, 파이썬적인 작업). 몇 가지 테스트를 수행하고 팬더 데이터 프레임 내의 값에 액세스하는 데 사용되는 함수를 변경할 때 시간이 얼마나 많이 변경되는지 확인할 수 있습니다. ix에서 iat 또는 iloc으로 변경하면 실행 시간에 몇 가지 중요한 차이가 있음을 알 수 있습니다 (자세한 내용은 여기 참조). 색인 생성 방법 성능). pandas 또는 numpy와 같은 라이브러리를 사용하면 저장되는 코딩 시간이 매우 좋습니다. 그러나 이벤트 기반의 다시 테스트를 수행하면 빠른 속도를 낼 수 없습니다.


파이썬에서 이런 종류의 루핑을 수행하는 데 드는 비용은 이벤트 기반 테스팅을 필요로하는 대규모 백 테스팅 프로젝트에서 언어를 실질적으로 쓸모 없게 만듭니다. 위의 코딩 된 1H 바 루프는 실행하는 데 몇 분이 걸리고 심지어는 실행되지 않습니다 매우 까다로운 계산을하는 경우에도 형평, 거래 또는 신호 생성을 추적하지 않습니다. 판다 개체를 통해 반복하는 것은 대단히 느리기 때문에이 모든 것입니다. 물론 팬더를 사용하지 않았거나 ctypes를 사용했지만 저수준 언어 영역으로 옮겨 간다면 더 빨리 할 수 ​​있습니다. 당신은 빠른 (ctypes) 무언가를 위해 (팬더)를 코딩하기 위해 엄청나게 친숙한 것을 포기합니다. 코딩 속도를 높이기 위해 코딩 시간을 늘리려면 저급 언어로가는 것이 좋습니다. 파이썬 코드를 더 빠르게 만드는 데 10 배의 시간을 소비한다면 C 언어로 코딩하는 데 시간을 할애 할 수 있습니다.


물론 파이썬을 백 테스팅 할 곳이 없다는 것을 논쟁하지는 않습니다. 파이썬에서 공개 소스 타임 시리즈 분석 라이브러리를 코딩 한 후에는 qqpat라고 부릅니다. 이 언어를 사용하여 다소 간단한 벡터 기반 테스트를 수행 할 수 있으며 가장 사용하기 쉬운 라이브러리를 기꺼이 포기할 경우 ctypes를 사용하여 훨씬 빠르게 코드를 작성하고 pypy 같은 것을 사용하여 속도를 향상시킬 수 있습니다 . 그러나 내가 파이썬에서 찾은 최고의 사용법은 C / C ++로 코딩 된 훨씬 빠른 백 테스트 라이브러리를 프론트 엔드로 사용하는 것입니다. 우리 커뮤니티에서는 python을 사용하여로드 구성과 같은 작업을 수행하고 그래프를 생성하고 csv 파일을로드하는 반면 훨씬 효율적인 C 라이브러리는 실제 이벤트 기반의 백 테스트를 수행합니다. 이렇게하면 판타지와 같은 사용하기 쉬운 라이브러리를 사용하여 파이썬에서이 작업을 수행하는 동안 시간이 100 배나 더 오래 걸릴 가능성이 높아지며 1H 바에서 전체 30 년의 백 테스트를 몇 초 만에 수행 할 수 있습니다. Python을 사용하는 상용 이벤트 기반의 백 테스트 프로그램이 단순히이 작업에 사용되는 언어가 아닌 이유는 간단합니다.


C / C ++ 프로그래밍 프레임 워크를 사용하여 백 테스팅 및 전략을 코딩하고 테스트 할 수있는 방법에 대해 자세히 알고 싶다면 Â 교육 비디오, 거래 시스템, 개발 및 사운드, 정직하고 투명한 정보로 가득 찬 Asirikuy 웹 사이트에 가입하는 것을 고려하십시오. 자동 거래에 대한 접근법.


파이썬에서 Backtesting Trading Systems에 대한 3 가지 답변 : 정말 좋은 선택은 아닙니다. & # 8221;


여러분의 코드를 약간 수정하면 속도가 상당히 빨라지므로 궁극적으로 파이썬을 조금 더 수용 할 수있을 것이라고 생각합니다.


1) 인쇄가 상당히 비쌉니다. 특정 간격으로 average_range에 포함 된 데이터를 인쇄하려면 데이터를 채운 후에 데이터를 인쇄 할 수 있습니다.


2) 빈 NumPy 배열을 미리 할당하는 것을 고려하십시오.


& gt; n_elements = len (range (2, len (main_rates. index)) * 20.


& gt; average_range [(i-2) * 20 + j] = 범위 _ 값.


이렇게하면 듀얼 Intel Xeon E5-2620의 총 실행 시간은 0.033 초가됩니다. 64 비트 IPython에서 NumPy 1.10과 Pandas 0.17.1을 사용하여 필자의 가치는 무엇인지 알 수 있습니다.


게시 해 주셔서 감사합니다! 정말 좋은 개선, 분명히 인쇄 기능은 단지 설명 목적을 위해 (나는 단지 사용자가 함수를보고 싶었지만) numpy 배열을 미리 할당하여 시간을 줄이는데 좋은 업무였습니다. 물론 파이썬에서 코드를 더 빠르게 만들 수있는 모든 종류의 것들이 있습니다. & # 8212; 특히이 경우와 같은 특정한 경우에는 할 수 없다는 말은 분명하지 않습니다. 그러나 파이썬에서 받아 들일 수있는 성능을 얻으려면 아직 코딩의 친숙 함을 포기할 필요가 있다는 점에서 여전히 유효하다고 생각합니다. 그것은 그걸 처음부터 매력적인 언어로 만듭니다. 코드가 정말 복잡해지면 & # 8211; 마치 기계 학습을하고 싶다면 & # 8211; 게시 한 것과 같은 수정 사항은 점점 더 힘들어집니다. 결국 C / C ++과 같은 실행 시간에 도달하기 위해 이러한 저수준 언어로 코딩하는 것처럼 시간을 소비 할 수 있습니다.


어떻게 생각해? 이게 사실이라고 생각하니? 파이썬 코드가 너무 많은 노력 없이도 C / C ++ 성능에 도달 할 수있는 최적화가 있다고 생각하십니까? 공유하고 싶은 파이썬 팁이 있습니까? 물론 파이썬에 마지막 단어가 없기 때문에 눈길을 끄는 사람도 분명 환영합니다! 당신의 공헌에 대해 많은 것을 알고 감사드립니다.


일반적으로 작업이 벡터화되지 않으면 금속에 가까워집니다. cython (또는 그와 비슷한 것)을 사용하는 것이 최적 일 것이며 C / C ++ 세계에 살고있는 것입니다.


즉, ARMA 및 기타 벡터화되지 않은 계산 속도를 높이기 위해 Numba (NumPy와 잘 호환되는 Just-In-Time 컴파일 라이브러리)를 사용하여 큰 효과를 얻었습니다. 자세한 내용은 다음을 참조하십시오.


모든 유형의 사용자 정의 및 최적화가 가능하지만 대부분의 경우 jit를 사용하여 격리 된 수치 루프를 꾸미기 만하면됩니다.

Comments

Popular Posts