Type/to search
8
Follow
1363
Followers
양적 거래에서 자산 관리까지 - 절대 수익을 위한 CTA 전략 개발
Original
Created 2019-06-26 10:27:41  Updated 2023-10-30 20:30:50
 5
 7717

img

머리말

왜 이 과정을 공부해야 하나요?
이 과정을 공부하면서 무엇을 얻었나요? 우선, 이 과정은 JavaScript와 Python 프로그래밍 언어를 기반으로 합니다. 언어는 단지 기술일 뿐이며, 결국 우리는 이 기술을 산업에 적용해야 합니다. 양적 거래는 현재 급속한 발전 단계에 있는 신흥 산업으로, 인재에 대한 수요가 엄청납니다.

이 과목의 체계적인 학습을 통해 양적 거래 분야에 대한 더 깊은 이해를 얻을 수 있습니다. 양적 거래 분야에 진출을 준비하는 학생이라면 도움이 될 것입니다. 주식 또는 선물 투자 애호가라면, 양적 거래는 주관적인 거래를 충분히 도울 수 있습니다. 거래 전략을 개발함으로써 금융 시장에서 수익을 창출하고 투자 및 재무 관리 채널과 플랫폼을 확장할 수 있습니다.

그 전에, 제 개인적인 트레이딩 경험에 대해 이야기해 보겠습니다. 저는 금융 전공이 아니라 통계 전공입니다. 그는 학생 시절부터 주관적 주식거래를 시작했다. 이후 우연히 국내 사모펀드의 양적거래 실무자가 되었고, 주로 전략 연구개발에 종사했다.

저는 10년 넘게 거래계에 종사해 왔고 다양한 유형의 전략을 개발해 왔습니다. 저의 투자 철학은 무엇보다도 위험을 통제하고 절대 수익에 집중하는 것입니다. 우리 과목의 제목은 '양적 거래에서 자산 관리까지 - 절대 수익을 위한 CTA 전략 개발'입니다.

1. 선물 CTA 전략으로 돈을 버는 논리

1.1 Futures CTA 이해

어떤 사람들은 CTA가 무엇인지 물을 수 있습니다. CTA가 정확히 무엇인가요? CTA는 해외에서는 상품거래자문사라고 불리고, 국내에서는 보통 투자관리자라고 불립니다. 전통적인 CTA는 다수의 투자자로부터 자금을 모아 전문 투자기관에 위탁하고, 최종적으로 거래자문사(즉, CTA)를 통해 주가지수선물, 상품선물, 국고채선물에 투자합니다.

하지만 실제로 글로벌 선물 시장이 계속해서 성장하고 발전함에 따라 CTA 개념도 끊임없이 확장되고 있으며 그 범위는 전통적인 선물 시장을 훨씬 능가합니다. 선물시장뿐만 아니라 금리시장, 주식시장, 외환시장, 옵션시장 등에도 투자가 가능하며, 이 상품이 일정 수준의 과거 데이터를 보유하고 있다면 해당 CTA 전략이 가능하다. 이러한 역사적 자료를 바탕으로 개발되었습니다.

1980년대 이전에는 전자 거래 기술이 그다지 성숙하지 않았습니다. 그 당시 대부분의 거래자는 Williams 지표, KDJ, RSI, MACD, CCI 등과 같은 기술 지표를 수동으로 그려 상품 선물의 미래 추세를 판단했습니다. 이후 일부 트레이더는 고객이 자산을 관리하는 데 도움을 주기 위해 특별 CTA 펀드를 설정했습니다. CTA 펀드가 진정한 의미로 등장하기 시작한 것은 1980년대에 전자 거래가 대중화된 이후였다.

CTA 기금 관리 규모 변경
img
단위: 10억 미국 달러

위의 차트를 살펴보면, 특히 양적 거래의 증가로 인해 글로벌 CTA 펀드의 규모는 2005년 1,306억 달러에서 2015년 3,000억 달러 이상으로 증가했습니다. 또한 CTA 전략은 글로벌 헤지펀드의 가장 대중적인 투자 전략 중 하나가 되었습니다.

CTA 펀드의 성과도 규모와 함께 증가했습니다. 아래 그림에서 Barlake CTA 지수를 살펴보겠습니다. Barlake CTA 지수는 글로벌 상품 거래 자문사를 위한 대표적인 산업 벤치마크입니다. 1979년 말부터 2016년 말까지 Barlake CTA 펀드 지수의 누적 수익률은 무려 28.95배였으며, 연간 수익률은 9.59%, 샤프 비율은 0.37, 최대 하락률은 15.66%였습니다.

자산 배분 포트폴리오에서 CTA 전략은 일반적으로 다른 전략과 매우 낮은 상관관계를 유지하기 때문입니다. 아래 그림의 빨간색 원에서 보듯이 2000년에서 2002년까지의 글로벌 주식 하락장과 2008년 글로벌 서브프라임 모기지 위기 동안 Barlake CTA 펀드 지수는 하락하지 않았을 뿐만 아니라 긍정적인 수익률을 달성했습니다. 위기가 발생하면 CTA는 주식과 채권 시장에서 강력한 수익을 제공할 수 있습니다. 또한, 1980년 이래로 Barclays Commodity CTA 지수의 수익 수준은 항상 S&P 500보다 높았으며 하락률도 S&P 500보다 훨씬 낮았음을 알 수 있습니다.

img

우리나라에서 CTA가 발전한 것은 불과 10년 전이지만 그 추진력은 매우 강력합니다. 이는 주로 국내 상품선물의 비교적 개방적인 거래 환경, 낮은 거래자본 한도, 롱숏 2거래를 허용하는 증거금 시스템 때문입니다. -방식 거래, 낮은 거래 수수료, 거래소의 기술적 구조가 주식보다 진보되어 있고 시스템 내에서 거래가 쉬운 등의 장점이 있습니다.

2010년 이래로 CTA 펀드는 주로 사모펀드 형태로 존재해 왔습니다. 국내 정책이 점차 펀드 특별계좌의 투자 범위를 개방함에 따라 CTA 펀드는 펀드 특별계좌의 형태로 존재하기 시작했습니다. 그들의 보다 투명하고 개방적인 운영 방식은 또한 더 많은 투자자에게 자산 배분을 위한 필수적인 도구가 되었습니다.

img

위 그림에서 보듯이, 시작하기의 난이도, 자본금 한도, 거래 전략 실행 방법, API 도킹 등의 측면에서도 CTA 전략은 다른 거래 전략보다 개인 거래자에게 더 적합합니다. 국내 선물 계약은 매우 규모가 작습니다. 예를 들어, 옥수수나 대두박 한 묶음은 자본 한도가 거의 없이 수천 위안에 거래될 수 있습니다. 또한 일부 CTA 전략은 전통적인 기술 분석에서 나오기 때문에 비교적 쉽습니다. 다른 전략으로..

img

CTA 전략의 설계 과정도 비교적 간단합니다. 먼저 과거 데이터를 사전 처리한 다음 정량적 모델에 입력합니다. 정량적 모델에는 수학적 모델링, 프로그래밍 설계 및 기타 도구로 형성된 거래 전략이 포함되며 계산하여 거래 신호를 생성합니다. 그리고 이 데이터를 분석합니다. 물론 실제 개발에서는 위의 그림에서 보이는 것처럼 간단하지 않습니다. 이는 모든 사람에게 전반적인 개념을 제공하기 위한 것입니다.

1.2 선물 CTA 전략 유형

거래 전략의 관점에서 CTA 전략은 또한 다양합니다. 추세 전략 또는 차익 거래 전략이 될 수 있습니다. 대규모 사이클의 중기 및 장기 전략이거나 하루 내의 단기 전략이 될 수 있습니다. 전략 논리는 다음을 기반으로 할 수 있습니다. 기술적 분석 또는 기본 분석. 표면 분석; 주관적 거래 또는 체계적 거래가 될 수 있습니다.

CTA 전략에는 다양한 분류 방법이 있습니다. 거래 방법에 따라 주관적 거래와 체계적 거래로 나눌 수 있습니다. 해외에서 CTA 전략의 개발은 비교적 진보되어 있으며 체계적 거래의 CTA 전략은 거의 100%에 도달했습니다. 분석 방법에 따르면 기본적 분석과 기술적 분석으로 나눌 수 있습니다. 수입원에 따라 트렌드 트레이딩과 스윙 트레이딩으로 나눌 수 있습니다.

일반적으로 전체 거래 시장에서 트렌드 전략은 CTA 전략의 약 70%를 차지하고, 평균 회귀 전략은 약 25%를 차지하며, 역추세 또는 트렌드 반전 전략은 약 5%를 차지합니다. 그 중 가장 큰 비중을 차지하는 트렌드 전략은 보유 기간에 따라 고빈도 트레이딩, 일중 트레이딩, 중단기 트레이딩, 중장기 트레이딩으로 구분할 수 있습니다.

고빈도 시장 조작 전략
현재 시장에는 두 가지 주요 고빈도 거래 전략이 있는데, 하나는 고빈도 시장 조성 전략이고, 다른 하나는 고빈도 차익거래 전략입니다. 시장 조성 전략은 거래 시장에서 유동성을 제공하는 것입니다. 즉, 시장 조성자가 있는 거래 시장에서 누군가가 매수 또는 매도를 원하면 시장 조성자는 자신의 주문이 실행될 수 있도록 해야 합니다. 시장에 유동성이 부족하고 주문을 실행할 수 없는 경우, 시장 조성자는 다른 사람의 거래상대방을 매수하거나 매도해야 합니다.

고빈도 차익거래 전략
고빈도 차익거래는 상관관계가 높은 두 주식 또는 ETF 또는 ETF를 조합하여 거래하는 것입니다. ETF의 계산 방법에 기초하여, 동일한 방법을 사용하여 ETF의 예상 가격을 계산할 수 있습니다. ETF 지수 가격은 ETF 예상 가격에서 빼서 가격 차이를 얻을 수 있습니다. 일반적으로 이 가격 차이는 가격 채널 내에서 작동합니다. 가격 차이가 상하 채널을 돌파하면 이 가격 차이를 거래하고 기다릴 수 있습니다. 그 가격 차이를 되돌려 이익을 얻는 것이다.

일중 전략
문자적 의미에 따라, 포지션을 밤새도록 유지하지 않는 한, 이를 일일 트레이딩 전략이라고 부를 수 있습니다. 당일 거래의 보유 기간은 비교적 짧고, 일반적으로 시장에 진입한 후 바로 수익을 낼 수 없고 시장에서 빨리 빠져나가게 됩니다. 그러므로 이 거래 방법은 시장 위험이 더 낮습니다. 그러나 시장은 짧은 시간 안에 빠르게 변화하기 때문에, 당일 거래 전략은 일반적으로 트레이더에게 더 높은 요구 사항을 요구합니다.

중장기 전략
이론상 보유 기간이 길수록 전략 용량은 커지고 위험-수익 비율은 낮아집니다. 특히 기관 거래의 경우 단기 전략의 수용 능력이 제한되어 있고 대규모 자금이 단시간 내에 시장에 진입하고 빠져나갈 수 없기 때문에 중기 및 장기 전략이 더 많이 할당될 것입니다. 일반적으로 보관 기간은 며칠, 몇 달, 심지어 그 이상입니다.

CTA 전략 데이터
일반적으로 CTA 전략은 분, 시간 및 일별 데이터를 연구 대상으로 사용하는데, 여기에는 시가, 최고가, 최저가, 종가, 거래량 등이 포함됩니다. 소수의 CTA 전략만이 틱 데이터를 사용합니다. 예를 들어, in- L2 데이터에는 매수 가격, 매도 가격, 매수량, 매도량 등의 심층 데이터가 포함됩니다.

img

CTA 전략의 기본 아이디어에 대해 말할 때 가장 먼저 떠오르는 것은 전통적인 기술 지표입니다. 이와 관련된 공개 참고 자료가 더 많고 논리가 더 간단하며 대부분이 통계 원칙에 기반하기 때문입니다. 예를 들어, 모든 사람이 잘 알고 있는 다양한 기술 지표로는 MA, SMA, EMA, MACD, KDJ, RSI, BOLL, W&R, DMI, ATR, SAR, BIAS, OBV 등이 있습니다.

시중에는 참고 및 개선용으로 사용할 수 있는 고전적인 거래 모델도 몇 가지 있습니다. 여기에는 다중 이동 평균 조합, DualThrust, R-Breaker, Turtle Trading Method, Grid Trading Method 등이 있습니다.

위에 나열된 모든 것은 전통적인 기술 분석에 기반한 거래 전략입니다. 이 과정은 과거 데이터와 올바른 거래 개념을 기반으로 확률적 이점이 있는 요인 또는 매수 및 매도 조건을 추출하고, 시장이 미래에도 이 패턴을 가질 것이라고 가정하는 것입니다. 마지막으로, 코드를 사용하여 거래 전략을 구현하고 거래를 완전 자동화하세요. 포지션 개설, 이익 실현, 손실 중단, 포지션 추가, 포지션 감소 등은 일반적으로 인간의 개입이 필요하지 않습니다. 실제로 이는 가격 시계열의 양의 자기상관 계수를 이용하여 높은 가격에 사고 낮은 가격에 파는 전략입니다.

CTA 전략의 가장 큰 장점은 현재 시장이 상승하든 하락하든 관계없이 절대 수익을 얻을 수 있다는 점인데, 특히 시장이 강세와 약세 시장 사이에서 빠르게 변할 때나 시장 추세가 분명히 순조로울 때 더욱 그렇습니다. 이 전략은 매우 큽니다. 간단히 말해서 추세가 있습니다. 이익에는 추세가 있습니다. 하지만 시장이 변동성이 크거나 추세가 명확하지 않은 경우, 이 전략을 사용하면 최고가에서 매수하고 최저가에서 매도하는 결과가 초래될 수 있으며, 손실을 막기 위해 끊임없이 앞뒤로 움직이게 됩니다.

1.3 선물 CTA 전략의 이익 원칙

선물 CTA 전략이 수익을 낼 수 있는 이유는 주로 다음과 같습니다.

  1. 가격 움직임은 반사적이며 항상 추세의 형태로 계속됩니다. 투자자들이 가격이 오르는 것을 보면 매수를 해서 가격이 더욱 상승하게 됩니다. 가격 하락에도 마찬가지입니다. 투자자들이 비이성적으로 행동하기 때문에 가격이 오를 때는 비정상적인 수준으로 오르고, 떨어질 때는 비정상적인 수준으로 떨어지는 것을 볼 수 있습니다.
  2. 각 투자자는 이익과 손실 비율에 대한 허용 범위가 비대칭적이며, 위험 허용 범위도 다릅니다. 대부분의 개인 투자자는 보다 보수적인 추세 추종 거래 방법을 선택하는 것을 선호하며, 이 경우 시장이 추세에 따라 움직일 가능성이 더 큽니다.
  3. 가격 형성은 거래에 의해 결정되고 거래는 사람에 의해 주도됩니다. 그러나 인간의 본성은 변화하기 어렵기 때문에 고정된 패턴이 반복적으로 나타납니다. 이 전략은 과거 데이터로 백테스트할 때 효과적입니다. 이는 효과적일 수 있음을 나타냅니다. 미래에.

추세 추종 거래의 또 다른 특징은 시장이 없을 때는 적은 돈을 잃고, 시장이 오면 많은 돈을 번다는 것입니다. 그러나 거래를 해본 사람이라면 누구나 시장이 대부분 변동성이 있는 상태라는 것을 알고 있습니다. 시간의, 그리고 단지 짧은 시간 동안만 트렌드가 됩니다. 인용문. 따라서 추세 추종 전략은 거래 시 승률은 낮지만, 전체적으로 각 거래의 손익은 비교적 큽니다.

추세 추종 전략은 수익률이 불안정하기 때문에 많은 투자 기관에서는 다양한 종류와 전략을 활용하여 투자 포트폴리오를 구성하는데, 여기에는 일정 수준의 역전 전략도 포함됩니다. 역전 전략은 가격 시계열이 음의 자기상관 계수를 가지고 있다는 것입니다. 즉, 높은 가격에 매도하고 낮은 가격에 매수하는 것을 의미합니다.

CTA와 기존 자산 간의 상관 관계
img

위의 차트를 살펴보면, 이론적으로 동시에 다양한 시장 가격 변화에 직면했을 때, 서로 다른 스타일이나 낮은 상관관계를 지닌 여러 전략이 때로는 같고 때로는 다른 거래 신호를 생성합니다. 여러 수익률 곡선이 겹치면 전체 수익률이 서로 보완되고 수익률 곡선이 평평해져 수익률 변동성이 줄어듭니다.

위의 관점에서 볼 때, 마스터 레벨 전략을 개발하는 대신 여러 개의 평범한 하위 전략을 개발하는 것이 더 낫다는 결론을 내릴 수 있습니다. 그렇다면 이러한 전략을 어떻게 제어할까요? 여기서 우리는 머신 러닝에서 랜덤 포레스트 알고리즘을 언급할 수 있습니다. 랜덤 포레스트는 독립적인 알고리즘이 아니라 여러 개의 의사결정 트리를 포함하는 의사결정 프레임워크입니다. 이는 의사결정 트리의 하위 전략 위에 있는 부모 전략과 동일합니다. 부모 정책을 통해 자식 정책 클러스터를 구성하고 제어합니다.

다음으로, 우리는 마스터 전략을 설계해야 합니다. 우리는 전체 상품 선물 시장에서 다양한 상품의 유동성, 수익성 및 안정성을 평가하고, 변동성이 낮은 상품 선물 포트폴리오를 선별한 다음, 산업 중립성을 수행할 수 있습니다. 다양한 선택을 통해 산업, 전반적인 변동성은 더욱 감소될 수 있습니다. 마지막으로, 실제 상품 선물 다품종 포트폴리오는 거래를 위한 시장 가치 매칭을 통해 구성됩니다.

각 제품은 또한 여러 매개변수 전략으로 구성할 수 있습니다. 백테스트 성과가 좋은 매개변수 조합을 선택할 수 있습니다. 시장 추세가 명확할 때, 여러 매개변수 전략은 일반적으로 일관되게 수행되며, 이는 포지션을 추가하는 것과 같습니다. 시장이 변동성이 큰 시장에서 다중 매개변수 전략을 사용하여 성과를 높일 수 있습니다. 전략은 종종 일관성 없이 작동하므로 각각은 롱 또는 숏을 통해 위험을 헤지하는데, 이는 포지션을 줄이는 것과 같습니다. 이를 통해 전체 수익률은 그대로 유지하면서 포트폴리오의 최대 수익률을 더욱 낮출 수 있습니다.

2. 클래식 퓨처스 CTA 전략 사례

뉴턴은 이렇게 말했습니다. "내가 다른 사람보다 더 멀리 볼 수 있다면, 그건 거인들의 어깨 위에 서 있기 때문이다."

시장에 공개된 CTA 전략으로는 이동평균 전략, 볼린저 밴드 전략, 터틀 트레이딩 방법, 모멘텀 전략, 차익거래 전략 등이 있습니다. 양적 거래 전략은 모두 하나의 특징을 가지고 있는데, 그것은 빛 속에서 죽는다는 것입니다. 전략이 공개되면 점차 효과가 없어질 것입니다. 하지만 이는 우리가 이러한 전략을 배우고 그 본질을 활용하는 데 영향을 미치지는 않습니다. 따라서 우리는 거인의 어깨 위에 서서 문제를 바라볼 수 있습니다.

2.1 선물 기본 분석(재고, 기준, 가격)

기본 분석은 단기 가격 추세에 대해 걱정할 필요가 없습니다. 가치는 결국 가격에 반영될 것이라고 믿습니다. 가격 뒤에 있는 요인을 분석하고 이 다양성의 가치를 판단하는 것이 더 중요합니다. 일반적으로 거시적 요인, 다양성 요인 및 기타 요인을 기반으로 한 상향식 분석 방법이 채택됩니다.

img

위의 그림을 보면 상품 가격에 영향을 미치는 요인이 많으며, 총 수십 개의 품목이 있습니다. 이를 더 세분화하면 수십 개가 더 있으며, 이러한 데이터는 끊임없이 변화합니다. 개별 개인 투자자들이 이렇게 엄청난 양의 데이터를 얻는 것은커녕 객관적인 분석을 실시하는 것도 불가능한 일이다.

사실, 상품 선물의 기본 분석은 모든 요소를 ​​분석하는 것을 의미하지 않습니다. 우리는 기본 분석의 핵심 요소만 파악하면 복잡한 정보에서 패턴을 찾을 수 있습니다.

거시적 요인
거시경제 데이터는 복잡하고 변화하기 쉽습니다. 매일 매 순간, 다양한 국가의 정치인, 중앙은행, 투자은행에서 공식적이든 비공식적이든 많은 경제 데이터가 발표됩니다. 정치적, 경제적 위기를 제외하면 거시적 분석은 대화에 유용한 소재이기는 하지만 그다지 실용적이지는 않습니다. 미국의 유명한 펀드 운용 전문가인 피터 린치는 한때 자신의 의견을 이렇게 표현했습니다. "나는 매년 경제 동향을 분석하는 데 15분도 쓰지 않습니다."

다양성 요인
기본 분석에서 상품 분석은 주로 프리미엄과 할인, 공급과 수요 관계, 상품 재고, 산업 이익 등을 분석합니다. 상품 선물 상품 요인 분석을 숙지하면 기본적으로 대부분의 시장 동향을 파악할 수 있다고 할 수 있습니다.

선물거래를 해 본 친구라면 국내 상품선물이 간단히 공산품과 농산물로 나뉜다는 걸 알 것입니다. 공산품과 농산물의 분석 방법은 다릅니다. 공급과 수요의 두 가지 측면에서 설명하겠습니다. 공산품의 경우 공급이 비교적 안정적입니다. 주요 기술 혁신이 없다면 생산 능력이 증가할 가능성은 낮습니다. 단기적으로 증가한다. 시간이 지남에 따라 큰 변화가 있으므로 산업 제품 가격에 영향을 미치는 요인은 주로 수요입니다. 농산물 수요는 비교적 안정적이다. 장기적으로는 농산물 수요에 변화가 있지만 단기적으로는 농산물 수요가 안정되는 경향이 있다. 따라서 농산물 가격에 영향을 미치는 요인 주로 공급입니다.

따라서 경제학의 법칙에 따르면 궁극적으로 상품의 가격을 결정하는 것은 수요와 공급의 관계입니다. 이론적으로, 우리가 수요와 공급 데이터를 얻을 수만 있다면, 우리는 상품의 미래 가격을 판단할 수 있습니다. 산업 제품의 경우 공급 데이터는 비교적 쉽게 얻을 수 있지만 수요 데이터는 얻기 어렵습니다. 농산물의 경우 수요 데이터는 비교적 쉽게 얻을 수 있지만 공급 데이터는 얻기 어렵습니다.

사실, 우리는 더 나아가 뺄셈을 할 수 있습니다. 경제 시장에서 공급과 수요의 상호 결과는 재고입니다. 우리는 재고 데이터를 사용하여 시장 공급과 수요 간의 관계의 강도를 판단할 수 있습니다. 특정 상품의 재고가 매우 높은 경우, 시장 공급의 힘이 수요보다 크다는 것을 의미하며, 외부 조건이 변하지 않는 한 해당 상품의 가격은 하락할 것입니다. 특정 상품의 재고가 매우 부족하다면 시장 수요의 힘이 공급보다 크다는 것을 의미하며, 외부 조건이 변하지 않는다면 해당 상품의 가격은 곧 상승할 것입니다.

상품 재고를 분석하는 것 외에도 현물시장과 선물시장의 가격 차이, 즉 소위 베이시스를 분석하는 것도 필요합니다. 선물 가격이 현물 가격보다 높으면 이를 프리미엄이라고 하고, 선물 가격이 현물 가격보다 낮으면 이를 할인이라고 합니다. 선물거래 인도 제도에 따르면, 선물거래 인도일에는 선물가격이 현물가격과 같아야 합니다.

img

프리미엄이건 할인이건, 선물거래 시스템의 제약으로 인해 이론적으로는 거래일의 선물가격은 현물가격과 같아야 합니다. 인도일이 다가올수록 현물 가격과 선물 가격은 일정하게 유지되는 경향이 있는데, 하나는 선물 가격이 현물로 돌아오는 것이고, 다른 하나는 현물 가격이 선물 가격으로 돌아오는 것입니다.

위의 원칙에 기초하여, 재고와 베이시스를 활용하여 미래의 선물 가격을 동시에 결정할 수 있습니다. 상품의 재고가 적고, 선물 가격이 현물 가격보다 훨씬 낮다면, 현물 시장의 수요가 공급보다 크다는 결론을 내릴 수 있으며, 앞으로 현물 가격이 상승할 확률이 높습니다. 인도일이 다가올수록 선물 가격은 현물 가격과 일치하도록 상승하며, 앞으로도 선물 가격이 상승할 확률이 커집니다.

마지막으로, 우리는 재고와 베이시스를 통해 미래 가격의 가장 가능성 있는 방향을 결정했지만, 더 이상 정확한 매수 및 매도 시점은 없으므로 명확한 진입 및 청산 신호를 알려주는 기술적 분석이 필요합니다. 기본 분석의 전체 틀은 다음과 같습니다. 낮은 재고 + 큰 할인 + 기술적 분석 강세 신호 = 롱; 높은 재고 + 큰 프리미엄 + 기술적 분석 약세 신호 = 숏.

2.2 거북이 거래 규칙

거래 전략에 관해서라면, 대표적인 거북이 거래 규칙에 대해 이야기하지 않을 수 없습니다. 거북이 거래 규칙은 상품 투기꾼 리차드 데니스가 훌륭한 거래자가 타고나는 것인지, 아니면 만들어지는 것인지 알아내고자 했던 거래 역사상 가장 유명한 실험에서 유래되었습니다. 이를 위해 그는 1983년에 13명을 모집하여 선물 거래의 기본 개념과 자신의 거래 방식과 원칙을 그들에게 가르쳤습니다. 이 학생들은 "바다 거북이"라고 불립니다.

그 후 4년 동안 거북이들은 연평균 80%의 복리 수익률을 달성했습니다. 데니스는 또한 간단한 시스템과 규칙을 사용하면 거래 경험이 거의 없거나 전혀 없는 사람도 훌륭한 거래자가 될 수 있음을 보여주었습니다. 하지만 일부 거북이들은 이익을 위해 웹사이트에서 거북이 거래 규칙을 판매합니다. 이런 행동을 막기 위해, 원래 거북이 두 명인 커티스 페이스와 아서 매독은 거북이 거래 규칙을 웹사이트를 통해 대중에게 무료로 공개하기로 결정했습니다.

진실이 밝혀진 후 사람들은 거북이 거래 규칙이 최적화된 돈키안 채널을 채택하고 포지션 관리에 ATR 지표를 사용한다는 것을 알게 되었습니다. 수십 년간의 역사적 검증을 거쳐 이제는 일반 개인 투자자가 쉽게 돈을 벌 수 있는 거래 방법이 되었으며, 특정 상품에는 여전히 효과적입니다.

거북이 핵심 원칙

  • 우위를 점하세요: 장기적으로 긍정적인 수익을 창출할 것으로 예상되는 긍정적인 기대값을 갖는 거래 전략을 찾으세요.
  • 위험 관리: 위험을 통제하고 자신의 입장을 고수하십시오. 그렇지 않으면 결과를 창출하는 날을 보지 못할 수도 있습니다.
  • 변함없는 헌신: 전략을 변함없이 실행해야만 체계적인 결과를 얻을 수 있습니다.
  • 단순성과 명확성: 장기적으로 볼 때, 간단한 시스템은 복잡한 시스템보다 더 실행 가능합니다.

그럼 다음으로, 거북이 거래 규칙이 실제로 무엇을 말하는지 살펴보겠습니다.

  1. 시장 - 무엇을 사고 팔 것인가, 본질적으로 어떤 시장에서 거래할 것인가. 거북이들은 선물 거래자였고, 거래량이 많고 유동성이 높은 시장만 선택했습니다. 거래량이 적은 시장을 선택하면 손실 위험이 커지기 때문입니다. 돈. 시장에서 빠져나올 때의 추가적인 미끄러짐은 또한 많은 트렌드 기회를 놓치게 할 것입니다.
  2. 포지션 크기 - 얼마를 사고 팔 것인가는 전체 전략에서 매우 중요한 부분이지만, 대부분의 사람들은 이를 무시하거나 잘못 취급합니다. 거북이 거래 규칙은 ATR(평균 참 범위) 지표를 사용하여 포지션 개시, 신호 추가, 손절매 신호를 계산합니다. 이것은 매우 영리한 설계로, 시장의 절대 변동성에 따라 포지션 크기를 조정하도록 의도되었습니다. 시장 변동성이 강하면 포지션 크기가 줄어들고, 시장 변동성이 약하면 포지션 크기가 늘어납니다. . 먼저 단위를 정의합니다. 이 단위의 공식은 다음과 같습니다. (총 자산)*1%)/ATR. 초기 포지션은 1유닛입니다. 해당일의 상품 하락이 ATR 수준에 도달하더라도 해당일의 손실은 전체 자산의 1% 이내에서 통제 가능합니다. 가격이 0.5단위 상승하면 롱 포지션은 1단위씩, 최대 4단위까지 증가합니다.
  3. 시장 진입 - 거북이가 시장에 진입하는 것은 돈키안 채널을 따릅니다. 가격이 이전 20 또는 55 K-라인의 최고 가격 위로 오르면 시장에 진입하여 롱을 합니다. 가격이 아래로 떨어지면 이전 20 또는 55 K-라인의 가장 낮은 가격에 진입하면 롱 포지션을 취하기 위해 시장에 진입합니다. 그냥 시장에 진입해서 숏 포지션을 취합니다. 마감가나 다음 K-라인을 기다리지 말고 신호가 나타나면 거래를 시작하세요.
  4. 손절매 - 장기적으로 손절매 없는 거래는 성공할 수 없지만, 대부분의 거래자는 시장이 반전될 것이라는 희망으로 손실 포지션을 유지합니다. 거북이들은 손실 포지션을 종료할 때 엄격한 규칙을 가지고 있었습니다. 롱 포지션을 유지하고 가격이 2단위 하락하면 롱 포지션은 손절매로 마감되었습니다. 숏 포지션을 유지하고 가격이 2단위 상승하면 숏 포지션은 손절매로 종료됩니다.
  5. 이익 실현 - 거북이의 이익 실현은 많은 유동적 이익을 잃는 것을 의미하는데, 이는 많은 트레이더가 받아들이기 어려워하는 부분이기도 합니다. 현재 롱 포지션을 보유하고 있고 가격이 10일 Donchian Channel의 하단 트랙 아래로 떨어지는 경우 모든 롱 포지션을 닫으십시오. 현재 숏 포지션을 보유하고 있고 가격이 10일 Donchian Channel의 상단 트랙 위로 오르는 경우 돈키안 채널, 모든 단기 포지션을 종료합니다.

여기서 우리는 거북이 거래 규칙이 간단해 보이지만 실제로는 실제 거래 시스템의 원형을 형성했다는 것을 알 수 있습니다. 그것은 완전한 거래 시스템의 모든 측면을 포괄하며 거래자에게는 여지를 남기지 않습니다. 주관적인 상상력을 위한 여지가 있습니다. 그리고 의사 결정을 통해 시스템의 프로그래밍된 작동의 장점을 최대한 활용할 수 있습니다. 포함 사항: 진입 및 퇴장 규칙, 자금 관리 및 위험 관리 등

거북이 거래 방법의 가장 큰 장점은 효과적인 거래 방법을 확립하는 데 도움이 된다는 것입니다. 일괄 오픈, 동적 손절매 및 손절매, 시장 추세 추종, 특히 ATR 값과 포지션 사용을 결합한 전략입니다. 관리. 개념은 배울 가치가 있습니다. 물론, 추세 추종 전략에는 실현되지 않은 이익을 취한다는 일반적인 문제가 있습니다. 상승세를 쫓으며 얻은 수익은 이후의 급격한 하락으로 인해 모두 사라질 가능성이 큽니다. 큰 추세에서는 매우 강하지만, 변동성이 큰 시장에서는 성과가 좋지 않습니다.

3. 미래 CTA 전략의 실질적 발전

3.1 Mai 언어 기반 CTA 트렌드 전략 개발

지난 세기 말, 마법 같은 거래 방법이 미국 금융 투자 분야에서 인기를 얻기 시작했습니다. 수천 명의 사람들이 이를 연습한 후, 사람들은 이 방법이 효과적이고 큰 실용적 가치가 있음을 알게 되었습니다. 동시에 , 많은 투자 전문가들이 인정했습니다. 전문 트레이더들이 인정하고 있으며 외환, 금, 주식, 선물, 원유 또는 지수와 채권 등 거의 모든 금융 투자 분야에 완벽하게 적용될 수 있습니다. 이것은 혼돈의 운영 방식.

혼돈이라는 단어는 원래 우주의 혼돈스러운 상태에 대한 설명을 가리킨다. 그 아이디어는 결과가 불가피하지만 기존 지식으로 인해 계산할 수 없다는 것이다. 왜냐하면 계산 자체도 결과를 바꾸고 최대 또는 최소 결과는 결국 나타날 수 있지만 필연성은 없습니다. 결과. 이는 시장 참여자가 시장을 분석하고 매수 및 매도 거래를 하면서 시장을 바꾸는 시장 거래와 매우 유사합니다. 시장은 영원히 가변적입니다. 참여자가 새로운 시장 형태에 대해 알게 되면, 시장도 참여자가 그것을 인식한다는 것을 알게 되고, 그러면 돌연변이가 발생합니다. 그리고 그것은 확실히 참가자들에게 알려지지 않은 방향으로 돌연변이하는 경향이 있을 것입니다. 그것은 참가자들이 변화하는 패턴을 포착하지 못하도록 막을 만큼의 지혜를 가지고 있습니다. 다시 말해, 시장은 안정적이지 않으며, 시장의 과거에 대한 이해는 미래를 대표할 수 없습니다.

카오스 운영 방식은 빌 윌리엄스가 발명한 투자 아이디어, 거래 전략, 진입 및 청산 신호의 완전한 세트입니다. 현재 많은 국제 투자자들이 혼돈 운영 방식을 사용하여 시장 거래에 참여하고 있습니다. 우리나라 금융 시장의 발전이 더딘 데다 혼돈 이론이 비교적 새로운 개념이기 때문에 중국에서는 혼돈 운영 방식을 연구하는 사람이 적습니다. Chaos Operation Method는 주식, 채권, 선물, 외환, 디지털 통화 등 거의 모든 금융 투자 분야에 적용 가능한 매우 보편적인 트레이딩 전략이므로 본 과정에서는 Chaos Strategy의 간소화된 버전을 시작점으로 사용합니다. 모든 사람의 투자 관심과 수익을 향상시킵니다.

이름에서 알 수 있듯이, 카오스 연산법의 이론적 근거는 카오스 이론입니다. 카오스 이론은 기상학자 에드워드 로렌츠가 제안한 이론으로, 20세기 후반의 가장 위대한 과학적 발견 중 하나입니다. 그는 유명한 "나비 효과"를 제안한 사람이었습니다. 빌 윌리엄스는 금융 투자 분야에 혼돈 이론을 창의적으로 적용하고 이를 프랙탈 기하학, 비선형 동역학 및 기타 분야와 결합하여 매우 효과적인 일련의 기술 분석 지표를 만들어냈습니다.

전체 카오스 운영 방법은 5가지 차원(기술 지표)으로 구성됩니다.

  • 악어

  • 프랙탈

  • 모멘텀

  • 가속

  • 밸런스 라인

    img

위의 그림을 살펴보겠습니다. Alligator Line은 프랙탈 기하학과 비선형 동역학을 사용하는 균형선 세트입니다. 그 본질은 확장된 지수 가중 이동 평균이며, 이는 이동 평균의 한 유형이지만 계산 방법은 약간 더 복잡합니다. 일반적인 이동 평균보다. 일부. 다음으로, Mai 언어로 Alligator 줄을 정의하는 방법을 살펴보겠습니다.

// 参数 N1:=11; N2:=21; // 定义价格中线 N3:=N1+N2; N4:=N2+N3; HL:=(H+L)/2; // 鳄鱼线 Y^^SMA(REF(HL,N3),N4,1); R:=SMA(REF(HL,N2),N3,1); G:=SMA(REF(HL,N1),N2,1);

먼저, 두 개의 외부 매개변수 N1과 N2를 정의한 다음, 외부 매개변수를 기반으로 최고 가격과 최저 가격의 평균 HL을 계산합니다. 그런 다음 각각 다른 매개변수를 사용하여 평균 HL을 계산합니다. 립 키스의 경우, 중간선의 작은 주기. 다시 평균화하면, 치아는 중간선의 중간 주기의 평균이고, 턱은 중간선의 큰 주기의 평균입니다. 이 전략에서는 턱을 사용합니다.

프랙탈의 개념은 Chaos Operation Method에서 매우 생생하게 정의됩니다. 비유를 들 수 있습니다. 손가락을 위로 향하게 하여 손바닥을 펼칩니다. 가운데 손가락은 위쪽 프랙탈이고, 새끼손가락과 약손가락은 왼쪽이고, 검지손가락은 오른쪽의 손가락과 엄지는 부상이 없는 부위를 나타냅니다. 새로운 하이의 K-라인. 기본적인 프랙탈은 5개의 K-선으로 구성됩니다. 그러면 다음 코드를 사용하여 프랙탈을 정의할 수 있습니다.

// 分形 TOP_N:=BARSLAST(REF(H,2)=HHV(H,5))+2; BOTTOM_N:=BARSLAST(REF(L,2)=LLV(L,5))+2; TOP:=REF(H,TOP_N); BOTTOM:=REF(L,BOTTOM_N); MAX_YRG^^MAX(MAX(Y,R),G); MIN_YRG^^MIN(MIN(Y,R),G); TOP_FRACTAL^^VALUEWHEN(H>=MAX_YRG,TOP); BOTTOM_FRACTAL^^VALUEWHEN(L<=MIN_YRG,BOTTOM);

앨리게이터 선과 프랙탈을 계산한 후, 이 두 가지 조건을 기반으로 간단한 카오스 연산 전략을 작성할 수 있습니다. 즉, 지수 가중 이동 평균선을 벤치마크 가격으로 사용하여 앨리게이터 선과 프랙탈 지표를 계산할 수 있습니다. 물론, 원래의 카오스 작전 전략은 더 복잡했습니다. 코드는 다음과 같습니다.

// 如果当前无多单,并且收盘价升破上分形,并且上分形在鳄鱼线上方时,多头开仓 BKVOL=0 AND C>=TOP_FRACTAL AND TOP_FRACTAL>MAX_YRG,BPK(1); // 如果当前无空单,并且收盘价跌破下分形,并且下分形在鳄鱼线下方时,空头开仓 SKVOL=0 AND C<=BOTTOM_FRACTAL AND BOTTOM_FRACTAL<MIN_YRG,SPK(1); // 如果收盘价跌破鳄鱼的下巴时,多头平仓 C<Y,SP(BKVOL); // 如果收盘价升破鳄鱼的下巴时,空头平仓 C>Y,BP(SKVOL);

이해하기 쉽게 하기 위해 코드에 자세한 주석을 포함했습니다. 이 전략의 거래 논리를 다음과 같이 간단히 나열할 수 있습니다.

  • 롱 포지션을 엽니다. 현재 롱 주문이 없고, 종가가 상단 프랙탈을 돌파하고, 상단 프랙탈이 엘리게이터 선 위에 있는 경우입니다.
  • 숏 포지션을 엽니다. 현재 숏 오더가 없고, 종가가 하위 프랙탈 아래로 떨어지고, 하위 프랙탈이 엘리게이터 선 아래에 있는 경우입니다.
  • 롱 포지션 종료: 종가가 엘리게이터 턱 아래로 떨어질 경우.
  • 숏 포지션 종료: 종가가 엘리게이터 턱 위로 떨어질 경우.

다음으로 이 간단한 카오스 운영 전략의 백테스트 결과를 살펴보겠습니다. 백테스트를 실제 거래 환경에 더 가깝게 만들기 위해 거래 수수료는 거래소 수수료의 두 배로 설정되었으며, 포지션 개시 및 종료에 대해 2점프의 슬리피지가 추가되었습니다. 백테스팅에 사용된 데이터 유형은 철근 지수이고, 거래 유형은 철근 주요 연속이며, 오픈 포지션은 1랏으로 고정되어 있습니다. 아래는 1시간 수준의 예비 백테스트 성과 보고서입니다.

img
img
img

자본 곡선과 백테스트 성과 데이터를 판단해 볼 때, 해당 전략은 좋은 성과를 보이고 있으며 전체 자본 곡선은 꾸준히 상승하고 있습니다. 그러나 2016년 말 이후 철근 시장 특성은 기존의 높은 변동성의 일방적 추세에서 광범위한 변동으로 바뀌었습니다. 자본곡선을 보면, 2017년 이후 이익이 확실히 약세를 보였습니다.

간단히 말해서, 카오스 운영법의 본질은 전환점을 찾는 것입니다. 시장이 어떻게 돌아가는지, 진짜 돌파구인지 거짓 돌파구인지에 대해 걱정할 필요가 없습니다. 프랙탈을 돌파하면 진입할 수 있습니다. 시장에 직접. 시장을 예측하려 하지 말고, 관찰자이자 추종자가 되세요.

3.2 JavaScript 언어 기반 CTA 아비트라지 전략 개발

소로스는 1987년에 쓴 그의 책 "금융의 연금술"에서 중요한 명제를 내놓았습니다. 나는 시장 가격이 미래에 편향되어 있다는 의미에서 항상 틀렸다고 믿습니다. 그는 시장 효율성 가설이 단지 이론적 가정일 뿐이라고 믿는다. 사실, 시장 참여자들은 항상 합리적이지는 않으며, 모든 시점에서 참여자들이 모든 정보를 완전히 얻고 객관적으로 해석하는 것은 불가능하다. 게다가, 같은 정보에 대한 피드백은 사람마다 다릅니다. 즉, 가격 자체에 이미 시장 참여자들의 잘못된 기대가 포함되어 있으므로, 시장 가격은 본질적으로 항상 잘못된 것입니다. 이는 중재자에게 이익의 원천이 될 수 있습니다.

위의 원리에 근거하여, 우리는 비효율적인 선물 시장에서는 서로 다른 기간의 인도 계약에 대한 시장 영향이 항상 동기화되지 않으며, 가격 책정이 완전히 효과적이지 않다는 것을 알 수 있습니다. 이후, 서로 다른 기간의 동일 거래 대상의 인도계약 가격을 기준으로, 두 가격 사이에 큰 가격 차이가 있는 경우, 서로 다른 기간의 선물계약을 동시에 매수/매도하여 기간 간 차익거래를 진행할 수 있습니다.

상품 선물과 마찬가지로 디지털 통화에도 여러 기간의 차익거래 계약이 결합되어 있습니다. 예를 들어, OkEX 거래소에는 ETC Weekly, ETC Biweekly, ETC Quarterly가 있습니다. 예를 들어, ETC 주간과 ETC 분기별 가격 차이가 장기간 5 정도로 유지된다고 가정해 보겠습니다. 만약 어느 날 스프레드가 7에 도달한다면, 미래의 어느 시점에서 스프레드가 5로 돌아올 것으로 예상됩니다. 그러면 매주 ETC를 매도하고 분기별로 ETC를 매수해 스프레드를 단축할 수 있습니다. 그 반대도 마찬가지다.

이러한 가격 차이는 존재하지만, 수동 차익거래는 시간이 많이 걸리는 수동 작업, 정확도 저하, 가격 변화의 영향 등으로 인해 많은 불확실성을 수반하는 경우가 많습니다. 정량적 차익거래의 매력은 정량적 모델을 통해 차익거래 기회를 포착하고 차익거래 거래 전략을 수립하는 것과 더불어, 프로그램된 알고리즘을 통해 거래소에 자동으로 거래 주문을 내어, 신속하고 정확하게 기회를 포착하고 효율적이고 안정적으로 수익을 창출하는 데 있습니다.

이 과정에서는 디지털 통화 거래에서 Inventor Quantitative Trading Platform과 OkEX 거래소의 ETC 선물 계약을 사용하는 방법과 간단한 차익거래 전략을 사용하여 즉각적인 차익거래 기회를 포착하고 수익을 얻을 수 있는 모든 기회를 잡는 방법을 보여줍니다. 발생 가능한 위험을 헤지하는 것.

암호화폐 교차기간 중재 전략 만들기
난이도: 보통
전략적 환경

  • 거래주체 : 이더리움 클래식(ETC)
  • 가격 차이 데이터: ETC 주간 - ETC 분기별(공적분 테스트 생략)
  • 거래주기: 5분
  • 포지션 매칭 : 1:1
  • 거래 유형: 동일 제품 교차 기간

전략 논리

  • 롱 스프레드 개설 조건: 현재 계좌에 포지션이 없고 스프레드가 하단 볼 트랙보다 낮을 경우, 스프레드에 대해 롱 포지션을 취하세요. 즉, 일주일 동안 ETC를 매수하고 분기 동안 ETC를 매도하는 것입니다.
  • 숏 스프레드 포지션을 개설하기 위한 조건: 현재 계좌에 포지션이 없고 스프레드가 볼 상단 트랙보다 큰 경우, 스프레드를 숏하세요. 즉, 일주일 동안 ETC를 매도하고 분기 동안 ETC를 매수하는 것입니다.
  • 롱 스프레드를 마감하기 위한 조건: 현재 계좌가 ETC에 대한 주간 롱 포지션과 분기별 숏 포지션을 보유하고 있으며, 스프레드가 볼 중간 추적보다 큰 경우, 롱 스프레드는 마감됩니다. 즉, 일주일 동안 ETC를 매도하고 분기 동안 ETC를 매수하는 것입니다.
  • 숏 스프레드를 마감하기 위한 조건: 현재 계좌가 이번 주에 ETC에 대한 숏 포지션을 보유하고 있고, 이번 분기에 ETC에 대한 롱 포지션을 보유하고 있으며, 스프레드가 볼 중간 트랙보다 작을 경우, 숏 스프레드는 마감됩니다. 즉, 일주일 동안 ETC를 매수하고 분기 동안 ETC를 매도하는 것입니다.

위의 내용은 디지털 통화 교차 기간 차익 거래 전략의 논리에 대한 간단한 설명입니다. 그러면 프로그램에서 아이디어를 어떻게 구현합니까? 우리는 먼저 Inventor Quantitative Trading Platform에 프레임워크를 구축하려고 했습니다.

function Data() {} // 基础数据函数 Data.prototype.mp = function () {} // 持仓函数 Data.prototype.boll = function () {} // 指标函数 Data.prototype.trade = function () {} // 下单函数 Data.prototype.cancelOrders = function () {} // 撤单函数 Data.prototype.isEven = function () {} // 处理单只合约函数 Data.prototype.drawingChart = function () {} // 画图函数 function onTick() { var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象 var accountStocks = data.accountData.Stocks; // 账户余额 var boll = data.boll(dataLength, timeCycle); // 计算boll技术指标 data.trade(); // 计算交易条件下单 data.cancelOrders(); // 撤单 data.drawingChart(boll); // 画图 data.isEven(); // 处理持有单个合约 } //入口函数 function main() { while (true) { // 进入轮询模式 onTick(); // 执行onTick函数 Sleep(500); // 休眠0.5秒 } }

감독자 거래에서 우리의 거래 과정이 어떤지 상상해 보세요? 시스템 트레이딩에는 본질적인 차이가 없으며, 단지 데이터를 얻고, 데이터를 계산하고, 주문을 내고, 주문 후 처리하는 것일 뿐입니다. 프로그램에서도 마찬가지입니다. 먼저 프로그램은 20번째 줄에서 메인 함수를 실행합니다. 이는 관례입니다. 프로그램이 거래 전략 전처리(있는 경우)를 완료하면 무한 루프 모드에 들어갑니다. 즉, 라운드 폴링 모드. 폴링 모드에서는 onTick 함수가 반복적으로 실행됩니다.

그런 다음 onTick 함수에서 주관적 거래의 거래 프로세스를 갖습니다. 먼저 기본 가격 데이터를 가져온 다음 계정 잔액을 가져온 다음 지표를 계산한 다음 거래 조건을 계산하고 주문을 내고 마지막으로 주문을 한 후 처리합니다. 주문 취소, 그림 그리기, 개별 계약 처리 등을 포함한 주문.

전략적 아이디어와 거래 과정을 비교함으로써 쉽게 전략 프레임워크를 구축할 수 있습니다. 전체 전략은 세 단계로 단순화될 수 있습니다.

  • 거래 전 처리.
  • 데이터를 얻고 계산합니다.
  • 주문을 하고 후속 조치를 처리합니다.

거래 전략 프레임워크를 구축한 후에는 실제 거래 프로세스와 거래 세부 정보를 기반으로 전략 프레임워크에 필요한 세부 코드를 입력해야 합니다.

1. 거래 전 처리

1. 필요한 전역 변수를 선언합니다.

  • 차트를 구성하기 위해 차트 객체를 선언합니다.
    var chart = {}
  • 차트 함수를 호출하여 차트를 초기화합니다.
    var ObjChart = Chart ( chart )
  • 가격 차이 시퀀스를 저장하기 위해 빈 배열을 선언하세요.
    var bars = []
  • 과거 데이터 타임스탬프를 기록하기 위한 변수를 선언합니다.
    var oldTime = 0

2. 전략의 외부 매개변수 구성

var tradeTypeA = "this_week"; // 套利A合约 var tradeTypeB = "quarter"; // 套利B合约 var dataLength = 10; //指标周期长度 var timeCycle = 1; // K线周期 var name = "ETC"; // 币种 var unit = 1; // 下单量

3. 데이터 처리 기능 정의

  • 기본 데이터 함수 : Data ( )
    생성자 Data를 만들고 내부 속성을 정의합니다. 포함 내용: 계좌 데이터, 포지션 데이터, K-라인 데이터 타임스탬프, 중재 A/B 계약 매수/매도 가격, 정방향/역방향 중재 스프레드.
function Data(tradeTypeA, tradeTypeB) { // 传入套利A合约和套利B合约 this.accountData = _C(exchange.GetAccount); // 获取账户信息 this.positionData = _C(exchange.GetPosition); // 获取持仓信息 var recordsData = _C(exchange.GetRecords); //获取K线数据 exchange.SetContractType(tradeTypeA); // 订阅套利A合约 var depthDataA = _C(exchange.GetDepth); // 套利A合约深度数据 exchange.SetContractType(tradeTypeB); // 订阅套利B合约 var depthDataB = _C(exchange.GetDepth); // 套利B合约深度数据 this.time = recordsData[recordsData.length - 1].Time; // 获取最新数据时间 this.askA = depthDataA.Asks[0].Price; // 套利A合约卖一价 this.bidA = depthDataA.Bids[0].Price; // 套利A合约买一价 this.askB = depthDataB.Asks[0].Price; // 套利B合约卖一价 this.bidB = depthDataB.Bids[0].Price; // 套利B合约买一价 // 正套价差(合约A卖一价 - 合约B买一价) this.basb = depthDataA.Asks[0].Price - depthDataB.Bids[0].Price; // 反套价差(合约A买一价 - 合约B卖一价) this.sabb = depthDataA.Bids[0].Price - depthDataB.Asks[0].Price; }
  • 위치 가져오기 함수 : mp()
    전체 위치 배열을 탐색하고 지정된 계약 및 방향의 위치 수를 반환합니다. 없으면 false를 반환합니다.
Data.prototype.mp = function (tradeType, type) { var positionData = this.positionData; // 获取持仓信息 for (var i = 0; i < positionData.length; i++) { if (positionData[i].ContractType == tradeType) { if (positionData[i].Type == type) { if (positionData[i].Amount > 0) { return positionData[i].Amount; } } } } return false; }
  • K-라인 및 인디케이터 기능 : boll()
    전방/역방위 차익거래 스프레드 데이터를 기반으로 새로운 K-라인 시퀀스를 합성합니다. 그리고 볼 지표에 의해 계산된 상단 레일, 중간 레일, 하단 레일 데이터를 반환합니다.
Data.prototype.boll = function (num, timeCycle) { var self = {}; // 临时对象 // 正套价差和反套价差中间值 self.Close = (this.basb + this.sabb) / 2; if (this.timeA == this.timeB) { self.Time = this.time; } // 对比两个深度数据时间戳 if (this.time - oldTime > timeCycle * 60000) { bars.push(self); oldTime = this.time; } // 根据指定时间周期,在K线数组里面传入价差数据对象 if (bars.length > num * 2) { bars.shift(); // 控制K线数组长度 } else { return; } var boll = TA.BOLL(bars, num, 2); // 调用talib库中的boll指标 return { up: boll[0][boll[0].length - 1], // boll指标上轨 middle: boll[1][boll[1].length - 1], // boll指标中轨 down: boll[2][boll[2].length - 1] // boll指标下轨 } // 返回一个处理好的boll指标数据 }
  • 주문 기능 : trade ( )
    주문 계약명과 주문 유형을 전달한 후, 대가 가격으로 주문을 넣고, 주문을 넣은 후 결과를 반환합니다. 동시에 서로 다른 방향으로 두 개의 주문을 내야 하므로, 매수/매도 가격은 주문 계약명에 따라 함수 내에서 변환됩니다.
Data.prototype.trade = function (tradeType, type) { exchange.SetContractType(tradeType); // 下单前先重新订阅合约 var askPrice, bidPrice; if (tradeType == tradeTypeA) { // 如果是A合约下单 askPrice = this.askA; // 设置askPrice bidPrice = this.bidA; // 设置bidPrice } else if (tradeType == tradeTypeB) { // 如果是B合约下单 askPrice = this.askB; // 设置askPrice bidPrice = this.bidB; // 设置bidPrice } switch (type) { // 匹配下单模式 case "buy": exchange.SetDirection(type); // 设置下单模式 return exchange.Buy(askPrice, unit); case "sell": exchange.SetDirection(type); // 设置下单模式 return exchange.Sell(bidPrice, unit); case "closebuy": exchange.SetDirection(type); // 设置下单模式 return exchange.Sell(bidPrice, unit); case "closesell": exchange.SetDirection(type); // 设置下单模式 return exchange.Buy(askPrice, unit); default: return false; } }
  • 주문 취소 기능 : cancelOrders()
    이행되지 않은 모든 주문을 모아서 하나씩 취소합니다. 그리고 이행되지 않은 주문이 있으면 false를 반환하고, 이행되지 않은 주문이 없으면 true를 반환합니다.
Data.prototype.cancelOrders = function () { Sleep(500); // 撤单前先延时,因为有些交易所你懂的 var orders = _C(exchange.GetOrders); // 获取未成交订单数组 if (orders.length > 0) { // 如果有未成交的订单 for (var i = 0; i < orders.length; i++) { //遍历未成交订单数组 exchange.CancelOrder(orders[i].Id); //逐个取消未成交的订单 Sleep(500); //延时0.5秒 } return false; // 如果取消了未成交的单子就返回false } return true; //如果没有未成交的订单就返回true }
  • 단일 계약 보유 처리: isEven()
    중재 거래에서 싱글 레그 상황을 다룰 때 우리는 단순히 모든 포지션을 종료하여 상황을 처리합니다. 물론, 후속 주문 방법으로 변경할 수도 있습니다.
Data.prototype.isEven = function () { var positionData = this.positionData; // 获取持仓信息 var type = null; // 转换持仓方向 // 如果持仓数组长度余2不等于0或者持仓数组长度不等于2 if (positionData.length % 2 != 0 || positionData.length != 2) { for (var i = 0; i < positionData.length; i++) { // 遍历持仓数组 if (positionData[i].Type == 0) { // 如果是多单 type = 10; // 设置下单参数 } else if (positionData[i].Type == 1) { // 如果是空单 type = -10; // 设置下单参数 } // 平掉所有仓位 this.trade(positionData[i].ContractType, type, positionData[i].Amount); } } }
  • 그리기 함수 : drawingChart()
    ObjChart.add() 메서드를 호출하여 차트에 필요한 시장 데이터와 지표 데이터(상단 트랙, 중간 트랙, 하단 트랙, 양수/음수 스프레드)를 그립니다.
Data.prototype.drawingChart = function (boll) { var nowTime = new Date().getTime(); ObjChart.add([0, [nowTime, boll.up]]); ObjChart.add([1, [nowTime, boll.middle]]); ObjChart.add([2, [nowTime, boll.down]]); ObjChart.add([3, [nowTime, this.basb]]); ObjChart.add([4, [nowTime, this.sabb]]); ObjChart.update(chart); }

4. 진입 함수 main()에서 사전 트랜잭션 전처리 코드를 실행합니다. 이 코드는 프로그램이 시작된 후 한 번만 실행됩니다. 포함하다:

  • 콘솔에서 덜 중요한 정보 필터링SetErrorFilter ( )
  • 거래할 디지털 화폐를 설정하세요exchange.IO ( )
  • 프로그램을 시작하기 전에 이전에 그린 차트를 지웁니다.ObjChart.reset ( )
  • 프로그램이 시작되기 전에 이전 상태 표시줄 정보를 지웁니다.LogProfitReset ( )

위에서 설명한 거래 전처리 과정을 정의한 후 다음 단계로 넘어가서 폴링 모드로 들어가서 onTick() 함수를 반복해서 실행합니다. 그리고 Sleep()이 폴링할 때 슬립 시간을 설정해야 합니다. 일부 암호화폐 거래 API는 특정 기간 동안의 접근 제한을 기본으로 가지고 있기 때문입니다.

function main() { // 过滤控制台中不是很重要的信息 SetErrorFilter("429|GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout|Futures_OP"); exchange.IO("currency", name + '_USDT'); //设置要交易的数字货币币种 ObjChart.reset(); //程序启动前清空之前绘制的图表 LogProfitReset(); //程序启动前清空之前的状态栏信息 while (true) { // 进入轮询模式 onTick(); // 执行onTick函数 Sleep(500); // 休眠0.5秒 } }

2. 데이터 획득 및 계산

  1. 거래 로직에 사용할 기본 데이터 객체, 계정 잔액 및 볼 지표 데이터를 가져옵니다.
function onTick() { var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象 var accountStocks = data.accountData.Stocks; // 账户余额 var boll = data.boll(dataLength, timeCycle); // 获取boll指标数据 if (!boll) return; // 如果没有boll数据就返回 }

3. 주문하고 후속 조치하기

  1. 위의 전략 논리에 따라 매수 및 매도 작업을 실행합니다. 먼저 가격 및 지표 조건이 충족되는지 판단하고, 그 다음 포지션 조건이 충족되는지 판단한 후 마지막으로 거래( ) 주문 함수를 실행합니다.
// 价差说明 // basb = (合约A卖一价 - 合约B买一价) // sabb = (合约A买一价 - 合约B卖一价) if (data.sabb > boll.middle && data.sabb < boll.up) { // 如果sabb高于中轨 if (data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单 data.trade(tradeTypeA, "closebuy"); // 合约A平多 } if (data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单 data.trade(tradeTypeB, "closesell"); // 合约B平空 } } else if (data.basb < boll.middle && data.basb > boll.down) { // 如果basb低于中轨 if (data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单 data.trade(tradeTypeA, "closesell"); // 合约A平空 } if (data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单 data.trade(tradeTypeB, "closebuy"); // 合约B平多 } } if (accountStocks * Math.max(data.askA, data.askB) > 1) { // 如果账户有余额 if (data.basb < boll.down) { // 如果basb价差低于下轨 if (!data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单 data.trade(tradeTypeA, "buy"); // 合约A开多 } if (!data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单 data.trade(tradeTypeB, "sell"); // 合约B开空 } } else if (data.sabb > boll.up) { // 如果sabb价差高于上轨 if (!data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单 data.trade(tradeTypeA, "sell"); // 合约A开空 } if (!data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单 data.trade(tradeTypeB, "buy"); // 合约B开多 } } }
  1. 주문이 접수된 후에는 미처리 주문, 단일 계약 체결 등의 비정상적인 상황을 처리하는 것이 필요합니다. 그리고 차트를 그리죠.
data.cancelOrders(); // 撤单 data.drawingChart(boll); // 画图 data.isEven(); // 处理持有单个合约

위에서 우리는 200줄이 조금 넘는 간단한 디지털 화폐 기간 간 차익거래 전략을 만들어 보았습니다. 전체 코드는 다음과 같습니다.

// 全局变量 // 声明一个配置图表的 chart 对象 var chart = { __isStock: true, tooltip: { xDateFormat: '%Y-%m-%d %H:%M:%S, %A' }, title: { text: '交易盈亏曲线图(详细)' }, rangeSelector: { buttons: [{ type: 'hour', count: 1, text: '1h' }, { type: 'hour', count: 2, text: '3h' }, { type: 'hour', count: 8, text: '8h' }, { type: 'all', text: 'All' }], selected: 0, inputEnabled: false }, xAxis: { type: 'datetime' }, yAxis: { title: { text: '价差' }, opposite: false, }, series: [{ name: "上轨", id: "线1,up", data: [] }, { name: "中轨", id: "线2,middle", data: [] }, { name: "下轨", id: "线3,down", data: [] }, { name: "basb", id: "线4,basb", data: [] }, { name: "sabb", id: "线5,sabb", data: [] }] }; var ObjChart = Chart(chart); // 画图对象 var bars = []; // 存储价差序列 var oldTime = 0; // 记录历史数据时间戳 // 参数 var tradeTypeA = "this_week"; // 套利A合约 var tradeTypeB = "quarter"; // 套利B合约 var dataLength = 10; //指标周期长度 var timeCycle = 1; // K线周期 var name = "ETC"; // 币种 var unit = 1; // 下单量 // 基础数据 function Data(tradeTypeA, tradeTypeB) { // 传入套利A合约和套利B合约 this.accountData = _C(exchange.GetAccount); // 获取账户信息 this.positionData = _C(exchange.GetPosition); // 获取持仓信息 var recordsData = _C(exchange.GetRecords); //获取K线数据 exchange.SetContractType(tradeTypeA); // 订阅套利A合约 var depthDataA = _C(exchange.GetDepth); // 套利A合约深度数据 exchange.SetContractType(tradeTypeB); // 订阅套利B合约 var depthDataB = _C(exchange.GetDepth); // 套利B合约深度数据 this.time = recordsData[recordsData.length - 1].Time; // 获取最新数据时间 this.askA = depthDataA.Asks[0].Price; // 套利A合约卖一价 this.bidA = depthDataA.Bids[0].Price; // 套利A合约买一价 this.askB = depthDataB.Asks[0].Price; // 套利B合约卖一价 this.bidB = depthDataB.Bids[0].Price; // 套利B合约买一价 // 正套价差(合约A卖一价 - 合约B买一价) this.basb = depthDataA.Asks[0].Price - depthDataB.Bids[0].Price; // 反套价差(合约A买一价 - 合约B卖一价) this.sabb = depthDataA.Bids[0].Price - depthDataB.Asks[0].Price; } // 获取持仓 Data.prototype.mp = function (tradeType, type) { var positionData = this.positionData; // 获取持仓信息 for (var i = 0; i < positionData.length; i++) { if (positionData[i].ContractType == tradeType) { if (positionData[i].Type == type) { if (positionData[i].Amount > 0) { return positionData[i].Amount; } } } } return false; } // 合成新K线数据和boll指标数据 Data.prototype.boll = function (num, timeCycle) { var self = {}; // 临时对象 // 正套价差和反套价差中间值 self.Close = (this.basb + this.sabb) / 2; if (this.timeA == this.timeB) { self.Time = this.time; } // 对比两个深度数据时间戳 if (this.time - oldTime > timeCycle * 60000) { bars.push(self); oldTime = this.time; } // 根据指定时间周期,在K线数组里面传入价差数据对象 if (bars.length > num * 2) { bars.shift(); // 控制K线数组长度 } else { return; } var boll = TA.BOLL(bars, num, 2); // 调用talib库中的boll指标 return { up: boll[0][boll[0].length - 1], // boll指标上轨 middle: boll[1][boll[1].length - 1], // boll指标中轨 down: boll[2][boll[2].length - 1] // boll指标下轨 } // 返回一个处理好的boll指标数据 } // 下单 Data.prototype.trade = function (tradeType, type) { exchange.SetContractType(tradeType); // 下单前先重新订阅合约 var askPrice, bidPrice; if (tradeType == tradeTypeA) { // 如果是A合约下单 askPrice = this.askA; // 设置askPrice bidPrice = this.bidA; // 设置bidPrice } else if (tradeType == tradeTypeB) { // 如果是B合约下单 askPrice = this.askB; // 设置askPrice bidPrice = this.bidB; // 设置bidPrice } switch (type) { // 匹配下单模式 case "buy": exchange.SetDirection(type); // 设置下单模式 return exchange.Buy(askPrice, unit); case "sell": exchange.SetDirection(type); // 设置下单模式 return exchange.Sell(bidPrice, unit); case "closebuy": exchange.SetDirection(type); // 设置下单模式 return exchange.Sell(bidPrice, unit); case "closesell": exchange.SetDirection(type); // 设置下单模式 return exchange.Buy(askPrice, unit); default: return false; } } // 取消订单 Data.prototype.cancelOrders = function () { Sleep(500); // 撤单前先延时,因为有些交易所你懂的 var orders = _C(exchange.GetOrders); // 获取未成交订单数组 if (orders.length > 0) { // 如果有未成交的订单 for (var i = 0; i < orders.length; i++) { //遍历未成交订单数组 exchange.CancelOrder(orders[i].Id); //逐个取消未成交的订单 Sleep(500); //延时0.5秒 } return false; // 如果取消了未成交的单子就返回false } return true; //如果没有未成交的订单就返回true } // 处理持有单个合约 Data.prototype.isEven = function () { var positionData = this.positionData; // 获取持仓信息 var type = null; // 转换持仓方向 // 如果持仓数组长度余2不等于0或者持仓数组长度不等于2 if (positionData.length % 2 != 0 || positionData.length != 2) { for (var i = 0; i < positionData.length; i++) { // 遍历持仓数组 if (positionData[i].Type == 0) { // 如果是多单 type = 10; // 设置下单参数 } else if (positionData[i].Type == 1) { // 如果是空单 type = -10; // 设置下单参数 } // 平掉所有仓位 this.trade(positionData[i].ContractType, type, positionData[i].Amount); } } } // 画图 Data.prototype.drawingChart = function (boll) { var nowTime = new Date().getTime(); ObjChart.add([0, [nowTime, boll.up]]); ObjChart.add([1, [nowTime, boll.middle]]); ObjChart.add([2, [nowTime, boll.down]]); ObjChart.add([3, [nowTime, this.basb]]); ObjChart.add([4, [nowTime, this.sabb]]); ObjChart.update(chart); } // 交易条件 function onTick() { var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象 var accountStocks = data.accountData.Stocks; // 账户余额 var boll = data.boll(dataLength, timeCycle); // 获取boll指标数据 if (!boll) return; // 如果没有boll数据就返回 // 价差说明 // basb = (合约A卖一价 - 合约B买一价) // sabb = (合约A买一价 - 合约B卖一价) if (data.sabb > boll.middle && data.sabb < boll.up) { // 如果sabb高于中轨 if (data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单 data.trade(tradeTypeA, "closebuy"); // 合约A平多 } if (data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单 data.trade(tradeTypeB, "closesell"); // 合约B平空 } } else if (data.basb < boll.middle && data.basb > boll.down) { // 如果basb低于中轨 if (data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单 data.trade(tradeTypeA, "closesell"); // 合约A平空 } if (data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单 data.trade(tradeTypeB, "closebuy"); // 合约B平多 } } if (accountStocks * Math.max(data.askA, data.askB) > 1) { // 如果账户有余额 if (data.basb < boll.down) { // 如果basb价差低于下轨 if (!data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单 data.trade(tradeTypeA, "buy"); // 合约A开多 } if (!data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单 data.trade(tradeTypeB, "sell"); // 合约B开空 } } else if (data.sabb > boll.up) { // 如果sabb价差高于上轨 if (!data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单 data.trade(tradeTypeA, "sell"); // 合约A开空 } if (!data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单 data.trade(tradeTypeB, "buy"); // 合约B开多 } } } data.cancelOrders(); // 撤单 data.drawingChart(boll); // 画图 data.isEven(); // 处理持有单个合约 } //入口函数 function main() { // 过滤控制台中不是很重要的信息 SetErrorFilter("429|GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout|Futures_OP"); exchange.IO("currency", name + '_USDT'); //设置要交易的数字货币币种 ObjChart.reset(); //程序启动前清空之前绘制的图表 LogProfitReset(); //程序启动前清空之前的状态栏信息 while (true) { // 进入轮询模式 onTick(); // 执行onTick函数 Sleep(500); // 休眠0.5秒 } }

아비트라지 트레이딩은 모건 스탠리의 주식 거래 전략에서 유래했습니다. 그 개념은 다음과 같습니다. 두 개의 높은 상관관계를 가진 상품의 가격 차이 변동은 "팝콘 프로세스"를 따릅니다. 즉, 가격 차이는 역사적 평균에서 벗어난 위치에서 지속적으로 평균으로 돌아갑니다. , 그리고 평균으로부터의 또 다른 편차.

여기서 우리는 가격 차이에 따라 낮은 가격에 사고 높은 가격에 팔면 수익을 낼 수 있습니다. 그런 다음 통계학의 표준 편차 원리에 따라 볼린저 밴드는 표준 편차에 의해 계산된 중간 레일과 상단 및 하단 레일로 구성됩니다. 3개의 메시를 형성합니다. 스프레드 아비트라지 거래에 매우 유용합니다.

테스트를 거쳐, 이 전략을 따를 경우, 처리 수수료와 영향 비용을 고려하지 않아도 매번 수익이 크지는 않지만 전체적인 수익은 비교적 안정적이라는 사실을 발견했습니다. 통계적 차익거래이므로 가격 차이가 반대 방향으로 벌어질 위험이 있으며, 설계 시 손절매 문제도 고려해야 합니다. 둘째, 충격 비용에도 주의를 기울여야 합니다. 거래에 관련된 두 계약의 유동성이 감소하면 수익에 상당한 영향을 미치므로 투자자는 적절한 경우 이를 피해야 합니다.

4. CTA 전략 개발의 고급 반복

4.1 퓨처 CTA 전략의 함정 피하기

지난 두 수업에서 우리는 Mai 언어로 트렌드 전략을 작성했고, JavaScript로 차익거래 전략을 작성했으며, 전략 백테스팅에서 아무런 문제도 발견하지 못했습니다. 그러나 양적 거래는 단순히 프로그램을 작성한 다음 백테스팅이 성공한 후 바로 거래하는 것만이 아닙니다.
실제로 백테스팅은 단순히 전략을 시뮬레이션하는 것일 뿐이며, 과거 데이터에서 전략의 성과를 평가하는 데만 사용되며, 이를 통해 트레이더는 일부 트레이딩 전략을 빠르게 평가하고 포기할 수 있습니다.

많은 경우, 백테스팅에서 훌륭해 보이는 전략은 실제 거래에서 백테스팅 기준을 충족하지 못하는 경우가 많습니다. 그 이유는 여러 가지가 있으며, 그 중 일부는 트레이더의 통제를 벗어나지만, 일부 실패는 일반적인 또는 잠재적인 오류 때문입니다. .

정적 데이터 대 동적 데이터
양적 분석을 할 때는 먼저 정적 데이터와 동적 데이터의 개념이 있어야 합니다. 백테스팅에서는 정적 과거 데이터를 사용합니다. 각 K-라인의 가격은 완전하며, 각 트레이딩 신호는 100% 매도될 수 있습니다. 하지만 실제 시장의 데이터는 역동적입니다. 예를 들어, 개장 후 1시간 이내에 최고가가 최고가보다 높으면 매수합니다. 그러나 현재 K-라인이 완료되지 않은 경우 최고가는 동적이며 거래 신호가 앞뒤로 깜박일 수 있습니다. . 이 상황은 해당 전략이 매수 및 매도 거래의 조건을 결정하는 데 미래 함수를 사용한다는 것을 나타냅니다.

미래 기능
미래 함수란 무엇인가? 먼저 Baidu Encyclopedia에서 이를 어떻게 설명하는지 살펴보겠습니다. 양이 다른 양에 의존하는 경우(예: 양 A와 양 B) B의 변화가 A의 변화를 일으키는 경우 A는 B의 함수입니다. B가 나중에 수량, A는 B에 따라 변경되는 이전 수량의 경우 A는 B의 미래 함수입니다. 누구나 혼란스러울 수 있다.

평범한 말로 표현하자면, 이는 미래 데이터를 참조하여 내일의 가격을 예측하는 것과 같은 함수입니다. 기술 지표에 미래 기능이 포함되어 있으면 신호가 불확실합니다. 종종 거래 신호가 현재 발행되지만 다음 K-라인이 나타나면 신호가 사라지거나 위치가 변경됩니다.

종가는 미래 함수입니다. 최신 K-라인이 완료되기 전에는 종가가 항상 변합니다. 종가를 결정하려면 K-라인이 완료될 때까지 기다려야 합니다. 종가 자체가 미래의 함수이므로 종가를 기반으로 하는 모든 기술 지표 역시 미래의 함수입니다.

따라서 어떤 기술적 지표가 확정된 종가를 기본 데이터로 사용하고, 시간이 아무리 흘러도 매수, 매도 신호가 변하지 않는다면, 이 기술적 지표는 미래의 기능을 참조하지 않는다고 할 수 있습니다. 다만, 사용하는 기본 데이터는 아직 확인되지 않은 종가이기 때문에, 이 기술적 지표는 미래의 함수를 참조하는 것으로, 실제 적용에서는 매수, 매도 신호가 달라질 수 있습니다.

지난 가격
미래 함수는 미래 가격을 사용하지만 과거 가격을 대신 사용할 수도 있습니다. 이는 많은 초보자가 간과하는 문제입니다. 이 문제를 앞으로 더 잘 설명하기 위해 예를 들어 보겠습니다. 현재 최고 가격이 개장 후 1시간 내의 최고 가격보다 높으면 개장 가격으로 매수합니다. 분명히 이 매수 및 매도 신호의 조건에는 아무런 문제가 없습니다. 그러나 주문을 내는 데 사용된 가격은 과거 가격입니다.

백테스트에서 전략은 정상적입니다. 왜냐하면 정적 데이터를 기반으로 하는 백테스트 엔진은 매수 신호가 있는 한 100%의 시간 동안 거래를 완료할 수 있기 때문입니다. 그러나 실제 시장에서 최고 가격이 개장 후 1시간 이내의 최고가입니다. 이때는 더 이상 과거 개장가를 사용하여 주문을 할 수 없습니다.

가격 진공
소위 가격 진공은 K-라인 차트에 표시된 가격을 말하지만, 실제 시장에서는 거래할 수 없는 가격을 말합니다. 주로 다음과 같은 상황으로 나뉩니다.

  1. 거래를 해본 사람이라면 누구나 알겠지만, 가격이 상한가에 도달하면 매수하기 어렵고, 가격이 하한가에 도달하면 매도하기 어렵다. 하지만 백테스트를 통해 거래하는 것은 가능합니다.
  2. 거래소의 매칭 메커니즘은 가격 우선, 시간 우선입니다. 일부 제품은 종종 엄청난 양의 주문이 있습니다. 실시간으로 매수 또는 매도 주문을 하면 다른 사람의 주문 뒤에서 기다려야 하고 다른 사람의 주문이 실행될 때까지 기다려야 거래를 완료할 수 있습니다. 어떤 경우에는 거래를 완료하기 전에 가격이 변경되었을 수 있습니다. 그러나 백테스팅 중에 주문을 내는 것이 전략이라면 거래가 적절한 시기에 완료되는데, 이는 실제 거래 환경과는 다릅니다.
  3. 만약 당신이 아비트라지 전략을 사용한다면 백테스팅 수익은 매우 높아질 것입니다. 왜냐하면 백테스팅을 할 때마다 이러한 가격 차이를 포착했다고 가정하기 때문입니다. 실제로 많은 스프레드가 제공되지 않거나 한 쪽 다리만 제공됩니다. 일반적으로 귀하의 방향에 유리하지 않은 쪽이 먼저 거래되므로 다른 쪽 다리를 즉시 채워야 합니다. 이때 슬리피지가 발생했습니다. 이미 발생했다. 1이나 2포인트가 아니라, 아비트라지 전략 자체가 이 포인트들의 가격 차이로 돈을 번다. 이런 상황은 백테스팅에서 시뮬레이션할 수 없다. 실제 수익은 백테스트 결과만큼 좋지 않습니다.
  4. 블랙스완 사건은 흔하지 않지만, 여전히 양적 거래에 큰 영향을 미칩니다. 예를 들어, 스위스 프랑의 블랙스완 사건에서 차트는 높은 오프닝과 낮은 클로징이 모두 있음을 보여줍니다. 사실, 극단적인 당일 시장 상황, 중간 가격은 진공 상태이며, 손절매 주문이 많아 폭주하고, 유동성은 0이며, 거래가 매우 어렵지만 백테스팅을 통해 손절매를 달성할 수 있습니다.
    img

과적합(Overfitting)
오버피팅은 양적 거래 초보자가 흔히 하는 실수입니다. 오버피팅이란 무엇일까요? 간단한 예를 들어보겠습니다. 학교에서 시험을 볼 때 어떤 사람들은 많은 문제를 풀고 모든 문제를 암기하는 전략을 사용합니다. 시험 중에 질문이 약간 바뀌면 대답할 수 없게 될 것입니다. 그는 각 문제에 대한 접근 방식을 매우 복잡한 방식으로 암기했지만, 일반적인 규칙은 추상화하지 않았기 때문입니다.
img

위 그림에서 보듯이, 모델이 충분히 복잡하다면 데이터에 완벽하게 적응할 수 있습니다. 양적 거래에서의 과적합도 마찬가지입니다. 전략이 복잡하고 외부 매개변수가 많으면 제한된 과거 데이터 백테스트에서 전략에 완벽하게 맞는 매개변수가 항상 하나 이상 있을 것입니다. 과거 시장 상황에 맞춰 .

그러나 미래의 실제 거래에서 가격 변화는 전략의 한계를 초과할 수 있습니다. 사실, 양적 거래 전략 개발의 본질은 겉보기에 무작위적인 대량의 데이터에서 무작위가 아닌 지역 데이터를 매칭하는 과정입니다. 따라서, 우리는 통계를 사용해야 합니다. 이 함정을 피하기 위해 지식을 어떻게 사용할 수 있을까요?

타협안은 샘플 내 데이터와 샘플 외 데이터를 모두 사용하는 것입니다. 전체 데이터를 두 부분으로 나누고, 샘플 내 데이터를 학습 세트로 사용하고, 데이터 백테스팅을 담당합니다. 샘플 외부 데이터는 검증을 위한 테스트 세트로 사용됩니다. 과거 데이터가 거의 없는 경우에도 교차 테스트 방법을 사용할 수 있습니다.

샘플 외부 데이터가 제대로 작동하지 않는다는 것을 발견했지만 모델을 폐기하는 것이 유감스럽다고 생각되거나 모델이 좋지 않다는 것을 인정하고 싶지 않아 계속해서 외부에서 모델을 최적화하는 경우 -샘플 외부 데이터에서도 동일한 성능을 보일 때까지 샘플 외부 데이터를 계속 수집하여 분석하면, 결국 손해를 보는 쪽은 바로 여러분의 진짜 돈입니다.

생존자 편향
생존자 편향은 다음 예를 통해 설명할 수 있습니다.

  1. 올바른 위치에 서 있다면 돼지도 날 수 있습니다.
  2. 온라인에서 판매되는 낙하산에 대한 모든 리뷰는 긍정적입니다. 낙하산에 문제가 있다고 말하는 사람이 없기 때문입니다.
  3. 기자들은 버스에 탄 사람들에게 티켓을 샀는지 인터뷰했습니다. 티켓을 사지 못한 사람들은 버스에 전혀 탈 수 없었기 때문입니다.
  4. 미디어는 복권에 당첨될 가능성을 홍보하는데, 왜냐하면 미디어는 복권에 당첨되지 않은 사람들을 적극적으로 홍보하지 않기 때문이다.

위의 예에서 우리는 사람들이 보통 받는 정보가 실제로 스크리닝되었다는 것을 알 수 있으며, 이로 인해 많은 양의 데이터나 샘플이 선택적으로 무시됩니다. 그 결과 생존자 편향에 기반한 결론이 실시간에서 벗어났습니다. 그런 다음 양적 거래에서 백테스트 결과가 운에 의한 것인지도 고려해야 합니다. 많은 경우 백테스트 결과는 전체 백테스트에서 가장 좋은 성과일 수 있습니다. 다음 그림에 주의하세요.
img

왼쪽 그림은 매우 좋은 거래 전략입니다. 자본 곡선이 좋고, 큰 하락이 없으며, 안정적인 수익률을 얻을 수 있습니다. 하지만 오른쪽 그림을 살펴보세요. 이 그림은 수백 개의 거래 백테스트 중에서 가장 성과가 좋은 그림입니다. 반면, 금융 시장을 살펴보면, 장수한 스타보다 항상 더 많은 스타가 있습니다. 트레이더의 전략이 시장 상황에 맞으면 매년의 시장 상황이 스타를 한 무리 만들어낼 수 있지만, 3년 이상 연속으로 장수할 수 있는 스타를 보는 것은 드문 일입니다. 안정적인 수익을 가진 생일자.

비용 영향
보류 주문을 하지 않는 한 거래 시 가격 하락이 발생할 수 있습니다. 활발하게 거래되는 상품의 경우 매수 가격과 매도 가격은 일반적으로 1포인트 차이입니다. 활발하게 거래되지 않는 상품의 경우 스프레드가 더 클 수 있습니다. 활발하게 거래할 때마다 적어도 1개 이상의 스프레드가 필요합니다. 그러나 백테스팅에서는 거래 문제를 고려할 필요가 없습니다. 신호가 있는 한 거래는 완료될 수 있습니다. 따라서 실제 거래 환경을 시뮬레이션하려면 최소한 하나의 슬리피지를 추가해야 합니다.

특히 거래 빈도가 비교적 높은 전략의 경우, 전략을 백테스팅할 때 슬리피지가 포함되지 않으면 자본 곡선은 항상 위쪽으로 기울어집니다. 합리적인 슬리피지가 추가되면 즉시 손실로 전환됩니다. 또한, 이러한 현상은 단순히 스프레드 문제로 인해 발생하는 것이 아닙니다. 실제 거래 환경에서는 네트워크 지연, 소프트웨어 및 하드웨어 시스템, 서버 응답과 같은 문제도 고려해야 합니다.

정책 역량
동일한 전략이라도 효율적 시장과 비효율적 시장에서는 매우 다르거나 심지어 완전히 반대되는 효과를 낼 수 있습니다. 예를 들어 국내 주식시장, 상품선물, 외국 디지털 통화와 같은 비효율적인 시장에서는 거래량 기반이 작기 때문에 고빈도 전략 자체의 용량이 크지 않습니다. 더 많은 사람들이 사용한다면 이익 마진이 없고, 원래의 고빈도 전략조차도 수익성이 없을 것입니다. 수익성 있는 전략이 손실을 내는 전략으로 바뀌었습니다. 그러나 효율적인 외환 시장에서는 다양한 유형의 고빈도 전략이 적용될 여지가 있습니다.

위의 내용은 전략 개발 및 사용 중에 발생할 수 있는 문제와 함정입니다. 숙련된 거래 시스템 개발자에게는 백테스팅이 필수입니다. 이를 통해 전략적 아이디어가 과거 거래에서 효과적인지 검증할 수 있는지 여부를 알 수 있습니다. 하지만 많은 경우 백테스팅은 미래의 수익성을 의미하지 않습니다. 백테스팅에는 함정이 너무 많기 때문에 돈을 들여서 교훈을 얻지 않는 이상 백테스팅을 이해할 수 없습니다. 그리고 이러한 교훈은 실제 돈을 통해서 배울 수 있습니다. 이 과정은 적어도 많은 양적 우회로와 함정을 피하는 데 도움이 될 수 있습니다.

4.2 최적의 위치 관리 구축

Reminiscences of a Stock Operator에는 흥미로운 에피소드가 있습니다. 주인공 리버모어와 같은 증권회사에서 일했던 올드 터키(원래 이름은 파트리지)는 항상 큰 매수와 매도를 했습니다. 누군가가 그에게 매도하라고 제안할 때마다 이익을 낸 후, 주가가 떨어지면 다시 매수하는 것입니다. 올드 터키는 항상 진지하게 말한다: 아니, 알다시피, 이건 강세장이에요!

리버모어조차도 마침내 한숨을 쉬었다. 추세를 올바르게 예측하는 것에는 대단한 것이 없다. 시장에서는 항상 강세장에서는 강세를, 약세장에서는 약세를 보이는 사람들을 많이 찾을 수 있다. 하지만 그들은 항상 시장과 흥정하는 데 능숙하며, 가장 낮은 지점에서 사고 가장 높은 지점에서 팔려고 노력합니다. 오래된 터키처럼, 정말 큰 돈을 버는 사람은 시장을 올바르게 보고 자신의 포지션을 단단히 붙잡는 사람입니다. 이것은 또한 배우기 가장 어려운 것입니다. 여기에는 목표와 시기를 선택하는 것뿐만 아니라, 더 중요한 질문인 '얼마나 큰 포지션(위험)을 보유(감수)해야 하는가?'가 포함됩니다.

실패한 트레이더는 모두 일방적인 사고방식을 가지고 있습니다. 트레이딩을 할 ​​때 탐욕스러운 사람들은 이익만 보고 위험은 보지 않고, 소심한 사람들은 이익만 보고 위험은 보지 않습니다. 탐욕스럽고 소심한 사람들은 위험을 잊어버립니다. 시장은 상승하고 있습니다. 하락하는 길에 이익을 얻는 것은 잊어버리세요. 하지만 성공적인 트레이더는 위험과 보상을 모두 고려합니다. 즉, 1달러를 벌 때마다 몇 달러의 위험을 감수하는 것입니다. 그러면 수익과 위험을 측정하는 지표가 수익-위험 비율입니다.

많은 사람들은 수익이 클수록 위험도 크다는 것을 알고 있습니다. 즉, 수익은 위험에 비례한다는 것입니다. 일부 사람들은 수익과 위험 간의 관계는 다음과 같아야 한다고 생각합니다. 수평축은 위험 비율을 나타내고 수직축은 이익 비율을 나타냅니다.
img

그러나 실제 거래에서는 수익과 위험이 두 지점을 잇는 직선처럼 간단한 것은 아닙니다. 적어도 항상 선형적으로 움직이지는 않습니다. 실제 위험은 예상 수익률 내에서 발생할 수 있는 최대 손실이며, 이를 최대 변동성이라고 합니다. 때로는 최대 변동 손실이 거래 결과에 따른 마감 손실과 꼭 같지는 않지만, 최대 변동 손실은 실제입니다.

이를 통해, 우리는 위 그림의 이익-위험 비율이 실제 표현이 아니라는 것을 알 수 있습니다. 실제 거래 환경에서 이익-위험 비율은 아래 그림과 같아야 합니다.
img

위의 그림을 살펴보겠습니다. 노란색 곡선은 다양한 위험 하에서 순 가치의 변동을 나타냅니다. 기대 수익이 계속 확대됨에 따라 위험도 점차 확대됩니다. 파산을 0.5로 설정하면 최대 손실이 50%에 달하는데, 이는 실패한 거래 전략입니다. 이 전략의 최종 수익은 긍정적이지만 실제로는 중간에 파산했습니다.

아무리 당신의 전략이 긍정적인 기대 전략이라 할지라도, 잘못된 포지션 관리로 인해 그 전략은 여전히 ​​파산할 것입니다. 따라서 이러한 관점에서 볼 때, 매수 또는 매도할 시점보다 얼마나 매수 또는 매도할 것인지가 더 중요합니다. 포지션을 과학적으로 관리하는 방법은 금융 거래에서 근본적인 문제가 되었습니다. 그러니 이 문제를 해결하기 전에, 먼저 도박에서 과학적으로 베팅하는 방법부터 살펴보겠습니다.
img

동전 던지기를 예로 들어보자. 동전의 양면이 같은 무게라고 가정할 때, 앞면이 나오면 이익은 2위안이고, 뒷면이 나오면 손실은 1위안이다. 당연히 이것은 승률이 50%이고 손실이 2위안인 긍정적인 기대 게임입니다. 질문은 이렇습니다. 이제 100위안이 있는데, 어떻게 반복해서 베팅을 해서 100위안을 최대한 빨리 100만 위안에 도달시킬 수 있을까요?

우리가 신중하게 생각하지 않는다면, 우리는 각 베팅의 이익이 50%이기 때문에,*2-50%*1, 50%입니다. 최대 이익을 빠르게 실현하려면 각 도박에 가능한 한 많은 자본을 투자해야 합니다. 베팅은 100%여야 합니다.

하지만 모든 도박 게임에 자본의 100%를 투자하는 것은 분명 비합리적인 일입니다. 왜냐하면 단 한 번이라도 지면, 가능성이 아주 적더라도 자본은 모두 사라지기 때문입니다. 도박을 많이 하다 보면 돈을 잃는 일이 생길 수밖에 없습니다.

누군가는 100%의 베팅이 비합리적이라면 90% 이하의 베팅은 어떨까라고 물을 수도 있습니다. 사실, 이 문제를 해결하기 위해, 우리는 이 도박 게임을 시뮬레이션하는 실험을 해서 각 베팅의 결과가 어떻게 되는지 볼 수 있습니다. 다음 그림에서 보는 바와 같습니다.

img

그림에서 우리는 우리가 90%, 80%, 70%, 60%, 50%로 점차적으로 포지션을 줄일 때 같은 베팅의 결과가 완전히 다르다는 것을 알 수 있습니다. 주의 깊은 친구들은 이미 알아차렸을 것입니다. 자리가 점점 줄어들면서 최종 자금은 실제로 점점 늘어나고 있습니다.

누군가는 10%처럼 매번 더 작은 베팅을 하는 것이 더 나은지 물을 수 있습니다. 모든 베팅 비율을 계산할 수는 없잖아요, 그렇죠? 이것이 유명한 켈리 공식이 해결하고자 하는 문제입니다. 통계학에서 켈리 공식은 각 도박에서 최적의 베팅 비율을 계산함으로써 긍정적인 기대 반복 베팅 전략의 장기적 성장률을 극대화할 수 있습니다.

그뿐 아니라 원금과 도박이 무한히 나누어질 수 있다고 가정할 때, 켈리 공식을 사용하면 어떤 도박에서든 파산하는 일은 불가능하게 됩니다. 특히 실제 금융거래에 적용하면 공격과 수비를 결합한 포지션 관리 전략이다. 켈리 공식이 어떻게 계산되는지 살펴보겠습니다. 다음 그림을 보세요.

img

  • f는 기존 원금의 최적 베팅 비율입니다.
  • b는 확률(odds)이며, 거래에서는 손익비율이라고도 합니다.
  • p는 성공률이다
  • q는 실패율이다

그러면 켈리 공식을 사용하여 이 수업에서 도박의 예를 계산할 수 있습니다. 초기 자본이 100위안이고 승률이 50%이고 배당률이 2인 경우 자본을 가장 많이 만들기 위해 어떤 베팅 비율을 사용해야 합니까? 수익성이 있나요? 가장 빠른 속도는 100만 위안에 이릅니다. 켈리 공식을 사용하면 계산 과정은 다음과 같습니다.

(0.5*(2+1) -1)/2=0.25

승률 50%는 0.5이고, 배당률 2+1에 곱한 다음 1을 빼고 마지막으로 2로 나눕니다. 결과는 0.25이며, 이는 각 도박 게임에서 원금의 25%가 베팅에 사용된다는 것을 의미합니다. 가장 빠른 속도로도 100만 위안에 도달할 수 있다. 계산 결과를 토대로 수동으로 시뮬레이션하여 정확한지 확인할 수 있습니다.

img

위의 그림은 수동 시뮬레이션의 결과입니다. 마지막 줄을 살펴보세요. 같은 베팅에 대해 100회 이상 진행한 후, 25%의 포지션이 먼저 100만 위안에 도달했습니다. 포지션의 90%, 80%, 70%, 60%가 모두 마이너스 결과였는데, 이는 긍정적인 기대감을 바탕으로 한 거래 전략이라도 잘못된 포지션 관리로 인해 파산하게 된다는 것을 여실히 보여줍니다.

또한 50%의 포지션은 결국 손실도 이익도 발생하지 않을 것으로 보이는데, 이 역시 대수의 법칙에 부합합니다. 문제를 더 잘 설명하기 위해 수동 시뮬레이션 중에 10% 포지션도 추가했습니다. 최종 결과는 긍정적인 수익이었지만 효과는 25% 포지션보다 몇 배나 더 나빴습니다.

당신은 켈리 공식의 힘을 보았습니다. 실제 적용에서 10%의 원금 포지션을 선택하면 100회 이상의 베팅에서 원금은 30,000이 넘습니다. 이익은 엄청나지만, 그러나 결과와 비교하면 원금의 25%를 투자하면 돈을 벌지 못하는 것과 마찬가지입니다. 이것이 지식의 힘이다.

켈리 공식을 사용하여 인생에서 돈을 벌고 싶다면 켈리 공식의 적용 조건을 충족해야 합니다. 이 도박은 금융 시장에서 나와야 한다는 데 의심의 여지가 없습니다. 특히 양적 거래의 경우 과거 데이터를 백테스트하여 그에 상응하는 승률과 확률을 대략적으로 계산할 수 있습니다.

물론, 금융 거래에서 켈리 공식을 실제로 적용하는 것은 그렇게 간단하지 않습니다. 레버리지 거래에서 자금 비용, 실제 거래에서 자금과 포지션을 분리할 수 없는 것과 같이 처리해야 할 세부 사항이 여전히 많이 있습니다. 승률과 거래에서의 위치의 차이. 배당률은 동적으로 변하고 있습니다. 하지만 어떤 경우든 켈리 공식은 우리에게 가장 좋은 직위 관리 방법을 확립하는 방법을 보여줍니다.

Related Recommendations
Comment
All comments (3)

    学习学习

    4 years ago

    学习

    5 years ago

    学习

    6 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)