리소스 로딩... 로딩...

4.4 파이썬 언어에서 전략을 구현하는 방법

저자:선함, 2019-04-28 16:51:22, 업데이트:

요약

이전 기사에서 우리는 파이썬 언어의 소개, 기본 문법, 전략 프레임워크 및 기타에 대해 배웠습니다. 내용이 지루했지만 거래 전략 개발에서 필수적인 기술입니다. 이 기사에서는 실행 가능한 양적 거래 전략을 달성하는 데 도움이되는 간단한 전략으로 파이썬의 경로를 단계별로 계속해 보겠습니다.

전략 소개

많은 거래 전략들 중에서, 돈치안 채널 전략은 가장 고전적인 돌파구 전략 중 하나가 되어야 한다. 1970년부터 유명해졌다. 그 당시, 시뮬레이션 테스트와 주류 프로그램적 거래 전략에 대한 연구에 특화된 회사였다. 모든 전략 테스트에서, 돈치안 채널 전략은 가장 성공적이었다.

이후 미국에서는 유명한 거북상거래자 교육 행사가 열렸고, 이는 증권 거래의 역사에서 큰 성공을 거두었다. 그 당시 거북상거래 방법은 기밀이었지만, 10년 이상 후에 거북상거래법이 공개되었고, 사람들은 거북상거래이 도천 채널 전략의 개선된 버전을 사용한다는 것을 발견했습니다.

돌파구 거래 전략은 거래 품종의 비교적 원활한 추세에 적응된다. 돌파구를위한 가장 일반적인 방법은 특정 거래 위치를 결정하기 위해 가격 지원과 저항 사이의 상대적 위치 관계를 사용하는 것입니다. 이 섹션의 돈치안 채널 전략도이 원칙에 기반합니다.

돈치안 운하 전략 규칙

돈치안 채널은 트렌드 지향적 인 지표이며, 그 외관과 신호는 볼링거 밴드 지표와 다소 유사합니다. 그러나 가격 채널은 특정 기간의 가장 높고 가장 낮은 가격에 따라 구성됩니다. 예를 들어: 상부 레일은 가장 최근의 50 k-라인의 가장 높은 가격으로 계산됩니다. 하부 레일은 가장 최근의 50 k-라인의 가장 낮은 가격으로 계산됩니다.

img

위와 같이: 이 지표는 세 가지 다른 색으로 구성된 곡선으로, 기본 설정은 가격 변동성을 표시하기 위해 20 주기의 가장 높고 가장 낮은 가격입니다. 가격이 좁은 채널에있을 때 변동성이 적을 것입니다. 그리고 반대로.

가격이 상위 레일 이상으로 상승하면 구매 신호가 나타납니다. 반대로 가격이 하위 레일 아래로 떨어지면 판매 신호가 나타납니다. 상위와 하위 레일은 가장 낮은 가격과 가장 높은 가격을 사용하여 계산되기 때문에 정상적인 상황에서는 가격이 레일을 돌파하지 않고 레일과 함께 움직이거나 채널 내부에서 점프합니다.

치안 채널 계산 방법

FMZ 퀀트 플랫폼에서 돈치안 채널 계산은 간단합니다. 주어진 사이클의 가장 높은 가격이나 가장 낮은 가격으로만 접근할 수 있습니다. 아래와 같이: 5번째 줄은 50 사이클의 가장 높은 가격을 얻고, 6번째 줄은 50 사이클의 가장 낮은 가격을 얻습니다.

def main(): # program entry
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line 
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        upper = TA.Highest(record, 50, 'high') # get the highest price of 50 cycles
        lower = TA.Lowest(record, 50, 'low') # get the lowest price of 50 cycles
        middle = (upper + lower) / 2 # calculate the average value of upper and lower rails 
        Log("upper rail: ", upper) # print the upper rail value in the log
        Log("lower rail: ", lower) # print the lower rail value in the log
        Log("middle rail: ", middle) # print the middle rail value in the log

전략 논리

돈치안 채널을 사용하는 방법에는 여러 가지가 있으며, 단독으로 또는 다른 지표와 결합하여 사용할 수 있습니다. 이 섹션에서는 가장 쉬운 방법으로 사용할 것입니다. 즉: 가격이 압력선 위에 돌파한다는 것을 의미하는 상부 레일을 돌파하면 구매력이 강하며 상승 에너지의 파도를 형성하여 구매 신호가 생성됩니다. 가격이 하부 레일 아래에 돌파한다는 것을 의미하는 서포트 라인 아래에 돌파하면 판매 신호가 생성됩니다.

img

만약 가격이 긴 포지션 개척 후 다시 채널의 중간 레일로 떨어지면, 우리는 구매력의 강도가 약화되거나 판매력의 강도가 강화되고, 짧은 포지션 개척 신호가 생성되면,

거래 조건

  • 긴 포지션 오픈: 포지션 보유가 없고, 종료 가격이 상단 레일보다 높으면

  • 오픈한 단위 포지션: 포지션 보유가 없고, 종료 가격이 하위 레일보다 낮다면

  • 긴 포지션 폐쇄: 현재 긴 포지션을 보유하고 있고, 닫기 가격이 중간 레일보다 낮다면

  • 포지션 종료: 현재 포지션을 종료하고 포지션 종료 가격이 중간 레일보다 높으면

전략 코드 시행

전략을 구현하는 첫 번째 단계는 데이터를 먼저 얻는 것입니다. 왜냐하면 데이터가 거래 전략의 필수 요소이기 때문입니다. 생각해보세요. 어떤 데이터가 필요합니까? 그리고 어떻게 데이터를 얻을 수 있습니까?

다음으로 이 데이터를 기반으로 거래 논리를 계산하는 것입니다. 마지막 단계는 논리에 따라 거래하는 것입니다. 다음 단계:

단계 1: 거래 클래스 라이브러리를 사용

트레이딩 클래스 라이브러리를 기능 모듈로 생각할 수 있습니다. 트레이딩 클래스 라이브러리를 사용하는 장점은 전략 논리를 작성하는 데 집중할 수 있다는 것입니다. 예를 들어, 트레이딩 클래스 라이브러리를 사용할 때 포지션을 열거나 닫기 위해 트레이딩 클래스 라이브러리의 API 인터페이스를 직접 사용할 수 있습니다. 그러나 트레이딩 클래스 라이브러리를 사용하지 않으면 포지션을 열 때 시장 가격을 얻어야합니다. 실행되지 않은 주문의 문제와 철수 주문의 문제를 고려해야합니다.

def main();
    wile true:
        obj = ext.NewPositionManager() # using the trading class library
        # followed by strategy logic and placing order part

위의 코딩 부분은 FMZ Quant 도구를 사용하는 CTA 전략 프레임워크입니다. 이것은 고정된 코딩 형식이며 모든 거래 논리 코드는 4 행에서 시작됩니다. 다른 변경 사항은 필요하지 않습니다.

2단계: 모든 종류의 데이터를 수집

생각해보세요, 어떤 종류의 데이터가 필요한가요? 우리의 전략 거래 논리에서, 우리는 먼저 현재 포지션 상태를 얻어야하고, 그 다음 폐쇄 가격을 볼링거 밴드 지표 상단, 중단 및 하단 레일과 비교해야 합니다.

  • K 라인 데이터를 얻으십시오.

첫 번째는 K-라인 데이터 배열과 현재 K-라인 폐쇄 가격을 얻는 것입니다. K-라인 배열을 사용하면 API 인터페이스를 통해 가장 높고 가장 낮은 가격의 N 사이클 기간을 계산할 수 있습니다. 이렇게 쓸 수 있습니다:

def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line 
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line

위 그림과 같이:

4줄: 고정된 형식인 K줄 배열을 얻습니다.

라인 5: K 라인의 길이를 필터링합니다. 왜냐하면 돈치안 채널 지표를 계산하는 매개 변수는 50이기 때문에, K 라인의 수가 50보다 작을 때 계산하는 것은 불가능합니다. 그래서 여기 우리는 K 라인의 숫자를 필터링해야 합니다. K 라인의 수가 50보다 작으면, 현재 루프를 건너뛰고 다음 K 라인을 계속 기다립니다.

라인 6: 우리는 K-라인 배열의 마지막 데이터를 얻기 위해 코드 " 레코드 [ 레인 (레코드) - 1 ] "를 사용합니다. 이것은 최신 K-라인 데이터입니다. 이 데이터는 개척 가격, 최고, 최저 및 폐쇄 가격, 또한 거래량, 시간 및 기타 데이터를 포함하는 객체입니다.

  • 위치 데이터를 얻으십시오

포지션 정보는 양적 거래 전략에서 매우 중요한 조건입니다. 거래 조건이 설정되면 포지션 상태와 포지션 수에 따라 주문을 할 것인지 판단해야합니다. 예를 들어, 긴 포지션을 여는 조건이 설정되면 포지션 보유가있는 경우 주문을하지 마십시오; 포지션 보유가 없는 경우 주문을하십시오. 이번에는 포지션 정보를 함수로 직접 캡슐화하여 다음과 같이 사용할 수 있습니다.

# get the position information function
def mp():
    positions = exchange.GetPosition() # get the holding position array
    if len(position) == 0: # if the holding position array is 0
        return 0 # meaning currently has no position holding, return 0
    for i in range(len(position)): # Traversing the position array
        if (position[i]['Type'] == PD_LONG): 
            return 1 # if there are long position holding, return 1
        elif (position[i]['Type'] == PD_SHORT):
            return -1 # if there are short position holding, return -1
        
def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line
        position = mp() # get the position information function

위 그림과 같이:

이것은 위치 정보를 얻는 함수입니다. 긴 위치가 있다면 값은 1; 짧은 위치가 있다면 값은 -1; 위치가 없다면 값은 0입니다.

2줄: mp이라는 함수를 생성합니다. 이 함수에는 매개 변수가 없습니다.

세 번째 줄: 고정된 형식인 위치 배열을 얻습니다.

선 4: 위치 배열의 길이를 결정합니다. 그것의 길이가 0과 같다면, 그것은 위치 보유가 없다는 것을 의미합니다, 0을 반환합니다.

선 6: for 루프를 사용하여 이 배열을 가로질러 시작하면, 다음 논리는 매우 간단합니다. 만약 long 포지션을 유지한다면 1을 반환합니다. 만약 short 포지션을 유지한다면 -1을 반환합니다.

라인 18: 위치 정보 함수 mp을 호출합니다.

  • 가장 최근 50 K 라인의 가장 높은 가격과 가장 낮은 가격을 획득

FMZ 퀀트 양적 거래 도구에서는 자신의 논리 계산을 작성하지 않고 직접 "TA.Highest" 및 "TA.Lowest" 함수를 사용할 수 있습니다. 그리고 TA.HighestTA.Lowest 함수는 배열 대신 특정 값의 결과를 반환합니다. 이것은 매우 편리합니다. 그뿐만 아니라 FMZ 퀀트 플랫폼에는 수백 개의 다른 지표 기능이 공식적으로 내장되어 있습니다.

# get the position information function
def mp():
    positions = exchange.GetPosition() # get the holding position array
    if len(position) == 0: # if the holding position array is 0
        return 0 # meaning currently has no position holding, return 0
    for i in range(len(position)): # Traversing the position array
        if (position[i]['Type'] == PD_LONG): 
            return 1 # if there are long position holding, return 1
        elif (position[i]['Type'] == PD_SHORT):
            return -1 # if there are short position holding, return -1
        
def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line
        position = mp() # get the position information function
        upper = TA.Highest(record, 50, 'High') # get the highest price of 50 cycles
        lower = TA.Lowest(record, 50, 'Low') # get the lowest price of 50 cycles
        middle = (upper + lower) / 2 # calculate the average value of the upper and lower rail

위 그림과 같이:

라인 19: TA.Highest 함수를 호출하여 50 회로 중 가장 높은 가격을 얻으십시오.

라인 20: 50 사이클의 최저 가격을 얻기 위해 TA.Lowest 함수를 호출

라인 21: 50 회로 중 가장 높고 가장 낮은 가격에 따라 상단 및 하단 레일의 평균 값을 계산합니다.

단계 3: 주문 및 거래

위의 데이터로, 우리는 거래 논리와 주문을 배치하는 부분을 지금 쓸 수 있습니다. 그것은 또한 매우 간단합니다. 가장 일반적으로 사용되는 것은: 조건 1 및 조건 2가 사실이라면, 명령을 배치; 조건 3 또는 조건 4가 사실이라면, 명령을 배치합니다. 아래와 같이 설명 할 수 있습니다.

# get the position information function
def mp():
    positions = exchange.GetPosition() # get the holding position array
    if len(position) == 0: # if the holding position array is 0
        return 0 # meaning currently has no position holding, return 0
    for i in range(len(position)): # Traversing the position array
        if (position[i]['Type'] == PD_LONG): 
            return 1 # if there are long position holding, return 1
        elif (position[i]['Type'] == PD_SHORT):
            return -1 # if there are short position holding, return -1
        
def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line
        position = mp() # get the position information function
        upper = TA.Highest(record, 50, 'High') # get the highest price of 50 cycles
        lower = TA.Lowest(record, 50, 'Low') # get the lowest price of 50 cycles
        middle = (upper + lower) / 2 # calculate the average value of the upper and lower rail
        obj = ext.NewPositionManager() # using the trading class library
        if position > 0 and close < middle: # If currently holding long position, and the closing price is less than the middle rail
            obj.CoverAll() # close all position
        if position < 0 and close > middle: # If currently holding short position, and the closing price is greater than the middle rail
            obj.CoverAll() # close all position
        if position == 0: # if currently holding no position
            if close > upper: # if the closing price is greater than the middle rail
                obj.OpenLong("this_week", 1) # open long position
            elif close < lower: # if the closing price is less than the middle rail
                obj.OpenShort("this_week", 1) # open short position

위 그림과 같이:

22 줄: 거래 클래스 라이브러리를 사용하여, 이것은 고정된 형식입니다.

23, 24 줄: 이것은 우리가 전에 배웠던 비교 연산자 논리 연산자를 사용하는 긴 포지션 폐쇄 문구입니다. 즉, 현재 보유가 긴 포지션이고 닫기 가격이 중간 레일보다 낮다면 모든 포지션을 닫습니다.

25, 26 줄: 이것은 우리가 전에 배웠던 비교 연산자 논리적 연산자를 사용하는 닫는 짧은 포지션 문장입니다. 즉, 현재 주문이 짧은 포지션이고 닫는 가격이 중간 레일보다 크다면 모든 포지션을 닫습니다.

라인 27: 현재 위치 상태를 결정합니다. 포지션 보유가 없다면 다음 단계로 진행하십시오.

28, 29 줄: 닫기 가격이 상단 레일보다 크는지 여부를 결정합니다. 닫기 가격이 상단 레일보다 높으면 긴 포지션을 개척합니다.

30, 31 줄: 닫기 가격이 하부 레일보다 낮는지 여부를 결정합니다. 닫기 가격이 하부 레일보다 낮으면 짧은 포지션을 개척합니다.

요약하면

위에서는 파이썬을 사용하여 완전한 양적 거래 전략을 개발하는 모든 단계를 배웠습니다. 여기에는 전략 소개, 돈치안 채널 계산 방법, 전략 논리, 거래 조건, 전략 코드 구현 등이 포함됩니다. 이 섹션은 단순한 전략입니다. 영감을 주는 방법으로서 수행하는 방법에는 하나 이상의 방법이 있습니다. 자신의 양적 거래 전략을 형성하기 위해 거래 시스템에 따라 다른 거래 방법을 중첩할 수 있습니다.

다음 섹션에 대한 알림

양적 거래 전략의 개발에서 프로그래밍 언어 실행 속도의 관점에서 가장 빠른 것은 C++가어야 합니다. 특히 금융 파생물 및 고주파 거래 분야에서. C++는 언어 특성과 수학적 계산에서 장점을 가지고 있습니다. 자바스크립트 및 파이썬에 비해 속도는 여러 차원 증가 할 수 있습니다. 미래에 금융 파생물 또는 고주파 거래 분야로 가고 싶다면. 이것은 놓치지 말아야 할 코스입니다.

학교 밖 운동

  1. 기본부터 시작해서 이 섹션의 전략을 실행하세요.

  2. 이 섹션의 전략에 이동 평균 지표를 추가하여 거래 빈도를 줄이려고 노력하십시오.


더 많은