타임 시리즈 데이터 분석 및 틱 데이터 백테스팅

저자:리디아, 창작: 2023-01-06 15:27:16, 업데이트: 2023-09-20 10:12:15

img

타임 시리즈 데이터 분석 및 틱 데이터 백테스팅

시간 계열 데이터

시간 계열은 같은 시간의 연속적 간격에서 얻은 데이터 계열을 의미합니다. 양적 투자에서 이러한 데이터는 주로 추적 된 투자 대상의 가격과 데이터 포인트의 움직임에 반영됩니다. 예를 들어 주식 가격의 경우 특정 기간 내에 정기적으로 기록되는 시간 계열 데이터가 다음 차트를 참조 할 수 있습니다.

img

보시다시피 날짜는 x축에 표시되고 가격은 y축에 표시됩니다. 이 경우, continuous interval time period는 x축의 날이 14일 간격이라는 것을 의미합니다: 2005년 3월 7일과 다음 포인트인 2005년 3월 31일, 2005년 4월 5일, 2005년 4월 19일 사이의 차이를 참고하십시오.

그러나 시간 시리즈 데이터를 사용할 때, 날짜와 가격이라는 두 개의 열만 포함하는 이 종류의 데이터 이상으로 볼 수 있습니다. 대부분의 경우, 데이터 기간, 개시 가격, 최고 가격, 최저 가격 및 종료 가격이라는 다섯 개의 열을 사용할 수 있습니다. 즉, 데이터 기간이 일일 수준으로 설정되면, 그 날의 높은, 개방, 낮은 및 닫는 가격 변화는이 시간 시리즈의 데이터에 반영됩니다.

틱 데이터란 무엇일까요?

틱 데이터는 거래소에서 가장 상세한 거래 데이터 구조입니다. 그것은 또한 앞서 언급한 시간 시리즈 데이터의 확장 된 형태입니다. 여기에는: 개시 가격, 최고 가격, 최저 가격, 최신 가격, 거래량 및 매출이 포함됩니다. 거래 데이터가 강과 비교되면 틱 데이터는 특정 가로 절단에있는 강의 데이터입니다.

외환 거래소의 모든 작업은 실시간으로 시장에 밀려날 것이며, 국내 거래소는 초당 두 번 확인됩니다. 이 기간 동안 작업이 있으면 스냅샷이 생성되고 밀려날 것입니다. 비교하여 데이터 푸시는 OnTime로만 볼 수 있으며 OnTick이 아닙니다.

이 튜토리얼의 모든 코드와 시간 시리즈 데이터 획득은 FMZ 퀀트 플랫폼에서 완료됩니다.

FMZ 양에 대한 데이터를 체크

비록 국내 틱 데이터는 실제 틱이 아니지만, 적어도 이 데이터를 백테스팅에 사용함으로써 현실에 무한히 가깝고 복원 할 수 있습니다. 각 틱은 그 당시 시장에서 제품의 주요 매개 변수를 표시하고 실제 봇의 코드는 이론적 틱에 따라 계산됩니다. 초당 두 번.

img

뿐만 아니라 FMZ Quant에서는 1시간 기간의 데이터를 로드하더라도 데이터의 곡성도를 1분으로 조정할 수 있다. 이 시점에서 1시간 K-라인은 1분 데이터로 구성된다. 물론 곡성도가 작을수록 정확도가 높다. 더 강력한 것은 데이터를 실제 봇 틱으로 전환하면 실제 봇 환경을 원활하게 복원할 수 있다는 것이다. 즉, 초당 두 번의 실제 틱 교환의 데이터이다.

img

이제 이 튜토리얼을 완료하기 위해 알아야 할 기본 개념을 배웠습니다. 이 개념들은 곧 다시 올 것이고, 이 튜토리얼에서 나중에 더 많이 배우게 될 것입니다.

작업 환경을 설정

더 나은 도구는 좋은 일을 합니다. 우리는 먼저 FMZ 퀀트 플랫폼에 도커를 배포해야합니다. 도커의 개념에 관해서는 프로그래밍 경험이있는 독자는 다양한 주류 거래소의 공개 API 인터페이스와 전략 작성 및 백테스팅의 기술적 세부 사항을 캡슐화 한 공식적으로 패키지 된 도커 시스템으로 상상할 수 있습니다. 이 시스템을 설립하는 원래 목적은 양적 거래자가 FMZ 퀀트 플랫폼을 사용할 때 전략 작성 및 디자인에 집중하도록하는 것입니다. 이러한 기술적 세부 사항은 전략 작성자에게 많은 시간과 노력을 절약하기 위해 캡슐화 된 공식으로 제시됩니다.

  • FMZ 퀀트 플랫폼의 도커 시스템 구축 도커를 배포하는 방법에는 두 가지가 있습니다.

방법 A: 사용자는 서버를 직접 임대하거나 구매하여 AWS, Alibaba Cloud, Digital Ocean 및 Google Cloud와 같은 다양한 클라우드 컴퓨팅 플랫폼에 배포할 수 있습니다. 이점은 전략 보안과 시스템 보안이 보장된다는 것입니다. FMZ 퀀트 플랫폼의 경우 사용자는이 방법을 사용하도록 권장됩니다. 분산 배포는 서버 공격의 숨겨진 위험을 제거합니다.

방법 B: FMZ 퀀트 플랫폼의 퍼블릭 서버를 배포를 위해 사용하십시오. 플랫폼은 홍콩, 싱가포르, 일본 및 동부 US에서 배포를 위해 네 개의 위치를 제공합니다. 사용자는 거래하고 싶은 거래소의 위치와 근접성의 원칙에 따라 배포 할 수 있습니다. 이 측면의 장점은 한 번의 클릭으로 간단하고 쉽게 완료된다는 것입니다. 특히 초보 사용자에게 적합합니다. 리눅스 서버를 구매하는 것에 대해 많은 것을 알아야 할 필요가 없으며 리눅스 명령을 배우는 데 시간과 에너지를 절약합니다. 가격은 상대적으로 저렴합니다. 적은 자금을 가진 사용자에게 플랫폼은이 배포 방법을 사용하는 것이 좋습니다.

img

초보자 들 이 이해 하기 위해 이 기사 에서는 방법 B 를 채택 할 것 이다.

구체적인 작업은: 로그인FMZ.COM, 대시보드, 도커를 클릭하고, 도커를 빌리기 위해 한 클릭으로 도커 VPS를 빌려주세요.

성공적으로 배포 후 아래와 같이 암호를 입력합니다:

img

  • 로봇 시스템 개념과 도커 사이의 관계 앞서 언급했듯이, 도커는 도커 시스템과 같고, 도커 시스템은 표준의 집합과 같습니다. 우리는 이 표준의 집합을 배포했습니다. 다음으로, 우리는 이 표준의 인스턴스을 생성해야 합니다.

로봇을 만드는 것은 매우 간단합니다. 도커를 배포한 후 왼쪽 Bot 열을 클릭하고, 탭 이름에 이름을 입력하고, 배포한 도커를 선택하십시오. 아래의 매개 변수와 K-라인 기간은 특정 상황에 따라 설정할 수 있습니다. 주로 거래 전략과 연동하여.

img

지금까지 우리의 작업 환경이 구축되었습니다. 그것은 매우 간단하고 효과적이라는 것을 볼 수 있습니다, 그리고 각 기능은 자신의 업무를 수행합니다. 다음으로 우리는 양적 전략을 작성하기 시작할 것입니다.

파이썬에서 간단한 EMA 전략을 구현

우리는 시간 계열 데이터와 틱 데이터의 개념을 언급했습니다. 다음으로, 우리는 두 개념을 연결하기 위해 간단한 EMA 전략을 사용합니다.

  • EMA 전략의 기본 원칙

7일 EMA와 같은 느린 기간 EMA와 3일 EMA와 같은 빠른 기간 EMA를 통해. 그들은 동일한 K-라인 차트에 적용됩니다. 빠른 기간 EMA가 느린 기간 EMA를 넘을 때, 우리는 그것을 골든 크로스라고 부릅니다. 느린 기간 EMA가 빠른 기간 EMA를 통해 내려갈 때, 우리는 Bearish Crossover라고 부릅니다.

포지션 개설의 기초는 골든 크로스로 긴 포지션을 개설하고, 베어리 크로스오버로 짧은 포지션을 개설하는 것입니다. 포지션을 닫는 이유는 동일합니다.

열어보자FMZ.COM, 계정, 대시보드, 전략 라이브러리에 로그인하여 새로운 전략을 생성합니다. 왼쪽 상단에있는 전략 작성 언어에서 파이썬을 선택하십시오. 다음은이 전략의 코드입니다. 각 줄에는 자세한 의견이 있습니다. 이해하려면 시간을 내십시오. 이 전략은 실제 봇 전략이 아닙니다. 실제 돈으로 실험하지 마십시오. 주요 목적은 전략 작성과 학습을위한 템플릿에 대한 일반적인 아이디어를 제공하는 것입니다.

import types # Import the Types module library, which is designed to handle the various data types that will be used in the code.

def main(): # The main function, where the strategy logic begins.
    STATE_IDLE = -1 # Mark position status variables
    state = STATE_IDLE # Mark the current position status
    initAccount = ext.GetAccount() # The spot digital currency trading class library (python version) is used here. Remember to check it when writing the strategy to obtain the initial account information.
    while True: # Enter the loop
        if state == STATE_IDLE : # Here begins the logic of opening positions.
            n = ext.Cross(FastPeriod,SlowPeriod) # The indicator crossover function is used here, for details please see: https://www.fmz.com/strategy/21104.
            if abs(n) >= EnterPeriod : # If n is greater than or equal to the market entry observation period, the market entry observation period here is to prevent positions from being opened indiscriminately as soon as the market opens.
                opAmount = _N(initAccount.Stocks * PositionRatio,3) # Opening position quantity, for the usage of _N, please check the official API documentation.
                Dict = ext.Buy(opAmount) if n > 0 else ext.Sell(opAmount) # Create a variable to store the open position status and execute the open position operation.
                if Dict :  # Check the dict variable and prepare for the following log output.
                    opAmount = Dict['amount']
                    state = PD_LONG if n > 0 else PD_SHORT # Both PD_LONG and PD_SHORT are global constants used to represent long and short positions, respectively.
                    Log("Details of opening positions",Dict,"Cross-period",n) # Log information
        else: # Here begins the logic of closing positions.
            n = ext.Cross(ExitFastPeriod,ExitSlowPeriod) # The indicator crossover function.
            if abs(n) >= ExitPeriod and ((state == PD_LONG and n < 0) or (state == PD_SHORT and n > 0)) : # If the market exit observation period has passed and the current account status is in the position status, then you can determine the Golden Cross or Bearish Crossover.
                nowAccount = ext.GetAccount() # Refresh and get account information again.
                Dict2 = ext.Sell(nowAccount.Stocks - initAccount.Stocks) if state == PD_LONG else ext.Buy(initAccount.Stocks - nowAccount.Stocks) # The logic of closing a position is to close the long position if it is a long position and close the short position if it is a short position.
                state = STATE_IDLE # Mark the position status after closing positions.
                nowAccount = ext.GetAccount() # Refresh and get account information again.
                LogProfit(nowAccount.Balance - initAccount.Balance,'money:',nowAccount.Balance,'currency:',nowAccount.Stocks,'The details of closing positions',Dict2,'Cross-over period:',n) # Log information
        Sleep(Interval * 1000) # Pause the loop for one second to prevent the account from being restricted due to too fast API access frequency.
  • EMA 전략의 백테스팅 전략 편집 페이지에서, 우리는 전략을 작성 완료했습니다. 다음으로, 우리는 역사 시장에서 수행하는 방법을 보기 위해 전략을 백테스트해야합니다. 백테스팅은 모든 양적 전략 개발에서 중요한 역할을하지만 중요한 참조로만 사용될 수 있습니다. 백테스팅은 수익 보장과 같지 않습니다. 시장이 끊임없이 변화하고 있기 때문에 백테스팅은 단지 후견의 행위입니다. 여전히 인도션 범주에 속하며 시장은 추론적입니다.

백테스트를 클릭하면 많은 조정 가능한 매개 변수가 있으며 직접 수정할 수 있음을 알 수 있습니다. 미래를 위해 전략은 점점 더 복잡하고 매개 변수가 점점 더 많습니다. 이러한 수정 방법은 사용자가 편리하고 빠르고 명확하게 코드를 하나씩 수정하는 번거로움을 피할 수 있습니다.

img

다음 최적화 옵션은 설정된 매개 변수를 자동으로 최적화 할 수 있습니다. 시스템은 전략 개발자가 최적의 선택을 찾는 데 도움이되는 다양한 최적 매개 변수를 시도합니다.

위의 예제에서 우리는 양적 거래의 기초가 시간 계열 데이터의 분석과 틱 데이터의 백테스팅 상호 작용을 통해 있음을 알 수 있습니다. 논리가 아무리 복잡하더라도이 두 기본 요소에서 분리 될 수 없습니다. 차이점은 단지 차원의 차이입니다. 예를 들어, 고 주파수 거래는 더 자세한 데이터 측면과 더 많은 시간 계열 데이터를 필요로합니다. 또 다른 예는 백테스트 샘플에서 많은 데이터를 필요로하는 중재 거래입니다. 이 두 거래 대상의 이해 증대 및 감소의 통계 결과를 알아보기 위해 10 년 이상 지속적인 심층 데이터가 필요할 수 있습니다. 향후 기사에서는 고 주파수 거래 및 중재 거래 전략을 하나씩 소개 할 것입니다. 기대하십시오.


관련

더 많은