Estratégia de negociação baseada no fluxo activo de fundos

Autora:Bem-estar, Criado: 2020-08-01 09:50:44, Atualizado: 2023-10-11 19:56:26

img

Resumo

O preço é ou para cima ou para baixo. A longo prazo, a probabilidade de aumento e queda do preço deve ser de 50%, então para prever corretamente o preço futuro, você precisa obter todos os fatores que afetam o preço em tempo real, e depois dar a cada fator um peso correto, e finalmente fazer análise objetiva e racional. Para listar todos os fatores que afetam o preço, pode encher todo o universo.

Resumido como: ambiente econômico global, políticas macroeconômicas nacionais, políticas industriais relacionadas, relações de oferta e demanda, eventos internacionais, taxas de juros e taxas de câmbio, inflação e deflação, psicologia do mercado e outros fatores desconhecidos, etc. A previsão tornou-se uma tarefa enorme e impossível.

Por que utilizar o fluxo de capital

Como o mercado é imprevisível, ele é realmente indiferente? Não, todos os fatores macro e micro foram refletidos no preço, o que significa que o preço é o resultado da interação de todos os fatores.

Pensa primeiro, porque é que o preço aumenta?

Pode-se dizer, porque: o país apoia políticas industriais relevantes, o país de origem é chuva torrencial, a guerra comercial internacional, o MACD golden fork é comprado, outros o compraram, etc. Claro, estes podem não estar errados.

Na verdade, a subida e queda dos preços são semelhantes às marés crescentes. O aumento de preços é inseparável da promoção de fundos. no mercado, se houver mais compradores do que vendedores, o preço aumentará. Por outro lado, se houver mais vendedores do que compradores, o preço cairá. Com este conceito, podemos dar expectativas razoáveis para as tendências de preços futuras com base na relação de oferta e demanda refletida no fluxo líquido de fundos.

Princípio dos fluxos de fundos

Diferente da análise tradicional, a análise de fluxo de fundos analisa quais transações são o fluxo ativo de fundos e quais transações são o fluxo ativo de fundos com base nos dados de transação durante um período de tempo. Em seguida, subtraindo o volume de saída ativa do volume de entrada ativa durante esse período, podemos saber o fluxo líquido de fundos durante esse período. Se o fluxo líquido de fundos for positivo, isso significa que a oferta desse produto é escassa; se o fluxo líquido de fundos significa que a oferta deste produto é excessiva.

Depois de ler isso, algumas pessoas podem se perguntar que em transações reais, um negócio só será feito quando alguém compra e alguém vende. A ordem de transação deve ter tanto volume de venda quanto há volume de compra, e os fundos devem estar dentro e fora da mesma quantidade. De onde vem o fluxo de entrada e saída de capital? De fato, falando estritamente, cada ordem de compra deve corresponder a uma ordem de venda correspondente, e o fluxo de entrada e saída de capital deve ser igual. Se quisermos calcular quais ordens são ativamente compradas e quais ordens são ativamente vendidas, só podemos usar um método de compromisso, usando dados de barra de linha K, com base no volume e no preço da transação.

Método de cálculo dos fluxos de fundos

A mudança no fluxo de fundos corresponde com precisão ao comportamento do mercado em tempo real, e o fluxo líquido de fundos é calculado em tempo real integrando dados de barra de linha k. Existem dois algoritmos para calcular o fluxo ativo de fundos:

Em primeiro lugar, se o preço de transação corrente da ordem corrente for executado ao preço da contraparte ou a um preço superior, o preço da transação de compra >= o preço da transação de venda, o que significa que o comprador está mais disposto a concluir a transação a um preço mais elevado, que está incluído no fluxo ativo de fundos.

Em segundo lugar, se o preço da transacção corrente for superior ao preço da última transacção, pode-se entender que o volume da transacção corrente impulsiona ativamente o aumento do preço, que é incluído na entrada activa de fundos.

Tome o segundo algoritmo acima como exemplo:

O preço de fechamento de um determinado produto às 10:00 é 3450, e o preço de fechamento às 11:00 é 3455, então incluiremos o volume de transações entre 10:00 e 11:00 como o fluxo ativo de capital. Caso contrário, ele é incluído na saída de iniciativa de fundos. Este artigo é baseado no segundo método, adicionando o fator de volatilidade de preços. Comparando o preço de fechamento da barra da linha k antes e depois, o volume da volatilidade da barra da linha k crescente ou decrescente * é incluído em uma sequência e, em seguida, de acordo com a sequência Calcule a taxa de fluxo ativo de fundos.

Lógica comercial

Este artigo descreve o fluxo de fundos no mercado de futuros a partir da perspectiva de volume, e estabelece um modelo de negociação para julgar as tendências de preços de curto prazo através da análise em tempo real de dados de barra de linha K. Em circunstâncias normais, o fluxo de capital e as tendências de preços podem ser divididos em quatro condições básicas:

O aumento dos preços e o fluxo líquido ativo de fundos por unidade de tempo: esta situação é forte e é mais provável que o preço futuro continue a subir;

O preço das acções sobe e a saída activa líquida de fundos por unidade de tempo: Neste caso, trata-se de uma posição média-forte, e a taxa de futuros aumentos de preços será muito reduzida;

O preço das ações cai, enquanto o fluxo líquido ativo de fundos por unidade de tempo: esta é uma situação fraca, e o preço futuro continua a cair mais provável;

O preço das acções cai e, ao mesmo tempo, a saída activa líquida de fundos por unidade de tempo: neste caso, trata-se de uma posição moderadamente fraca e a taxa de queda futura dos preços será muito reduzida;

As principais variáveis são as seguintes:

Baixo anterior (ll) Altíssimo anterior (hh) Aquisição activa (barIn) Vendas activas (barOut) Relação entre a entrada activa de fundos e a saída activa de fundos (barRatio) Limite de posição de abertura (OpenValve) Posição de detenção corrente (myAmount) Preço de encerramento da última linha K (fechado)

Condições de entrada e saída

Uma boa estratégia quantitativa de negociação requer não só retornos estáveis, mas também a capacidade de controlar riscos e evitar grandes perdas quando há uma pequena probabilidade.

  • Abertura de posição longa: se não houver posição de espera corrente e barRatio > openValve, abrir a posição longa;

  • Abertura de posição curta: se não houver posição de retenção corrente e barRatio < 1 / openValve, abrir a posição curta;

  • Fechamento de posição longa: se a posição longa atual for mantida e fechada < ll, vender e fechar a posição longa;

  • Fechamento de posição curta: se a posição curta atual for mantida e fechada > hh, comprar e fechar a posição curta;

Escrever o código fonte da estratégia

Obter e calcular dados

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

Obter dados da barra de linha K diretamente através doGetRecordsmétodo na API FMZ. Contém o preço mais alto, o preço mais baixo, o preço de abertura, o preço de fechamento, o volume e o carimbo horário padrão. Se o preço da transação mais recente for maior que o preço da última transação, então o volume da transação mais recente * (preço mais alto-preço mais baixo) é incluído na compra ativa; se o preço da transação mais recente for menor que o preço da última transação, então o volume mais recente * (preço mais alto-preço mais baixo) é incluído na venda ativa;

Obter dados de posição

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

Obter os dados de posição básicos através doGetPositionSe a posição longa atual for mantida, então a quantidade de posição positiva é devolvida; se a posição atual for curta, então a quantidade de posição negativa é devolvida.

Colocação de ordens

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:

Poucos parâmetros centrais: o modelo tem uma ideia de design clara, com apenas três parâmetros centrais. Forte universalidade: a estratégia é simples em termos lógicos e possui uma elevada universalidade. Pode adaptar-se à maioria das variedades, exceto produtos agrícolas, e pode ser combinada com várias variedades.

  • Melhorias:

Adicionar condições de posição de detenção: o fluxo de fundos de mercado unidirecional (de ações) pode definir a entrada ou saída de fundos com base em fatores como flutuações de preços e volume de negociação.

Adicionar a condição de desvio padrão: contando apenas com o fluxo de fundos como condição para abrir uma posição, pode haver sinais falsos frequentes, resultando em abertura e fechamento frequentes de posições. Filtre os sinais falsos contando o valor médio da saída líquida de fundos dentro de um tempo especificado e adicionando o desvio padrão para cima e para baixo.

Código fonte da estratégia 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
        }
    }
}

Endereço estratégico:https://www.fmz.com/strategy/87698

Backtest da estratégia

Configuração da estratégia:

img

Desempenho do ensaio de retorno:

img

Resumindo

Por meio de modelagem, este artigo usa os dados de barra de linha K de futuros de commodities fornecidos pela plataforma de negociação FMZ para estabelecer um modelo de fluxo de capital líquido através da coleta de dados, análise relacionada e tecnologia de previsão.

Deve-se notar que o fluxo de fundos referido neste artigo refere-se ao fluxo ativo de fundos. Ele se refere à força do vendedor e do comprador no mercado, não à entrada ou saída de fundos. Julgar os preços futuros analisando o comportamento de compradores e vendedores no mercado não tem significado de referência a curto prazo.


Relacionados

Mais.