En el largo plazo, la probabilidad de aumento y caída del precio debe ser del 50%, por lo que para predecir correctamente el precio futuro, es necesario obtener todos los factores que afectan el precio en tiempo real, y luego dar a cada factor un peso correcto, y finalmente hacer un análisis objetivo y racional.
Resumido como: entorno económico global, políticas macroeconómicas nacionales, políticas industriales relacionadas, relaciones de oferta y demanda, eventos internacionales, tasas de interés y tipos de cambio, inflación y deflación, psicología del mercado y otros factores desconocidos, etc. La predicción se ha convertido en una tarea enorme e imposible. Así que desde el principio, entendí que el mercado es impredecible. Entonces todas las predicciones en el mercado se han convertido en hipótesis, y el comercio se ha convertido en un juego de probabilidades, lo cual es interesante.
Como el mercado es impredecible, ¿es realmente indiferente? No, todos los factores macro y micro se han reflejado en el precio, lo que significa que el precio es el resultado de la interacción de todos los factores. Solo necesitamos analizar el precio para hacer una estrategia comercial completa.
Piense en ello primero, ¿por qué el precio aumenta?
Se podría decir, porque: el país apoya políticas industriales relevantes, el país de origen es lluvia torrencial, la guerra comercial internacional, el tenedor de oro MACD se compra, otros lo han comprado, etc. Por supuesto, estos pueden no estar equivocados.
De hecho, el aumento y la caída de los precios son similares a las mareas crecientes. El aumento de los precios es inseparable de la promoción de fondos. en el mercado, si hay más compradores que vendedores, el precio aumentará. Por el contrario, si hay más vendedores que compradores, el precio caerá. Con este concepto, podemos dar expectativas razonables para las tendencias futuras de los precios basadas en la relación de oferta y demanda reflejada en el flujo neto de fondos.
A diferencia del análisis tradicional, el análisis del flujo de fondos analiza qué transacciones son la entrada activa de fondos y qué transacciones son la salida activa de fondos basándose en los datos de transacción durante un período de tiempo. Luego, restando el volumen de salida activa del volumen de entrada activa durante este período, podemos conocer la entrada neta de fondos durante este período. Si la entrada neta de fondos es positiva, significa que la oferta de este producto es escasa; si la salida neta de fondos significa que la oferta de este producto es excesiva.
Después de leer esto, algunas personas pueden preguntarse que en las transacciones reales, un trato solo se hará cuando alguien compra y alguien vende. La orden de transacción debe tener tanto volumen de venta como el volumen de compra, y los fondos deben entrar y salir de la misma cantidad. ¿De dónde proviene la entrada y salida de capital? De hecho, estrictamente hablando, cada orden de compra debe corresponder a una orden de venta correspondiente, y la entrada y salida de capital deben ser iguales. Si queremos calcular qué órdenes se compran activamente y qué órdenes se venden activamente, solo podemos usar un método de compromiso, utilizando datos de barra de línea K, basados en el volumen y el precio de la transacción.
El cambio en el flujo de fondos corresponde con precisión al comportamiento del mercado en tiempo real, y el flujo neto de fondos se calcula en tiempo real mediante la integración de datos de barra de línea k. Hay dos algoritmos para calcular el flujo activo de fondos:
En primer lugar, si el precio de transacción actual de la orden actual se ejecuta al precio de la contraparte o a un precio superior, el precio de la transacción de compra >= el precio de la transacción de venta, lo que significa que el comprador está más dispuesto a completar la transacción a un precio más alto, que está incluido en la entrada activa de fondos.
En segundo lugar, si el precio de transacción actual > el precio de la última transacción, entonces se puede entender que el volumen de transacción actual empuja activamente al alza el aumento de precios, que se incluye en la entrada activa de fondos.
Tomemos el segundo algoritmo anterior como ejemplo:
El precio de cierre de un determinado producto a las 10:00 es 3450, y el precio de cierre a las 11:00 es 3455, por lo que incluiremos el volumen de transacciones entre las 10:00 y las 11:00 como el flujo activo de capital. De lo contrario, se incluye en el flujo de salida de fondos de iniciativa. Este artículo se basa en el segundo método, agregando el factor de volatilidad de precios. Al comparar el precio de cierre de la barra de la línea k antes y después, el volumen de la volatilidad de la barra de la línea k ascendente o descendente * se incluye en una secuencia, y luego de acuerdo con la secuencia.
Este artículo describe el flujo de fondos en el mercado de futuros desde la perspectiva del
El aumento de los precios y la entrada activa neta de fondos por unidad de tiempo: esta situación es fuerte y es más probable que el precio futuro continúe subiendo;
El precio de las acciones sube, y la salida activa neta de fondos por unidad de tiempo: en este caso, se trata de una posición mediana-fuerte, y la tasa de futuros aumentos de precios se reducirá en gran medida;
El precio de las acciones cae, mientras que el flujo neto activo de fondos por unidad de tiempo: esta es una situación débil, y el precio futuro sigue cayendo más probable;
El precio de las acciones cae, y al mismo tiempo la salida activa neta de fondos por unidad de tiempo: en este caso, se trata de una posición moderadamente débil, y la tasa de futuras caídas de precios se reducirá en gran medida;
Bajo anterior (ll) Máximo anterior (hh) Compras activas (en bruto) Ventas activas (barOut) Relación entre la entrada activa de fondos y la salida activa de fondos (barRatio) Peso de la posición de apertura (valvula abierta) Posición de retención actual (myAmount) Precio de cierre de la última línea K (cerrado)
Una buena estrategia de negociación cuantitativa requiere no solo rendimientos estables, sino también la capacidad de controlar los riesgos y evitar grandes pérdidas cuando hay una pequeña probabilidad.
Apertura de posición larga: si no hay posición de espera actual y barRatio > openValve, abrir la posición larga;
Apertura de posición corta: si no hay posición de retención actual y barRatio < 1 / openValve, abrir la posición corta;
Cierre de posición larga: si se mantiene y cierra la posición larga actual < ll, se vende y se cierra la posición larga;
Cierre de posición corta: si se mantiene y cierra la posición corta actual > hh, se compra y se cierra la posición corta;
Obtención y cálculo de datos
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;
}
Obtener datos de la barra de línea K directamente a través de laGetRecords
método en la API FMZ. Contiene el precio más alto, el precio más bajo, el precio de apertura, el precio de cierre, el volumen y la marca de tiempo estándar. Si el precio de la última transacción es mayor que el precio de la última transacción, entonces el volumen de transacción más reciente * (precio más alto-precio más bajo) se incluye en la compra activa; si el precio de la última transacción es menor que el precio de la última transacción, entonces el volumen más reciente * (precio más alto-precio más bajo) se incluye en la venta activa;
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;
}
Obtener los datos de posición básicos a través de laGetPosition
Si se mantiene la posición larga actual, se devuelve la cantidad de posición positiva; si la posición actual es corta, se devuelve la cantidad de posición negativa.
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
}
}
}
Pocos parámetros básicos: El modelo tiene una idea de diseño clara, con solo tres parámetros básicos. Una gran universalidad: la estrategia es sencilla en lógica y tiene una alta universalidad. Puede adaptarse a la mayoría de las variedades, excepto a los productos agrícolas, y puede combinarse con varias variedades.
Añadir condiciones de posición de tenencia: el flujo unidireccional (de acciones) del mercado de fondos puede definir la entrada o salida de fondos en función de factores como las fluctuaciones de precios y el volumen de operaciones. Sin embargo, debido a que la estrategia no incluye la condición de posición de tenencia, el flujo de capital activo estadístico puede distorsionarse.
Añadir la condición de desviación estándar: basándose únicamente en el flujo de fondos como condición para abrir una posición, puede haber frecuentes señales falsas, lo que resulta en una apertura y cierre frecuentes de posiciones.
/*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
}
}
}
Dirección estratégica:https://www.fmz.com/strategy/87698
Configuración de la estrategia:
Rendimiento de las pruebas de retroceso:
A través del modelado, este artículo utiliza los datos de barra de línea K de futuros de materias primas proporcionados por la plataforma de negociación FMZ para establecer un modelo de flujo de capital neto a través de la recopilación de datos, el análisis relacionado y la tecnología de predicción.
Debe tenerse en cuenta que el flujo de fondos al que se refiere este artículo se refiere al flujo activo de fondos. Se refiere a la fuerza del vendedor y el comprador en el mercado, no a la entrada o salida de fondos.