액티브 자금 흐름에 기반한 거래 전략

저자:선함, 2020-08-01 09:50:44로 제작, 2023-10-11 19:56:26로 업데이트

img

요약

가격 상승 또는 하락. 장기적으로, 가격 상승 및 하락의 확률은 50%가 되어야 합니다. 따라서 미래의 가격을 올바르게 예측하기 위해서는 가격에 영향을 미치는 모든 요인을 실시간으로 얻어야 하고, 각 요인에 올바른 무게를 부여하고, 마지막으로 객관적이고 합리적인 분석을 해야 합니다. 가격을 영향을 미치는 모든 요인을 나열하면 우주 전체를 채울 수 있습니다.

요약하면: 세계 경제 환경, 국가 거시 정책, 관련 산업 정책, 수요와 공급 관계, 국제 사건, 금리 및 환율, 인플레이션과 디플레이션, 시장 심리학 및 기타 알려지지 않은 요인 등 예측은 거대한 불가능한 작업이되었습니다. 그래서 일찍이 시장이 예측 불가능하다는 것을 이해했습니다. 시장의 모든 예측은 가설이 되었고 거래는 흥미있는 확률의 게임이되었습니다.

왜 자본 흐름을 사용하는지

시장은 예측할 수 없기 때문에 정말 무관심합니까? 아니요, 모든 거시적 및 미시적 요인이 가격에 반영되었습니다. 즉 가격은 모든 요인의 상호 작용의 결과입니다. 우리는 완전한 거래 전략을 만들기 위해 가격을 분석해야합니다.

먼저 생각해봐요, 왜 가격이 올까요?

당신은 이렇게 말할 수 있습니다. 왜냐하면: 국가는 관련 산업 정책을 지지하고, 원산지는 폭우, 국제 무역 전쟁, MACD 골든 포크가 구입되고, 다른 사람들이 그것을 구입했습니다.

사실, 가격 상승과 하락은 상승 기류와 유사하다. 가격 상승은 자금의 홍보와 떼려야?? 수 없다. 시장에서, 판매자보다 구매자가 더 많으면 가격이 상승할 것이다. 반대로, 구매자보다 판매자가 더 많으면 가격이 떨어질 것이다. 이 개념으로, 우리는 자금의 순류에 반영된 수요와 공급의 관계에 기초하여 미래의 가격 추세에 대한 합리적인 기대를 줄 수 있다.

자금 흐름 원칙

전통적인 분석과 달리, 자금흐름 분석은 어떤 거래가 일정 기간 동안의 거래 데이터를 기반으로 자금의 활성 유입이고 어떤 거래가 기간 동안의 자금의 활성 유출인지 분석합니다. 그 다음, 이 기간 동안의 활성 유입량에서 활성 유출량을 빼면, 이 기간 동안의 자금의 순수 유입을 알 수 있습니다. 자금의 순수 유입이 긍정적 인 경우,이 제품의 공급이 부족하다는 것을 의미합니다. 자금의 순수 유출이이이 제품의 공급이 과잉이라는 것을 의미합니다.

이 글을 읽은 후, 어떤 사람들은 실제 거래에서 거래는 누군가가 구매하고 누군가가 판매할 때만 이루어질 것이라고 생각할 수 있습니다. 거래 주문은 구매량만큼 판매량이 많아야 하며, 자금은 같은 금액으로 들어와 나올 수 있어야 합니다. 자본의 유입과 유출은 어디에서 나옵니다? 사실, 엄밀히 말하면, 모든 구매 주문은 해당 판매 주문에 대응해야 하며, 자본의 유입과 출동은 동일해야 합니다. 어떤 주문이 적극적으로 구매되고 어떤 주문이 적극적으로 판매되는지를 계산하고 싶다면, 우리는 단지 거래량과 가격을 기반으로 한 K 라인 바 데이터를 사용하여 타협 방법을 사용할 수 있습니다.

기금흐름 계산 방법

자금 흐름의 변화는 실시간 시장 행동에 정확하게 대응하며, 자금 순 흐름은 k선 바 데이터를 통합하여 실시간으로 계산됩니다. 활성 자금 흐름을 계산하는 알고리즘은 두 가지가 있습니다:

첫째, 현재 주문의 현재 거래가격이 상대방 가격 또는 과다 가격으로 실행되는 경우, 구매 거래 가격은 >= 판매 거래 가격이며, 이는 구매자가 액티브 자금 유입에 포함된 더 높은 가격으로 거래를 완료하는 것을 더 기꺼이한다는 것을 의미합니다.

둘째, 현재 거래가격이 마지막 거래가격보다 높다면, 현재 거래량이 적극적으로 가격 상승을 추진한다는 것을 이해할 수 있습니다. 이는 적극적인 자금 유입에 포함됩니다.

예를 들어, 위의 두 번째 알고리즘을 들어보죠.

10:00에 특정 상품의 폐쇄 가격은 3450이며, 11:00에 폐쇄 가격은 3455입니다. 따라서 우리는 10:00에서 11:00 사이의 거래량을 활성 자본 유입으로 포함합니다. 그렇지 않으면 자금의 주도 유출에 포함됩니다. 이 기사는 가격 변동성의 인수를 추가하여 두 번째 방법을 기반으로합니다. 이전과 후의 k 라인 바 폐쇄 가격을 비교하여 상승 또는 하락하는 k 라인 바 * 변동성의 부피를 순서로 포함하고 순서에 따라 추가로 자금의 활성 유입 비율을 계산합니다.

거래 논리

이 문서에서는 용량의 관점에서 선물 시장의 자금 흐름을 설명하고 K 라인 바 데이터의 실시간 분석을 통해 단기 가격 추세를 판단하는 거래 모델을 설정합니다. 정상적인 상황에서는 자본 흐름과 가격 추세를 네 가지 기본 조건으로 나눌 수 있습니다.

가격 상승과 단위 시간당 자금의 활성 순수 유입: 이 상황은 강력하며 미래의 가격이 계속 상승 할 가능성이 높습니다.

주식 가격이 상승하고, 단위 시간당 자금의 액티브 순 유출: 이 경우 중-강한 위치이며, 미래의 가격 상승률은 크게 감소합니다.

주식 가격이 떨어지고, 단위 시간당 자금의 순액 유입은 약하고, 미래 가격이 계속 떨어질 가능성이 높습니다.

주식 가격이 하락하고 동시에 시간 단위당 자금의 액티브 순 유출: 이 경우, 그것은 중소적으로 약한 위치이며, 미래의 가격 하락의 비율은 크게 감소 할 것입니다.

주요 변수는 다음과 같습니다.

이전 최저 (ll) 이전 최고치 (hh) 액티브 인수 (바라인) 액티브 판매 (barOut) 액티브 자금 유입과 액티브 자금 유출의 비율 (barRatio) 열기 위치 문턱 (openValve) 현재 보유 지점 (myAmount) 마지막 K 라인 종료 가격 (결결)

입국 및 출국 조건

좋은 양적 거래 전략은 안정적인 수익뿐만 아니라 위험을 제어하고 작은 확률이있을 때 큰 손실을 피하는 능력도 필요합니다. 여기서 우리는 높은 수익과 낮은 위험 효과를 달성하기 위해 단기 가격 예측의 도움으로 활성 자금 흐름을 추적하는 전략을 사용합니다.

  • 긴 포지션 개척: 현재 대기 포지션이 없고 barRatio > openValve가 없다면 긴 포지션을 개척합니다.

  • 짧은 포지션 개척: 현재 홀딩 포지션과 barRatio < 1 / openValve가 없으면 짧은 포지션을 개척합니다.

  • 롱 포지션 폐쇄: 현재 롱 포지션이 유지되고 닫히면 < ll, 롱 포지션을 판매하고 닫습니다.

  • 짧은 포지션 폐쇄: 현재 짧은 포지션이 유지되고 닫히면 > hh, 짧은 포지션을 구매하고 닫습니다.

전략 소스 코드를 작성

데이터 수집 및 계산

function data() {
    var self = {};
    var barVol = [];
    var bars = _C(exchange.GetRecords); //Get K line bar data
    if (bars.length < len * 2) { //Control the length of the K line bar data array
        return;
    }
    for (var i = len; i > 0; i--) {
        var barSub_1 = bars[bars.length - (i + 1)].Close - bars[bars.length - (i + 2)].Close; //Calculate the difference between the current closing price and the previous K line bar closing price
        if (barSub_1 > 0) { //If the price rises, add a positive number to the array
            barVol.push(bars[bars.length - (i + 1)].Volume * (bars[bars.length - (i + 1)].High - bars[bars.length - (i + 1)].Low));
        } else if (barSub_1 < 0) { //If the price drops, add a negative number to the array
            barVol.push(-bars[bars.length - (i + 1)].Volume * (bars[bars.length - (i + 1)].High - bars[bars.length - (i + 1)].Low));
        }
    }
    if (barVol.length > len) {
        barVol.shift(); //Free up excess data
    }
    self.barIn = 0;
    self.barOut = 0;
    for (var v = 0; v < barVol.length; v++) {
        if (barVol[v] > 0) {
            self.barIn += barVol[v]; //Consolidate all active inflows funds
        } else {
            self.barOut -= barVol[v]; //Consolidate all active outflow funds
        }
    }
    self.barRatio = self.barIn / Math.abs(self.barOut); //Calculate the ratio of active inflows to active outflows
    bars.pop(); //Delete unfinished K line bar data
    self.close = bars[bars.length - 1].Close; //Get the closing price of the pervious bar
    self.hh = TA.Highest(bars, hgLen, 'High'); //Get the previous high price
    self.ll = TA.Lowest(bars, hgLen, 'Low'); //Get the previous low price
    return self;
}

K 라인 바 데이터를 직접GetRecordsFMZ API의 방법. 가장 높은 가격, 가장 낮은 가격, 시작 가격, 종료 가격, 부피 및 표준 타임 스탬프를 포함합니다. 최신 거래 가격이 마지막 거래 가격보다 크다면 최신 거래량 * (최고 가격-최저 가격) 이 활성 구매에 포함됩니다. 최신 거래 가격이 마지막 거래 가격보다 작다면 최신 거래량 * (최고 가격-최저 가격) 이 활성 판매에 포함됩니다.

위치 데이터를 얻으십시오

function positions(name) {
    var self = {};
    var mp = _C(exchange.GetPosition); //Get positions
    if (mp.length == 0) {
        self.amount = 0;
    }
    for (var i = 0; i < mp.length; i++) { //Position data processing
        if (mp[i].ContractType == name) {
            if (mp[i].Type == PD_LONG || mp[i].Type == PD_LONG_YD) {
                self.amount = mp[i].Amount;
            } else if (mp[i].Type == PD_SHORT || mp[i].Type == PD_SHORT_YD) {
                self.amount = -mp[i].Amount;
            }
            self.profit = mp[i].Profit;
        } else {
            self.amount = 0;
        }
    }
    return self;
}

기본 위치 데이터를GetPositionFMZ 플랫폼 API에서 메소드를 사용하여 기본 데이터를 처리합니다. 현재 긴 포지션이 유지되면 긍정적 인 포지션 양이 반환됩니다. 현재 포지션이 짧다면 부정적인 포지션 양이 반환됩니다.

주문 발송

function trade() {
    var myData = data(); //Execute data function
    if (!myData) {
        return;
    }
    var mp = positions(contractType); //Get position information
    var myAmount = mp.amount; //Get the number of positions
    var myProfit = mp.profit; //Get floating profit and loss
    if (myAmount > 0 && myData.close < myData.ll) {
        p.Cover(contractType, unit); //close long position
    }
    if (myAmount < 0 && myData.close > myData.hh) {
        p.Cover(contractType, unit); //close short position
    }
    if (myAmount == 0) {
        if (myData.barRatio > openValve) {
            p.OpenLong(contractType, unit); //open long position
        } else if (myData.barRatio < 1 / openValve) {
            p.OpenShort(contractType, unit); //open short position
        }
    }
}

전략적 특성

  • 특징:

몇 가지 핵심 매개 변수: 모델은 세 가지 핵심 매개 변수만을 가진 명확한 디자인 아이디어를 가지고 있습니다. 최적화 공간이 작고 과도한 부착을 효과적으로 피할 수 있습니다. 강력한 보편성: 전략은 논리적으로 간단하며 높은 보편성을 가지고 있습니다. 농산물을 제외한 대부분의 품종에 적응 할 수 있으며 여러 품종과 결합 할 수 있습니다.

  • 개선 사항:

보유 지점 조건 추가: 한 방향 (주식) 시장 자금 흐름은 가격 변동 및 거래량과 같은 요소를 기반으로 자금의 유입 또는 출동을 정의 할 수 있습니다. 그러나 전략에 보유 지위의 조건이 포함되지 않기 때문에 통계적 활성 자본 흐름이 왜곡 될 수 있습니다.

표준편차 조건 추가: 단지 자금 흐름에 의존하여 포지션을 개설하는 조건으로, 빈번한 잘못된 신호가 발생할 수 있으며, 결과적으로 빈번한 포지션 개설 및 폐쇄가 발생할 수 있습니다. 지정된 시간 내에 자금 순출액의 평균 값을 계산하고 표준편차를 위아래로 더하여 잘못된 신호를 필터하십시오.

전체 전략 소스 코드

/*backtest
start: 2016-01-01 09:00:00
end: 2019-12-31 15:00:00
period: 1h
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
*/

var p = $.NewPositionManager(); //Call commodity futures trading library

//Holding Position data processing
function positions(name) {
    var self = {};
    var mp = _C(exchange.GetPosition); //Get positions
    if (mp.length == 0) {
        self.amount = 0;
    }
    for (var i = 0; i < mp.length; i++) { //Holding Position data processing
        if (mp[i].ContractType == name) {
            if (mp[i].Type == PD_LONG || mp[i].Type == PD_LONG_YD) {
                self.amount = mp[i].Amount;
            } else if (mp[i].Type == PD_SHORT || mp[i].Type == PD_SHORT_YD) {
                self.amount = -mp[i].Amount;
            }
            self.profit = mp[i].Profit;
        } else {
            self.amount = 0;
        }
    }
    return self;
}

//Market data processing function
function data() {
    var self = {};
    var barVol = [];
    var bars = _C(exchange.GetRecords); //Get K line bar data
    if (bars.length < len * 2) { //Control the length of the K line bar data array
        return;
    }
    for (var i = len; i > 0; i--) {
        var barSub_1 = bars[bars.length - (i + 1)].Close - bars[bars.length - (i + 2)].Close; //Calculate the difference between the current closing price and the previous K line bar closing price
        if (barSub_1 > 0) { //If the price rises, add a positive number to the array
            barVol.push(bars[bars.length - (i + 1)].Volume * (bars[bars.length - (i + 1)].High - bars[bars.length - (i + 1)].Low));
        } else if (barSub_1 < 0) { //If the price drops, add a negative number to the array
            barVol.push(-bars[bars.length - (i + 1)].Volume * (bars[bars.length - (i + 1)].High - bars[bars.length - (i + 1)].Low));
        }
    }
    if (barVol.length > len) {
        barVol.shift(); //Free up excess data
    }
    self.barIn = 0;
    self.barOut = 0;
    for (var v = 0; v < barVol.length; v++) {
        if (barVol[v] > 0) {
            self.barIn += barVol[v]; //Consolidate all active inflows funds
        } else {
            self.barOut -= barVol[v]; //Consolidate all active outflow funds
        }
    }
    self.barRatio = self.barIn / Math.abs(self.barOut); //Calculate the ratio of active inflows to active outflows
    bars.pop(); //Delete unfinished K line bar data
    self.close = bars[bars.length - 1].Close; //Get the closing price of the last K line bar
    self.hh = TA.Highest(bars, hgLen, 'High'); //Get the previous high price
    self.ll = TA.Lowest(bars, hgLen, 'Low'); //Get the previous low price
    return self;
}

//Trading function
function trade() {
    var myData = data(); //Execute data function
    if (!myData) {
        return;
    }
    var mp = positions(contractType); //Get position information
    var myAmount = mp.amount; //Get the number of positions
    var myProfit = mp.profit; //Get floating profit and loss
    if (myAmount > 0 && myData.close < myData.ll) {
        p.Cover(contractType, unit); //close long position
    }
    if (myAmount < 0 && myData.close > myData.hh) {
        p.Cover(contractType, unit); //close short position
    }
    if (myAmount == 0) {
        if (myData.barRatio > openValve) {
            p.OpenLong(contractType, unit); //open long position
        } else if (myData.barRatio < 1 / openValve) {
            p.OpenShort(contractType, unit); //open short position
        }
    }
}

//The main entrance of the program, start from here
function main() {
    while (true) { //Enter the loop
        if (exchange.IO("status")) { //If it is the market opening time
            _C(exchange.SetContractType, contractType); //Subscription contract
            trade(); //Execute trade function
        }
    }
}

전략 주소:https://www.fmz.com/strategy/87698

전략 백테스트

전략 구성:

img

백테스트 성능:

img

요약하면

모델링을 통해 이 문서에서는 FMZ 거래 플랫폼에서 제공하는 상품 선물 K 라인 바 데이터를 사용하여 데이터 수집, 관련 분석 및 예측 기술을 통해 순자본 흐름 모델을 설정합니다. 미래 상품 선물 가격을 예측하고 상품 선물에 대한 양적 거래 전략을 설계하기 위해 시간 시리즈 분석을 사용합니다.

이 문서에서 언급되는 자금 흐름은 자금의 활성 흐름을 가리키는 것으로 유의해야 한다. 그것은 자금의 입출입이 아니라 시장에서 판매자와 구매자의 강도를 가리킨다. 시장에서 구매자와 판매자의 행동을 분석함으로써 미래의 가격을 판단하는 것은 단기 기준의 의미가 없다.


관련

더 많은