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.
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.
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.
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.
Este artigo descreve o fluxo de fundos no mercado de futuros a partir da perspectiva de
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;
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)
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;
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 doGetRecords
mé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;
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 doGetPosition
Se 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.
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
}
}
}
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.
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.
/*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
Configuração da estratégia:
Desempenho do ensaio de retorno:
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.