資金の活発な流れに基づいた取引戦略

作者: リン・ハーン優しさ, 作成日:2020-08-01 09:50:44, 更新日:2023-10-11 19:56:26

img

概要

価格が上昇または下落する.長期的には,価格上昇と下落の確率は50%であるべきです.したがって,将来の価格を正しく予測するには,価格に影響を与えるすべての要因をリアルタイムで取得し,次に各要素に正しい重量を与え,最終的に客観的で合理的な分析を行う必要があります.価格に影響するすべての要因をリストするには,宇宙全体を満たすことができます.

世界経済環境,国家マクロ政策,関連産業政策,供給と需要関係,国際イベント,金利と為替レート,インフレとデフレ,市場心理,その他の未知の要因など. 予測は巨大で不可能な仕事になりました. 市場が予測不可能であることを,私はすぐに理解しました. その後,市場のすべての予測は仮説になり,取引は確率のゲームになりました. これは興味深いです.

なぜ資本流を使うのか

市場が予測不能であるため,それは本当に無関心ですか? いいえ,すべてのマクロおよびマイクロ要因が価格に反映されています.これは価格がすべての要因の相互作用の結果であることを意味します.私たちは完全な取引戦略を作成するために価格を分析する必要があります.

まず考えてください なぜ価格が上昇するのか?

関連産業政策を支持する国,原産国,大雨,国際貿易戦争,MACDのゴールドフォークが買い取られ,他の人が買い取られ,などなど. もちろん,これらは間違っていないかもしれません. 後で振り返ると,私たちは常に価格上昇の理由を見つけることができます.

実際,価格の上昇と低下は上昇する潮流に似ている.価格上昇は資金の促進から切り離せない.市場で,売り手よりも買い手が多い場合,価格は上昇する.逆に,買い手よりも売り手が多い場合,価格は下がる.この概念を使用して,資金の純流に反映された供給と需要関係に基づいて将来の価格動向に対する合理的な期待を与えることができます.

資金流の原則

従来の分析とは異なり,資金流量分析は,取引データに基づいて,ある期間中の資金のアクティブ流入と,どの取引が資金のアクティブ流出であるかを分析する.その後,この期間のアクティブ流入量からアクティブ流出量を減算することで,この期間の資金の純流入を知ることができる.資金の純流入が正である場合,この製品の供給が不足していることを意味します.資金の純流出がこの製品の供給が過剰であることを意味します.

この文章を読んだ後,実際の取引では,誰かが購入し,誰かが販売するときにのみ取引が行われるのではないかと疑問に思う人もいるかもしれません.取引オーダーは,購入量と同じくらいの販売量を持ち,資金が同じ量に入ったり出たりしなければならない.資本の流入と流出はどこから来るのですか? 実際,厳密に言えば,すべての購入オーダーは,対応する販売オーダーに対応しなければならないし,資本の流入と流出は等しくなければなりません.どのオーダーが積極的に購入され,どのオーダーが積極的に販売されているかを計算したい場合は,取引量と価格に基づいて,K線バーデータを使用して妥協方法のみを使用できます.

資金流量計算方法

資金の流れの変化は,リアルタイム市場行動に正確に対応し,資金の純流は,k線バーデータを統合することによってリアルタイムで計算される.資金のアクティブフローを計算するためのアルゴリズムは2つあります:

まず,当期注文の現在の取引価格が相手方の価格または過価で実行される場合,購入取引価格 >=販売取引価格,つまり購入者は,資金のアクティブ流入に含まれているより高い価格で取引を完了する意向が高いことを意味します.

2つ目は,現在の取引価格が最後の取引価格より高くなった場合,現在の取引量が積極的に価格上昇を押し上げ,資金の活発な流入に含まれていることが理解できる.

上記の2番目のアルゴリズムを例として:

特定の商品の閉じる価格は10時00分は3450であり,閉じる価格は11時00分は3455である.したがって,我々は10時00分から11時00分までの取引量をアクティブ資本流入として含む.そうでなければ,資金のイニシアティブ流出に含まれます.この記事は,価格変動の因子を加えて2番目の方法に基づいています.前後のkラインバー閉じる価格を比較することによって,上昇または下降するkラインバー*波動のボリュームは順に含まれており,その後順にさらに資金のアクティブ流入比を計算します.

取引の論理

この記事では,フューチャー市場の資金の流れをの観点から説明し,K線バーデータのリアルタイム分析を通じて短期価格動向を判断するための取引モデルを確立する.通常の状況では,資本流と価格動向は4つの基本条件に分けることができる:

価格上昇と1時間単位あたりの資金の積極的な純流入:この状況は強烈で,将来の価格上昇は引き続き増加する可能性が高い.

株価が上昇し,1時間単位あたりの資金の積極的な純流出:この場合,それは中強のポジションであり,将来の価格上昇率は大幅に低下します.

株価が下がり,時間単位あたりの資金の積極的な純流入は弱くなっており,将来の価格が引き続き下がる可能性が高い.

株価が下がり,同時に 1 時間単位あたりの資金の積極的な純流出:この場合,それは適度な弱い立場であり,将来の価格下落の速度は大幅に減少します.

主な変数は以下のとおりです.

過去低値 (ll) 前回最高値 (hh) アクティブ購入 (BarIn) アクティブ販売 (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
        }
    }
}

戦略的特徴

  • 特徴:

基本パラメータは少ない.モデルには3つの基本パラメータのみで明確な設計構想があります.最適化空間は小さく,過適正は効果的に回避できます. 強力な普遍性:この戦略は論理的にシンプルで,普遍性が高い.農業製品を除くほとんどの品種に適応し,複数の品種と組み合わせることができます.

  • 改善:

保有ポジション条件を追加: 一方向 (株) 市場資金流通は,価格変動や取引量などの要因に基づいて資金の流入または流出を定義することができます.しかし,戦略には保有ポジション条件が含まれていないため,統計的なアクティブ資本流通は歪曲される可能性があります.

標準偏差条件を追加: ポジションを開設する条件として,資金の流れのみを頼りにすると,頻繁に誤った信号が発生し,結果としてポジションの頻繁な開設と閉鎖が発生する可能性があります. 指定された時間内に資金の純流出の平均値を数えて,標準偏差を上下に加算することによって誤った信号をフィルターします.

完全な戦略ソースコード:

/*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線バーデータを利用し,データ収集,関連分析,予測技術を通じて純資本流量モデルを確立する.将来の商品先物価格を予測し,商品先物のための定量的な取引戦略を設計するために時間系列分析を使用する.

この記事で言及されている資金の流れは,資金の活発な流れを指すことに注意すべきである.それは,資金の入出ではなく,市場における売り手と買い手の強さを指す.市場における買い手と売り手の行動を分析することによって将来の価格を判断することは,短期的な参照意義を持たない.


関連性

もっと