4.2 자바스크립트 언어로 전략적 거래를 구현하는 방법

저자:선함, 2019-04-27 11:53:15, 업데이트:

요약

이전 기사에서는 기본 문법과 자료를 포함하여 프로그램을 작성하는 데 자바스크립트를 사용하는 기본 지식을 소개했습니다. 이 기사에서는 실행 가능한 내일 양적 거래 전략을 달성하기 위해 몇 가지 일반적인 전략 모듈과 기술적 지표와 함께 사용할 것입니다.

전략 도입

볼링거 밴드 (Bollinger Band) 는 1980년대에 존 볼링거 (John Bollinger) 가 발명한 가장 일반적으로 사용되는 기술 지표 중 하나입니다. 이론적으로 가격은 항상 특정 범위의 값에 따라 변동합니다. 볼링거 밴드는이 이론적 기초에 기반하고 가격 채널의 개념을 도입합니다.

계산 방법은 통계적 원리를 사용하여 먼저 일정 기간 동안 가격의 표준편차을 계산하고, 그 다음 이동 평균의 표준편차의 2배를 더하거나 빼어 가격의 신뢰 간격을 찾는 것입니다. 기본 유형은 세 개의 철도선 (중부 철도, 상부 철도, 하부 철도) 으로 구성된 스트립 채널입니다. 중부 철도는 평균 가격이며, 상부 철도와 하부 철도는 각각 가격의 압력선과 지원선을 나타냅니다. 아래와 같이:

img

표준편차의 개념으로 인해 볼링거 밴드의 폭은 최근 가격 변동에 따라 동적으로 조정됩니다. 변동이 작을 때 볼링거 밴드는 좁을 것입니다; 그렇지 않으면 변동이 커지고 볼링거 밴드는 넓을 것입니다. BOLL 채널이 좁은 곳에서 넓게 변할 때 가격은 점차 평균으로 돌아갑니다. BOLL 채널이 넓고 좁은 곳에서 변할 때 시장 가격이 변하기 시작합니다. 가격이 상단 경로를 통과하면 구매력이 향상된다는 것을 의미합니다. 가격이 하단 경로를 통과하면 판매력이 향상된다는 것을 나타냅니다.

볼링거 밴드 지표 계산 방법

모든 기술 지표들 중에서 볼링거 밴드 계산 방법은 가장 복잡한 방법 중 하나이며, 중앙 궤도 (MB ), 상부 궤도 (UP ), 하부 궤도 (DN )) 계산을 포함하는 통계에 표준편차의 개념을 도입합니다. 계산 방법은 다음과 같습니다.

  • 중간 레일 = N 시간 기간의 간단한 이동 평균

  • 상부 레일 = 중부 레일 + 시간 기간 K × N의 표준편차

  • 하부 레일 = 중부 레일 − 시간 기간 K × N의 표준편차

function main( ) { // program entry
    while (true) { // enter the loop
        exchange.SetContactType('this_week'); // set contact type
        var records = exchange.GetRecods(); // get the k line array
        var boll = TA.B0LL(records, 50); // get the 50-cycle BOLL indicator array
        var top = boll[0]; // get the upper-rail BOLL indicator array
        var ma = boll[l]; // get the middle-rail BOLL indicator array
        var bottom = boll[2]; // get the lower-rail BOLL indicator array
        Log(top); // print the upper-rail BOLL indicator array to the log
        Log(ma); // print the middle-rail BOLL indicator array to the log
        Log(bottom);// print the lower-rail BOLL indicator array to the log
    }
}

전략 논리

볼링거 밴드는 다양한 방법으로 사용되며 단독으로 또는 다른 지표와 결합하여 사용할 수 있습니다. 이 튜토리얼의 섹션에서는 가장 쉬운 방법을 사용할 것입니다. 즉: 가격이 상부 레일을 넘으면 긴 포지션을 열고 가격이 하부 레일을 넘으면 짧은 포지션을 열십시오.

img

만약 가격이 다시 볼링거 밴드의 중간 레일로 돌아간다면 긴 포지션을 열면 구매력의 강도가 약화되거나 판매력의 강도가 강화되는 것으로 생각됩니다. 따라서 닫는 포지션 신호가 나오는 곳입니다.

거래 조건

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

  • 짧은 포지션: 포지션이 없는 경우, 닫기 가격은 하부 레일보다 낮습니다.

  • 긴 포지션을 닫습니다. 긴 포지션을 지고 닫기 가격이 중간 레일보다 낮다면,

  • 포지션을 닫습니다. 포지션을 닫고 포지션을 닫는 가격이 중간 레일보다 높으면

전략 코드 실행

전략을 달성하기 위해, 먼저 우리는 우리가 필요로 하는 데이터를 고려해야합니다? 어떤 API를 통해 얻을? 다음 거래 논리를 계산하는 방법? 마지막으로, 어떤 방식으로 주문을 할 수 있습니까?

단계 1: CTA 전략 프레임워크를 사용

CTA 전략 프레임워크라고 불리는 것은 FMZ Quant가 공식적으로 설계한 표준 프레임워크의 집합입니다. 이 프레임워크를 사용하면 사소한 프로그래밍 문제를 무시하고 프로그래밍의 논리에 직접 집중할 수 있습니다. 예를 들어,이 프레임워크를 사용하지 않으면 주문 가격, 주문 유형, 주문 철회 등을 변경하는 것을 고려해야합니다.

function main() {
    $.CTA("this_week", function(st) {
        // write your strategy here
    })
}

위는 FMZ Quant 도구를 사용하는 CTA 전략 프레임워크입니다. 그것은 고정 코드 형식이며 모든 거래 논리 코드는 3 행에서 시작합니다. 사용 중인 품종 코드를 수정해야하는 것 외에도 다른 변경 사항이 필요하지 않습니다.

위의 거래 품종 코드는 this_week이며, 이는 주간 k-라인을 사용하여 주간 데이터를 사용하여 거래 데이터를 나타냅니다.

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

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

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

첫 번째는 K-라인 데이터 배열과 이전 K-라인 폐쇄 가격을 얻는 것입니다. K-라인 배열로 볼링거 밴드 지표를 계산하면 다음과 같이 쓸 수 있습니다.

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

    })
}

위 그림과 같이:

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

5선: K선의 길이를 필터링합니다. 왜냐하면 볼링거 밴드 지표를 계산하는 매개 변수는 20이기 때문에, K선이 20보다 작을 때 볼링거 밴드 지표를 계산하는 것은 불가능합니다. 그래서 여기서 우리는 K선의 길이를 필터링해야 합니다.

라인 6: 얻은 K-라인 배열에서 먼저 이전 K-라인의 객체를 얻고, 이 객체에서 종료 가격을 얻습니다. 이 배열의 penultimate 요소를 얻으며, 이 배열의 길이가 마이너스 2 ((r[r.length - 2)) 입니다.

K-라인 배열 요소는 모든 객체이며, 객체는 개척, 최고, 최저 및 폐쇄 가격을 포함하고 있으며 거래량과 시간을 포함합니다.

예를 들어, 닫기 가격을 얻기 위해, 그냥 ". "를 추가 하 고 속성 이름 (r[r.length - 2].Close) 에 따라.

  • K 직선 시간 데이터를 얻으십시오

이것은 내일 전략이기 때문에, 우리는 어떤 특정 시간 전에 모든 포지션을 닫아야 합니다 ((대부분의 암호화 거래소는 일반적으로 24/7 개방), 그래서 우리는 현재 K 라인이 우리가 거래를 중단하거나 휴식을 취할 때 특정 시간에 가깝는지 판단해야합니다. 만약 그것이 그 폐쇄 시간 K 라인에 가깝다면, 모든 포지션을 닫습니다. 그렇지 않다면, 전략을 계속하십시오. 코드는 다음과 같습니다:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours
    })
}

위 그림과 같이:

라인 8: K 라인 타임 스탬프 속성 객체를 얻고 다음 시간 객체를 만들 ((새로운 날짜 (타임 스탬프)).

선 9: 시간 객체에 따라 시간 및 분을 계산하고 현재 K 선의 시간이 14:45인지 결정합니다.

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

포지션 정보는 양적 거래 전략에서 매우 중요한 조건입니다. 거래 조건이 설정되면, 포지션 상태와 포지션 수에 따라 주문을 할 것인지 판단해야합니다. 예를 들어, 긴 포지션을 개설하는 조건이 설정되면, 포지션 보유가있는 경우 주문을하지 마십시오; 포지션 보유가 없으면 주문을하십시오. 이렇게:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

    })
}

위 그림과 같이:

라인 11: 현재 위치 상태를 얻으십시오. 긴 위치가 있다면 값은 1; 짧은 위치가 있다면 값은 -1; 위치가 없다면 값은 0입니다.

  • 볼링거 밴드 데이터를 얻으세요

다음으로 볼링거 밴드 지표의 상위, 중위, 하위 레일의 값을 계산해야 합니다. 먼저 볼링거 배열을 얻어야 합니다. 그 다음에는 이 배열에서 상위, 중위, 하위 레일의 값을 얻어야 합니다. FMZ 양자 도구에서 볼링거 배열을 얻는 것은 매우 간단합니다. 볼링거 밴드 API를 직접 호출하면 됩니다. 이것은 2차원 배열입니다.

2차원 배열을 이해하기 쉽다. 배열의 배열이다. 값을 얻는 순서는 다음과 같다. 먼저 배열에서 지정된 배열을 얻고, 다음으로 아래와 같이 지정된 배열에서 지정된 요소를 얻는다.

var arr = [[100, 200, 300],[10,20,30],[1,2,3]]; // this is a two-dimensional array
var test = arr[0]; //first obtain the specified array in the array and assign the value to variable "test"
var demo1 = test[0]; //then get a value from the test array
demo1; // the result is : 100

var demo2 = arr[0][0]; // you also can write like this
demo2; // the result is the same : 100

아래에서 13부터 19 행까지는 볼링거 밴드 상부, 중부 및 하부 레일 코딩 부분을 얻고, 13 행에서는 FMZ 퀀트 API 도구를 사용하여 볼링거 밴드 배열에 직접 액세스 할 수 있습니다. 14 행에서 16 행까지는 상부, 중부 및 하부 레일 배열에 대한 2 차원 배열을 각각 얻고 있습니다. 17 행에서 19 행까지는 상부, 중부 및 하부 레일 배열에서 지정 값을 얻고 있습니다.

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2];  // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value

    })
}

단계 3: 주문 및 거래

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

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2]; // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value

        if (mp == 1 && (close < midPrice || isClose)) return -1; // if holding long position, and the closing price is less than the mid-rail, or the current time is 14:45, closing long position.
        if (mp == -1 && (close > midPrice || isClose)) return 1; // if holding short position, and the closing price is greater than the mid-rail, or the current time is 14:45, closing short position.
        if (mp == 0 && close > upPrice && !isClose) return 1; // if there are no holding position, and the closing price is greater than the upper-rail, or the current time is not 14:45, open long position.
        if (mp == 0 && close < downPrice && !isClose) return -1;// if there are no holding position, and the closing price is less than the lower-rail, or the current time is not 14:45, open short position.

    })
}

위의 그림에서, 21부터 24까지의 행은 거래 논리와 주문 배치 코딩 부분입니다. 위에서 아래로 그들은: 긴 포지션을 닫고, 짧은 포지션을 닫고, 긴 포지션을 열고, 짧은 포지션을 열고 있습니다.

예를 들어 오픈 롱 포지션을 들어보자. 이것은 if 명령어이다. 이 명령어에서 하나의 코드 라인이만 실행되면, 곱슬 고리 " {} "가 생략될 수 있다. 명령어는 텍스트 의미로 번역된다. 현재 포지션은 0이고 폐쇄 가격은 상단 레일보다 크며, k-라인 시간은 14:45이 아니라면 "return 1"

이 선들은 "return 1"와 "return -1"를 가지고 있다는 것을 알 수 있습니다. 이것은 고정된 형식입니다. 즉: 구매 방향이라면 "return 1"를 쓰십시오. 판매 방향이라면 "return -1"을 쓰십시오.

전체 전략 코드

이 시점에서, 완전한 전략 코드가 작성됩니다. 거래 프레임워크, 거래 데이터, 거래 논리 및 배치 주문이 별도로 작성되면 매우 간단합니다. 다음이이 전략의 전체 코드입니다:

function main() {
    $.CTA("this_week", function(st) {
        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price
        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours
        var mp = st.position.amount; // get the holding position information
        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2]; // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value
        if (mp == 1 && (close < midPrice || isClose)) return -1; // if holding long position, and the closing price is less than the mid-rail, or the current time is 14:45, closing long position.
        if (mp == -1 && (close > midPrice || isClose)) return 1; // if holding short position, and the closing price is greater than the mid-rail, or the current time is 14:45, closing short position.
        if (mp == 0 && close > upPrice && !isClose) return 1; // if there are no holding position, and the closing price is greater than the upper-rail, or the current time is not 14:45, open long position.
        if (mp == 0 && close < downPrice && !isClose) return -1;// if there are no holding position, and the closing price is less than the lower-rail, or the current time is not 14:45, open short position.
    })
}

두 가지 주의가 필요합니다.

  1. 현재 K-라인 조건이 설정됨에 따라 전략 논리를 작성하려고 노력하지만 반드시하지 않습니다. 다음 k-라인에 순서를 배치합니다. 또는 이전 k-라인 조건이 설정되어 현재 k-라인에 순서를 배치합니다. 이렇게하면 백테스트 결과와 실제 시장 성과가 크게 다르지 않습니다. 이렇게 작성하지 않는 것이 좋습니다. 그러나 전략 논리가 올바르는지에 유의하십시오.

  2. 일반적으로, 포지션을 닫는 논리는 오픈 포지션 논리의 앞에 써야 한다. 그 목적은 전략 논리를 당신의 기대에 부응하도록 하는 것이다. 예를 들어, 전략 논리가 단지 포지션을 막 닫은 후에 거래의 반대 방향으로 해야 하는 상황을 충족한다면, 이 같은 상황의 규칙은 먼저 포지션을 닫고 새로운 포지션을 열어야 한다. 만약 우리가 오픈 포지션 논리의 앞에 종료 포지션 논리를 써면, 그것은 완벽하게 이 규칙을 충족시킬 것이다.

요약하면

위에서 우리는 완전한 내일 양적 거래 전략을 개발하는 모든 단계를 배웠습니다. 전략 도입, 볼링거 지표 계산 방법, 전략 논리, 거래 조건, 전략 코드 구현 등이 포함됩니다. 이 전략 사례를 통해 FMZ 퀀트 도구의 프로그래밍 방법을 알고있을뿐만 아니라이 템플릿에 따라 적응되는 다른 전략을 구축 할 수 있습니다.

양적 거래 전략은 주관적 거래 경험 또는 시스템의 요약일 뿐입니다. 양적 전략을 작성하기 전에 주관적 거래에서 사용되는 경험 또는 시스템을 기록하고 한 번에 코드로 번역하면 양적 전략을 작성하는 것이 훨씬 더 쉬워진다는 것을 알게 될 것입니다.

다음 섹션에 대한 알림

양적 거래 전략 개발에서, 단 하나의 프로그래밍 언어를 선택할 수 있다면, 주저없이, 그것은 파이썬이어야 합니다. 데이터를 얻는 데서 백테스팅, 심지어 주문을 배치하는 부분까지, 파이썬은 전체 비즈니스 체인을 커버했습니다. 금융 양적 투자 분야에서, 파이썬은 매우 중요한 위치를 차지했습니다. 코스의 다음 섹션에서는 파이썬 언어를 배우기 시작할 것입니다.

학교 밖 운동

  1. 이 섹션의 지식을 사용하여 이중 이동 평균 전략을 구현하려고 노력하십시오.

  2. 자바스크립트 언어를 사용하여 FMZ 퀀트 플랫폼에서 KDJ 지표 전략을 구현하려고 노력하십시오.


더 많은