Maison  >  Article  >  Java  >  Comment Java met-il en œuvre une stratégie de trading basée sur le flux actif de fonds ?

Comment Java met-il en œuvre une stratégie de trading basée sur le flux actif de fonds ?

王林
王林avant
2023-04-18 18:34:271049parcourir
1. Résumé

Le prix est à la hausse ou à la baisse. À long terme, la probabilité d'augmentation ou de baisse du prix devrait être de 50 % chacune. Ainsi, pour prédire correctement les prix futurs, vous devez obtenir tous les facteurs qui affectent le prix. en temps réel, puis donner à chaque facteur un poids correct, et enfin une analyse objective et rationnelle. La liste de tous les facteurs qui affectent le prix remplirait tout l’écran.

Résumé : environnement économique mondial, politiques macro nationales, politiques industrielles associées, relations entre l'offre et la demande, événements internationaux, taux d'intérêt et taux de change, inflation et déflation, psychologie du marché, inconnues, etc. La prévision est devenue une tâche énorme et impossible. J’ai donc très tôt compris que le marché était imprévisible. Ensuite, toutes les prédictions du marché sont devenues des hypothèses, et le trading est devenu un jeu de probabilités, ce qui est intéressant.

2. Pourquoi utiliser le flux de fonds

Puisque le marché ne peut être prédit, est-il vraiment indifférent ? Non, tous les facteurs macro et micro ont été reflétés dans le prix, ce qui signifie que le prix est le résultat de l'interaction de tous les facteurs. Il suffit d'analyser le prix pour élaborer une stratégie de trading complète. Comment Java met-il en œuvre une stratégie de trading basée sur le flux actif de fonds ?

Réfléchissez bien d'abord, pourquoi le prix augmente-t-il ?

Vous pouvez dire que c'est à cause du soutien politique du pays aux industries connexes, des fortes pluies dans le pays d'origine, de la guerre commerciale internationale, de la croix d'or du MACD, d'autres achètent, etc. Bien sûr, cela peut être exact. Avec le recul, vous pouvez toujours voir les raisons qui ont fait monter les prix.

En fait, la hausse et la baisse des prix s’apparentent à une marée montante qui soulève tous les bateaux. La hausse des prix ne peut être séparée de la promotion des fonds. S'il y a plus d'acheteurs que de vendeurs sur le marché, les prix augmenteront. En revanche, s’il y a plus de vendeurs que d’acheteurs, le prix baissera. Avec ce concept, nous pouvons donner des attentes raisonnables quant aux tendances futures des prix, sur la base de la relation entre l’offre et la demande reflétée par le flux net de fonds.

3. Principe des flux de fonds

Différent de l'analyse traditionnelle, l'analyse des flux de fonds analyse quelles transactions constituent un afflux actif de fonds et quelles transactions constituent une sortie active de fonds en fonction des données de transaction d'une séquence sur une période de temps. Ensuite, en soustrayant le volume de sorties actives du volume d’entrées actives au cours de cette période, vous pouvez connaître l’entrée nette de capitaux au cours de cette période. Si l’entrée nette de fonds est positive, cela signifie que l’offre du produit dépasse la demande ; s’il y a une sortie nette de fonds, cela signifie que l’offre du produit dépasse la demande.

Comment Java met-il en œuvre une stratégie de trading basée sur le flux actif de fonds ?

Après avoir lu ceci, certaines personnes peuvent se demander que dans les transactions réelles, une transaction n'est complétée que lorsque quelqu'un achète et que quelqu'un vend. Les ordres de transaction doivent comporter autant de ventes que d'achats, et les entrées et sorties de fonds doivent être égales. D’où proviennent les entrées et sorties de capitaux ? En fait, à proprement parler, chaque ordre d'achat doit correspondre à un ordre de vente correspondant, et les entrées et sorties de capitaux doivent être égales. Si nous voulons calculer quels ordres ont été activement achetés et quels ordres ont été activement vendus, nous ne pouvons utiliser qu'une méthode de compromis, utilisant des données en barres et basée sur le volume et le prix des transactions.

4. Méthode de calcul des flux de capitaux

Les modifications des flux de capitaux correspondent avec précision au comportement du marché en temps réel. En intégrant les données en barres, le flux de capitaux net est calculé en temps réel. Il existe deux algorithmes pour calculer le flux de fonds actif :

  • Le premier, si le prix de transaction de l'ordre en cours est exécuté au prix de la contrepartie ou surcoté, le prix de transaction d'achat >= le prix de vente, ce qui signifie que l'acheteur est plus La volonté de finaliser la transaction à un prix plus élevé est incluse dans l'afflux actif de fonds.

  • Deuxièmement, si le prix de transaction actuel > le prix de la dernière transaction, alors on peut comprendre que le volume de transactions actuel fait augmenter activement l'augmentation des prix, c'est-à-dire que l'afflux actif de fonds est inclus.

Comment Java met-il en œuvre une stratégie de trading basée sur le flux actif de fonds ?

Prenons le deuxième algorithme ci-dessus comme exemple :

Le cours de clôture d'une certaine variété à 10h00 est de 3450, et le cours de clôture à 11h00 est de 3455, alors nous utilisons 10h00 ~ 11 : Le volume de trading de 00 est inclus dans l'afflux actif de fonds. Dans le cas contraire, il sera inclus dans les sorties de fonds actives. Cet article est basé sur la deuxième méthode et ajoute le facteur de fluctuation des prix.En comparant les prix de clôture des barres précédentes et précédentes, le volume des transactions * la plage de fluctuation de la barre ascendante ou descendante est incluse dans une séquence, puis basée sur une autre base. sur cette séquence, calculez le taux d’entrée active de fonds.

5. Logique de trading

Cet article décrit le flux de capitaux du marché à terme du point de vue du « volume » et établit un modèle de trading pour juger des tendances des prix à court terme en analysant les données des barres en temps réel. Dans des circonstances normales, les flux de capitaux et les tendances des prix peuvent être divisés en quatre situations de base :

  • Les prix augmentent, et en même temps, il y a un afflux net de capitaux par unité de temps : Cette situation est considérée comme forte, et la probabilité la probabilité que les prix continuent d'augmenter à l'avenir est plus grande ;

  • Le cours de l'action augmente, et en même temps, il y a une sortie nette de fonds sur une base active par unité de temps : dans ce cas, il s'agit d'une une force forte, et le taux de hausse continue des prix à l'avenir est considérablement affaibli

  • Le cours de l'action baisse, et en même temps, il y a un afflux net de fonds à l'initiative par unité de temps ; , il est considéré comme un point faible, et la probabilité que le prix continue de baisser dans le futur est plus grande ;

  • Le cours de l'action baisse, et en même temps, il y a une sortie nette de fonds à l'initiative par unité de temps : dans ce cas, il s'agit d'une situation moyennement faible, et la vitesse de baisse future des prix est considérablement affaiblie Comment Java met-il en œuvre une stratégie de trading basée sur le flux actif de fonds ?

Les principales variables sont les suivantes :

  • Période préliminaire Bas (ll)

  • Précédent haut (hh)

  • Achat actif (barIn)

  • Vente active ( barOut)

  • Le rapport entre les entrées actives et les sorties actives (barRatio)

  • Seuil d'ouverture (openValve)

  • Position actuelle (myAmount)

  • Dernier cours de clôture de la ligne K (close)

Conditions de sortie et d'entrée Un bon trading quantitatif La stratégie nécessite non seulement des rendements stables, mais aussi la capacité de contrôler les risques et d'éviter des pertes importantes lorsqu'une faible probabilité se produit. Ici, nous utilisons la stratégie de suivi des flux de capitaux actifs et analysons l’orientation du marché des contrats à terme sur matières premières à l’aide de prévisions de prix à court terme afin d’obtenir des rendements élevés et de faibles risques. Les étapes de la stratégie sont les suivantes : Comment Java met-il en œuvre une stratégie de trading basée sur le flux actif de fonds ?

  • Ouvrir une position longue : s'il n'y a actuellement aucune position et barRatio > openValve, ouvrez une position d'achat 

  • Ouvrir une position courte : s'il n'y a actuellement aucune position ; , et barRatio < 1 / openValve, vendez pour ouvrir une position

  • clôture de position longue : si vous détenez actuellement une position longue et fermez < ll, vendez pour clôturer la position ; : si vous détenez actuellement une position courte et fermez > ; hh, achetez et clôturez

  • 6. Écrivez le code source de la stratégie

Obtenez et calculez les données
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;
}</p>
<p> Obtenez directement les données de la barre via la méthode GetRecords dans le API de quantification de l'inventeur. Contient le prix le plus élevé, le prix le plus bas, le prix d'ouverture, le prix de clôture, le volume des transactions et l'horodatage standard. Si le dernier prix de transaction est supérieur au dernier prix de transaction, alors le dernier volume de transaction * (prix le plus élevé - prix le plus bas) sera inclus dans l'achat actif; si le dernier prix de transaction est inférieur au dernier prix de transaction, alors le dernier prix de transaction sera inclus. le volume des transactions * (prix le plus élevé - prix le plus bas) sera inclus dans l'achat actif ; Le volume des transactions* (prix le plus élevé - prix le plus bas) est inclus dans la vente active <strong></strong></p>Obtenir les données de position<p></p>
<pre class="brush:php;toolbar:false">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;
}

Obtenir les données de position de base via ; la méthode GetPosition dans l'API quantitative de l'inventeur et traitez davantage ces données de base. Si vous détenez actuellement une commande longue, renvoyez la quantité de position positive si vous détenez actuellement une commande courte, renvoyez la quantité de position négative ; Le but de ceci est de faciliter le calcul de la logique des positions d’ouverture et de fermeture.

Passez une commande et échangez

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); //空头开仓
        }
    }
}

7. Caractéristiques de la stratégie

Caractéristiques :

Peu de paramètres de base : L'idée de conception du modèle est claire et il n'y a que 3 paramètres de base. L'espace d'optimisation est réduit et le surajustement peut être efficacement évité. Forte universalité : la logique stratégique est simple et présente une grande universalité. Elle convient à la plupart des variétés, à l'exception des produits agricoles, et peut être combinée avec plusieurs variétés.

Amélioration : 

Conditions de position ajoutées : le flux de capitaux unidirectionnel (boursier) sur le marché peut définir l'entrée ou la sortie de capitaux en fonction des hausses et des baisses de prix, du volume des transactions et d'autres facteurs. Cependant, comme cette stratégie n'inclut pas la condition de position, les statistiques des flux de fonds actifs peuvent être faussées. Ajouter des conditions d'écart type : s'appuyer uniquement sur le flux de fonds, car les conditions d'ouverture des positions peuvent provoquer de fréquents faux signaux, entraînant des ouvertures et des fermetures fréquentes de positions. Les faux signaux sont filtrés en comptant la moyenne des sorties nettes de fonds sur une période de temps spécifiée, plus l'écart type.

Code source complet de la stratégie :

/*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函数
        }
    }
}

8. Backtest de la stratégie

Configuration de la stratégie :

Performance du backtest : Comment Java met-il en œuvre une stratégie de trading basée sur le flux actif de fonds ?

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer