価格は上昇または下落のいずれかです。長期的には、価格の上昇または下落の確率はそれぞれ 50% であるはずです。将来の価格を正確に予測するには、すべての要素を取得する必要がありますリアルタイムで価格に影響を与える各要因を正確に加重し、最終的に客観的かつ合理的な分析を行います。価格に影響を与えるすべての要素をリストすると、画面全体がいっぱいになってしまいます。
概要: 世界経済環境、国家マクロ政策、関連する産業政策、需給関係、国際情勢、金利と為替、インフレとデフレ、市場心理、未知の要因など。予測は巨大かつ不可能な作業となっています。そのため、私は市場が予測不可能であることを早い段階で理解していました。そうなると、市場のすべての予測は仮定になり、取引は確率のゲームになり、興味深いものになります。
市場は予測できないため、本当に無関心なのでしょうか?いいえ、すべてのマクロ要因とミクロ要因が価格に反映されています。つまり、価格はすべての要因の相互作用の結果です。完全な取引戦略を立てるために必要なのは、価格を分析することだけです。
まず、なぜ価格が上昇するのかをよく考えてください。
その理由は、関連産業に対する国の政策支援、原産国が大雨に見舞われている、国際貿易戦争、MACDがゴールデンクロスを持っている、他の企業が買っているなどの理由だと言うかもしれません。もちろん、 、これらはすべてそうです。後から考えると、価格が上昇した理由をいつでも確認できます。
実際、価格の上昇と下降は、すべての船を持ち上げる上げ潮に似ています。価格の上昇は資金の促進と切り離すことができず、市場に売り手よりも買い手が多ければ、価格は上昇します。逆に、売り手の数が買い手よりも多ければ、価格は下がります。この概念により、資金の純フローに反映される需要と供給の関係に基づいて、将来の価格動向に合理的な期待を与えることができます。
資金フロー分析は、従来の分析とは異なり、企業の取引データに基づいて、どの取引で資金の流入が活発で、どの取引で資金の流入が活発であるかを分析します。一定期間にわたるシーケンス。アウトフロー。そして、その期間中の有効流入量から有効流出量を差し引くことで、その期間中の純資本流入量を知ることができます。資金の純流入がプラスであれば、この商品の供給が需要を上回っていることを意味し、資金の純流出であれば、この商品の供給が需要を上回っていることを意味します。
#これを読んで、実際の取引では誰かが買って誰かが売ることで取引が成立するのではないかと疑問に思う人もいるかもしれません。取引注文では購入と同数の販売が必要であり、資金の流入と流出は等しくなければなりません。資本の流入と流出はどこから来るのでしょうか?実際、厳密に言えば、各買い注文は対応する売り注文に対応する必要があり、資本流入と資本流出は等しくなければなりません。どの注文が積極的に買われ、どの注文が積極的に売られたかを計算したい場合は、足データを使用し、取引高と価格に基づいて妥協する方法を使用するしかありません。
資本フローの変化はリアルタイムの市場動向に正確に対応し、足データを統合することで、正味の資本フローをリアルタイムに計算します。アクティブな資金の流れを計算するアルゴリズムは 2 つあります。
1 つ目は、現在の注文の取引価格がカウンターパーティ価格または超過価格で約定された場合、購入取引価格> = 最初の販売価格は、活発な資金流入を考慮して、購入者がより高い価格で取引を完了する意欲を意味します。
第二に、現在の取引価格 > 前回の取引価格の場合、現在の取引量が積極的に価格上昇を押し上げている、つまり、現在の取引量が価格上昇幅に含まれていることが理解できます。資本イニシアチブの流入。
上記の 2 番目のアルゴリズムを例に挙げます。
ある品種の 10:00 の終値は 3450 です。 11:00の終値は3455ですので、10:00~11:00までの出来高を積極的な資金流入として含めます。そうでなければ、積極的な資金流出に含まれることになる。この記事では、2番目の方法をベースに、価格変動の要素を加え、前後足の終値を比較することで、上昇足または下降足の出来高×変動幅を数列に組み込み、さらにそれに基づいていきます。シーケンスに基づいて資金の有効流入比率を計算します。
この記事では、先物市場の資金の流れを「出来高」の観点から説明し、足データを分析して短期的な価格傾向を判断する取引モデルを確立します。リアルタイムで。通常の状況では、資本の流れと価格の傾向は 4 つの基本的な状況に分類できます。
#価格が上昇し、同時に単位時間あたりの純資本の流入が存在します。 : この場合、強いです。今後も価格が上昇し続ける可能性が高くなります。
株価が上昇し、同時にネットが存在します。単位時間当たりの資本主導権の流出:この場合は中堅と考えられ、今後の株価上昇速度は大幅に鈍化する;
株価は下落し、そして同時に、単位時間当たりの資本イニシアチブの純流入が存在します。この場合、それが弱点であり、価格が将来も下落し続ける可能性の方が高くなります;
株価が下落し、同時に単位時間当たりの資金の純流出が発生する。この場合は中安の状況であり、将来の株価下落の速度は
主な変数は次のとおりです:
前回の最低点 (ll )
前回の高値 (hh )
積極的な買い (barIn)
積極的な売り(barOut)
アクティブな流入とアクティブな流出の比率 (barRatio)
開口しきい値 (openValve)
現在のポジション (myAmount)
最終 K ライン終値 (close)
#エントリーとエントリー条件 優れたクオンツトレーディング戦略には、安定した収入と、小さな確率が発生したときに大きな損失を回避するリスクを制御する能力だけが必要ではありません。ここでは、活発な資本の流れを追跡する戦略を使用し、短期価格予測を利用して商品先物の市場の方向性を分析し、高いリターンと低いリスクを実現します。戦略の手順は次のとおりです:
ロング ポジションをオープンする: 現在ポジションがなく、barRatio > openValve の場合、ロング ポジションをオープンします。
ショート ポジションのオープン: 現在ポジションがなく、barRatio
ロング ポジションのクローズ: ポジションがある場合現在ロングポジションを持っており、クローズ
ショートポジションクローズ: 現在ショートポジションを保持し、クローズ>hh の場合、購入してポジションをクローズします。
データの取得と計算
function data() { var self = {}; var barVol = []; var bars = _C(exchange.GetRecords); //获取bar数据 if (bars.length < len * 2) { //控制bar数据数组的长度 return; } for (var i = len; i > 0; i--) { var barSub_1 = bars[bars.length - (i + 1)].Close - bars[bars.length - (i + 2)].Close; //计算当前收盘价与上个bar收盘价的价差 if (barSub_1 > 0) { //如果价格涨了,就在数组里面添加正数 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) { //如果价格跌了,就在数组里面添加负数 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(); //释放多余的数据 } self.barIn = 0; self.barOut = 0; for (var v = 0; v < barVol.length; v++) { if (barVol[v] > 0) { self.barIn += barVol[v]; //合并全部主动流入的资金 } else { self.barOut -= barVol[v]; //合并全部主动流出的资金 } } self.barRatio = self.barIn / Math.abs(self.barOut); //计算主动流入资金与主动流出资金的比值 bars.pop(); //删除未结束的bar数据 self.close = bars[bars.length - 1].Close; //获取上根K线的收盘价 self.hh = TA.Highest(bars, hgLen, 'High'); //获取前高 self.ll = TA.Lowest(bars, hgLen, 'Low'); //获取前低 return self; }
GetRecords を通じてバー データを直接取得します発明者の定量化 API のメソッド。高値、安値、始値、終値、取引高、標準タイムスタンプが含まれます。最新の取引価格が最後の取引価格より高い場合は、最新の取引量 * (最高値 - 最低価格) がアクティブな購入に含まれます。最新の取引価格が最後の取引価格より低い場合は、最新の取引量がアクティブな購入に含まれます。取引量 * (最高値 - 最低価格) はアクティブな買いに含まれます; 取引高 * (最高値 - 最低価格) はアクティブな売りに含まれます;
ポジション データの取得
function positions(name) { var self = {}; var mp = _C(exchange.GetPosition); //获取持仓 if (mp.length == 0) { self.amount = 0; } for (var i = 0; i < mp.length; i++) { //持仓数据处理 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; }
発明者の定量的 API 基本ポジション データの GetPosition メソッドを通じて取得され、これらの基本データをさらに処理します。現在ロング注文を保持している場合は、正のポジション数量を返します。現在ショート注文を保持している場合は、正のポジション数量を返します。 、負の位置数量を返します。この目的は、ポジションのオープンおよびクローズのロジックの計算を容易にすることです。
注文と取引
function trade() { var myData = data(); //执行data函数 if (!myData) { return; } var mp = positions(contractType); //获取持仓信息 var myAmount = mp.amount; //获取持仓数量 var myProfit = mp.profit; //获取持仓浮动盈亏 if (myAmount > 0 && myData.close < myData.ll) { p.Cover(contractType, unit); //多头平仓 } if (myAmount < 0 && myData.close > myData.hh) { p.Cover(contractType, unit); //空头平仓 } if (myAmount == 0) { if (myData.barRatio > openValve) { p.OpenLong(contractType, unit); //多头开仓 } else if (myData.barRatio < 1 / openValve) { p.OpenShort(contractType, unit); //空头开仓 } } }
特徴:
コアが少ないパラメータ: モデル設計のアイデアは明確であり、中心となるパラメータは 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(); //调用商品期货交易类库 //持仓数据处理 function positions(name) { var self = {}; var mp = _C(exchange.GetPosition); //获取持仓 if (mp.length == 0) { self.amount = 0; } for (var i = 0; i < mp.length; i++) { //持仓数据处理 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; } //行情数据处理函数 function data() { var self = {}; var barVol = []; var bars = _C(exchange.GetRecords); //获取bar数据 if (bars.length < len * 2) { //控制bar数据数组的长度 return; } for (var i = len; i > 0; i--) { var barSub_1 = bars[bars.length - (i + 1)].Close - bars[bars.length - (i + 2)].Close; //计算当前收盘价与上个bar收盘价的价差 if (barSub_1 > 0) { //如果价格涨了,就在数组里面添加正数 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) { //如果价格跌了,就在数组里面添加负数 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(); //释放多余的数据 } self.barIn = 0; self.barOut = 0; for (var v = 0; v < barVol.length; v++) { if (barVol[v] > 0) { self.barIn += barVol[v]; //合并全部主动流入的资金 } else { self.barOut -= barVol[v]; //合并全部主动流出的资金 } } self.barRatio = self.barIn / Math.abs(self.barOut); //计算主动流入资金与主动流出资金的比值 bars.pop(); //删除未结束的bar数据 self.close = bars[bars.length - 1].Close; //获取上根K线的收盘价 self.hh = TA.Highest(bars, hgLen, 'High'); //获取前高 self.ll = TA.Lowest(bars, hgLen, 'Low'); //获取前低 return self; } //交易函数 function trade() { var myData = data(); //执行data函数 if (!myData) { return; } var mp = positions(contractType); //获取持仓信息 var myAmount = mp.amount; //获取持仓数量 var myProfit = mp.profit; //获取持仓浮动盈亏 if (myAmount > 0 && myData.close < myData.ll) { p.Cover(contractType, unit); //多头平仓 } if (myAmount < 0 && myData.close > myData.hh) { p.Cover(contractType, unit); //空头平仓 } if (myAmount == 0) { if (myData.barRatio > openValve) { p.OpenLong(contractType, unit); //多头开仓 } else if (myData.barRatio < 1 / openValve) { p.OpenShort(contractType, unit); //空头开仓 } } } //程序主入口,从这里启动 function main() { while (true) { //进入循环 if (exchange.IO("status")) { //如果是开市时间 _C(exchange.SetContractType, contractType); //订阅合约 trade(); //执行trade函数 } } }
戦略構成: バックテストのパフォーマンス:
以上がJava は、活発な資金の流れに基づいたトレーディング戦略をどのように実装しているのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。