Estrategia de negociación basada en el flujo activo de fondos

El autor:La bondad, Creado: 2020-08-01 09:50:44, Actualizado: 2023-10-11 19:56:26

img

Resumen de las actividades

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.

Por qué utilizar el flujo de capital

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.

Principio de flujo 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.

Método de cálculo del flujo de fondos

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.

Lógica de negociación

Este artículo describe el flujo de fondos en el mercado de futuros desde la perspectiva del volumen, y establece un modelo de negociación para juzgar las tendencias de precios a corto plazo a través del análisis en tiempo real de los datos de la barra de línea K. En circunstancias normales, el flujo de capital y las tendencias de precios se pueden dividir en cuatro condiciones básicas:

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;

Las principales variables son las siguientes:

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)

Condiciones de entrada y salida

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;

Escribir el código fuente de la estrategia

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 laGetRecordsmé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;

Obtener datos de posición

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 laGetPositionSi 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.

Posicionamiento de órdenes

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
        }
    }
}

Características estratégicas

  • Características:

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.

  • Mejoras:

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.

Código fuente de la estrategia completa:

/*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

Prueba posterior de la estrategia

Configuración de la estrategia:

img

Rendimiento de las pruebas de retroceso:

img

En resumen

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.


Relacionados

Más.