Le prix est soit en hausse ou en baisse. à long terme, la probabilité de hausse et de baisse des prix devrait être de 50%, donc pour prédire correctement le prix futur, vous devez obtenir tous les facteurs qui affectent le prix en temps réel, puis donner à chaque facteur un poids correct, et enfin faire une analyse objective et rationnelle.
Résumé comme suit: environnement économique mondial, politiques macro nationales, politiques industrielles connexes, relations d'offre et de demande, événements internationaux, taux d'intérêt et taux de change, inflation et déflation, psychologie du marché et autres facteurs inconnus, etc. La prédiction est devenue une tâche énorme et impossible.
Comme le marché est imprévisible, 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. Nous avons seulement besoin d'analyser le prix pour faire une stratégie commerciale complète.
Réfléchissez-y d'abord, pourquoi le prix augmente-t-il?
Vous pourriez dire, parce que: le pays soutient des politiques industrielles pertinentes, le pays d'origine est une pluie torrentielle, la guerre commerciale internationale, la fourchette d'or MACD est acheté, d'autres l'ont acheté, etc. Bien sûr, ceux-ci peuvent ne pas être faux. Avec le recul, nous pouvons toujours trouver les raisons de la hausse des prix.
En fait, la hausse et la baisse des prix sont similaires à la marée montante. La hausse des prix est inséparable de la promotion des fonds. sur le marché, s'il y a plus d'acheteurs que de vendeurs, le prix augmentera. Inversement, s'il y a plus de vendeurs que d'acheteurs, le prix diminuera. Avec ce concept, nous pouvons donner des attentes raisonnables pour les tendances futures des prix basées sur la relation d'offre et de demande reflétée dans le flux net de fonds.
Contrairement à l'analyse traditionnelle, l'analyse des flux de fonds analyse quelles transactions sont l'afflux actif de fonds et quelles transactions sont l'afflux actif de fonds sur la base des données de transaction sur une période de temps. Ensuite, en soustrayant le volume d'afflux actif du volume d'afflux actif pendant cette période, nous pouvons connaître l'afflux net de fonds pendant cette période. Si l'afflux net de fonds est positif, cela signifie que l'offre de ce produit est insuffisante; si l'afflux net de fonds signifie que l'offre de ce produit est excédentaire.
Après avoir lu ceci, certaines personnes peuvent se demander que dans les transactions réelles, une transaction ne sera faite que lorsque quelqu'un achète et quelqu'un vend. L'ordre de transaction doit avoir autant de volume de vente qu'il y a de volume d'achat, et les fonds doivent être dans et hors du même montant. D'où proviennent l'afflux et la sortie de capital? En fait, strictement parlant, chaque ordre d'achat doit correspondre à un ordre de vente correspondant, et l'afflux et la sortie de capital doivent être égaux. Si nous voulons calculer quels ordres sont achetés activement et quels ordres sont vendus activement, nous ne pouvons utiliser qu'une méthode de compromis, en utilisant les données de la barre de la ligne K, basées sur le volume et le prix des transactions.
Le changement de flux de fonds correspond avec précision au comportement du marché en temps réel, et le flux net de fonds est calculé en temps réel en intégrant des données de barre de ligne k. Il existe deux algorithmes pour calculer le flux actif de fonds:
Premièrement, si le prix de transaction actuel de l'ordre en cours est exécuté au prix de la contrepartie ou à un prix supérieur, le prix de transaction d'achat >= le prix de transaction de vente, ce qui signifie que l'acheteur est plus disposé à effectuer l'opération à un prix plus élevé, qui est inclus dans l'afflux actif de fonds.
Deuxièmement, si le prix de transaction actuel est supérieur au prix de la dernière transaction, on peut comprendre que le volume de transaction actuel pousse activement à la hausse des prix, ce qui est inclus dans l'afflux actif de fonds.
Prenons le deuxième algorithme ci-dessus à titre d'exemple:
Le prix de clôture d'un certain produit à 10h00 est de 3450 et le prix de clôture à 11h00 est de 3455, nous allons donc inclure le volume de transaction entre 10h00 et 11h00 comme l'afflux de capital actif. Sinon, il est inclus dans le débit d'initiative de fonds. Cet article est basé sur la deuxième méthode, en ajoutant le facteur de volatilité des prix. En comparant le prix de clôture de la barre de k ligne avant et après, le volume de la volatilité de la barre de k ligne en hausse ou en baisse * est inclus dans une séquence, puis en fonction de la séquence Calculer le ratio d'afflux actif de fonds.
Cet article décrit le flux de fonds sur le marché à terme du point de vue du volume et établit un modèle de négociation pour juger des tendances des prix à court terme grâce à l'analyse en temps réel des données de la barre de ligne K. Dans des circonstances normales, le flux de capitaux et les tendances des prix peuvent être divisés en quatre conditions de base:
La hausse des prix et l'afflux net actif de fonds par unité de temps: cette situation est forte et le prix futur continuera probablement à augmenter;
Le cours des actions augmente et la sortie active nette de fonds par unité de temps: dans ce cas, il s'agit d'une position moyenne à forte, et le taux de futures hausses de prix sera considérablement réduit;
Le cours des actions chute, tandis que l'afflux net actif de fonds par unité de temps: c'est une situation faible, et le prix futur continue de chuter plus probablement;
Le cours des actions chute, et en même temps la sortie active nette de fonds par unité de temps: dans ce cas, il s'agit d'une position modérément faible, et le taux de baisse des prix futurs sera considérablement réduit;
Basse précédente (ll) Plus haut niveau précédent (hh) Achats actifs (en liquide) Ventes actives (barOut) Le ratio entre les entrées actives de fonds et les sorties actives de fonds (barRatio) Placement de la plaque de freinage Position de détention en cours (myAmount) Prix de clôture de la dernière ligne K (close)
Une bonne stratégie de trading quantitative exige non seulement des rendements stables, mais aussi la capacité de contrôler les risques et d'éviter de grosses pertes lorsqu'il y a une faible probabilité.
Ouverture de position longue: si aucune position d'attente actuelle n'existe et que barRatio > openValve, ouvrir la position longue;
Ouverture de position courte: si la position en attente actuelle et le barRatio < 1 / openValve n'existent pas, ouvrir la position courte;
Fermeture de position longue: si la position longue actuelle est maintenue et fermée < ll, vendre et fermer la position longue;
Fermeture de position courte: si la position courte actuelle est maintenue et fermée > hh, acheter et fermer la position courte;
Obtenir et calculer des données
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;
}
Obtenez les données de la barre de ligne K directement via leGetRecords
méthode dans l'API FMZ. Contient le prix le plus élevé, le prix le plus bas, le prix d'ouverture, le prix de clôture, le volume 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) est inclus dans l'achat actif; si le dernier prix de transaction est inférieur au dernier prix de transaction, alors le dernier volume * (prix le plus élevé-prix le plus bas) est inclus dans la vente active;
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;
}
Obtenez les données de position de base à travers leGetPosition
Si la position longue actuelle est maintenue, alors la quantité de position positive est retournée; si la position actuelle est courte, alors la quantité de position négative est retournée.
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
}
}
}
Peu de paramètres de base: le modèle a une idée de conception claire, avec seulement trois paramètres de base. Forte universalité: la stratégie est simple en logique et a une grande universalité. Elle peut s'adapter à la plupart des variétés sauf les produits agricoles et peut être combinée avec plusieurs variétés.
L'ajout de conditions de position de détention: le flux de fonds unidirectionnel (en bourse) sur le marché peut définir l'afflux ou la sortie de fonds en fonction de facteurs tels que les fluctuations de prix et le volume des transactions.
Ajout de la condition d'écart type: en se basant uniquement sur le flux de fonds comme condition d'ouverture d'une position, il peut y avoir de fréquents faux signaux, entraînant une ouverture et une fermeture fréquentes des positions. Filtrer les faux signaux en comptant la valeur moyenne de la sortie nette de fonds dans un délai spécifié et en additionnant l'écart type vers le haut et vers le bas.
/*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
}
}
}
Adresse stratégique:https://www.fmz.com/strategy/87698
Configuration de la stratégie:
Résultats des essais antérieurs:
Grâce à la modélisation, cet article utilise les données de la barre de ligne K des contrats à terme sur matières premières fournies par la plate-forme de trading FMZ pour établir un modèle de flux de capital net grâce à la collecte de données, à l'analyse connexe et à la technologie de prédiction.
Il convient de noter que le flux de fonds mentionné dans cet article fait référence au flux actif de fonds. Il fait référence à la force du vendeur et de l'acheteur sur le marché, et non à l'entrée ou à la sortie de fonds. Juger des prix futurs en analysant le comportement des acheteurs et des vendeurs sur le marché n'a pas de signification de référence à court terme.