avatar of 发明者量化-小小梦 发明者量化-小小梦
focar em Mensagem privada
4
focar em
1271
Seguidores

Estratégia de equilíbrio dinâmico baseada em moeda digital

Criado em: 2020-03-03 10:17:43, atualizado em: 2023-10-09 22:49:27
comments   3
hits   3707

Estratégia de equilíbrio dinâmico baseada em moeda digital

I. Resumo

O mentor de Warren Buffett, Benjamin Graham, mencionou certa vez um modelo de negociação de equilíbrio dinâmico entre ações e títulos em seu livro “O Investidor Inteligente”. Estratégia de equilíbrio dinâmico baseada em moeda digital Este modelo de negociação é muito simples:

  • Invista 50% do seu dinheiro em fundos de ações e os 50% restantes em fundos de títulos. Ou seja, ações e títulos representam metade cada.
  • Rebalanceie os ativos em intervalos fixos ou com base em mudanças de mercado para restaurar a proporção de ativos de ações em relação aos ativos de títulos para o nível inicial de 1:1. Essa é toda a lógica da estratégia, incluindo quando comprar e vender, e quanto comprar e vender. Simples o suficiente!

2. Princípio do equilíbrio dinâmico

Neste método, a volatilidade dos fundos de títulos é na verdade muito pequena, muito menor do que a volatilidade das ações, então os títulos são usados ​​como uma “âncora de referência” aqui, ou seja, usando títulos para medir se as ações subiram muito. Ainda é aumento muito pequeno.

Se o preço das ações subir, o valor de mercado das ações será maior que o valor de mercado do título. Quando a relação de valor de mercado dos dois exceder o limite definido, a posição total será reajustada, as ações serão vendidas e o título será comprado para fazer com que a relação entre o valor de mercado das ações e o título seja restaurada ao valor original de 1:1.

Pelo contrário, se o preço das ações cair, o valor de mercado das ações será menor que o valor de mercado do título. Quando a relação de valor de mercado dos dois exceder o limite definido, a posição total será reajustada para comprar ações e vender títulos para fazer com que a relação entre o valor de mercado de ações e títulos seja restaurada ao valor original de 1:1. Estratégia de equilíbrio dinâmico baseada em moeda digital

Dessa forma, ao equilibrar dinamicamente a relação entre ações e títulos, é possível aproveitar os frutos do crescimento das ações e reduzir a volatilidade dos ativos. Como pioneiro do investimento em valor, Graham nos dá uma boa ideia. Já que esta é uma estratégia completa, por que não a aplicamos às criptomoedas?

3. Lógica de Estratégia

Estratégia de equilíbrio dinâmico em ativos de blockchain BTC

Estratégia Lógica

  • De acordo com o valor atual do BTC, o saldo da conta será de ¥ 5.000 em dinheiro e 0,1 BTC, ou seja, a proporção inicial de dinheiro para o valor de mercado do BTC é de 1:1.
  • Se o preço do BTC subir para ¥ 6.000, ou seja, o valor de mercado do BTC for maior que o saldo da conta e a diferença entre eles exceder o limite definido, então (6.000-5.000)/6.000/2 moedas serão vendidas. Isso significa que o BTC se valorizou e o dinheiro pode ser trocado de volta.
  • Se o preço do BTC cair para ¥4000, ou seja, o valor de mercado do BTC for menor que o saldo da conta e a diferença entre eles exceder o limite definido, compre (5000-4000)/4000/2 moedas. Isso significa que o BTC se desvalorizou, então compre BTC de volta.

Dessa forma, não importa se o BTC se valoriza ou se desvaloriza, o saldo da conta e o valor de mercado do BTC são sempre mantidos iguais. Se o BTC se desvalorizar, compre uma parte e, quando ele subir novamente, venda uma parte, como um saldo.

4. Estrutura estratégica

Então, como implementar isso com código? Vamos pegar a Inventor Quantitative Trading Platform como exemplo. Primeiro, vamos dar uma olhada na estrutura da estratégia:

// 撤单函数
function CancelPendingOrders() {}

// 下单函数
function onTick() {}

// 主函数
function main() {
    // 过滤非重要信息
    SetErrorFilter("GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout");
    while (true) { // 轮询模式
        if (onTick()) { // 执行 onTick 函数
            CancelPendingOrders(); // 取消未成交的挂单
            Log(_C(exchange.GetAccount)); // 打印当前账户信息
        }
        Sleep(LoopInterval * 1000); // 休眠
    }
}

Toda a estrutura da estratégia é, na verdade, muito simples, com uma função principal, uma função de ordem onTick, uma função CancelPendingOrders e parâmetros necessários.

5. Módulo de pedidos

// 下单函数
function onTick() {
    var acc = _C(exchange.GetAccount); // 获取账户信息
    var ticker = _C(exchange.GetTicker); // 获取 Tick 数据
    var spread = ticker.Sell - ticker.Buy; // 获取 Tick 数据的买卖价差
    // 账户余额与当前持仓价值的差值的 0.5倍
    var diffAsset = (acc.Balance - (acc.Stocks * ticker.Sell)) / 2;
    var ratio = diffAsset / acc.Balance; // diffAsset / 账户余额
    LogStatus('ratio:', ratio, _D()); // 打印 ratio和当前时间
    if (Math.abs(ratio) < threshold) { // 如果 ratio的绝对值小于指定阈值
        return false; // 返回 false
    }
    if (ratio > 0) { // 如果 ratio大于 0
        var buyPrice = _N(ticker.Sell + spread, ZPrecision); // 计算下单价格
        var buyAmount = _N(diffAsset / buyPrice, XPrecision); // 计算下单量
        if (buyAmount < MinStock) { // 如果下单量小于最小交易量
            return false; // 返回 false
        }
        exchange.Buy(buyPrice, buyAmount, diffAsset, ratio); // 买入下单
    } else {
        var sellPrice = _N(ticker.Buy - spread, ZPrecision); // 计算下单价格
        var sellAmount = _N(-diffAsset / sellPrice, XPrecision); // 计算下单量
        if (sellAmount < MinStock) { // 如果下单量小于最小交易量
            return false; // 返回 false
        }
        exchange.Sell(sellPrice, sellAmount, diffAsset, ratio); // 卖出下单
    }
    return true; // 返回 true
}

A lógica de negociação de ordens é clara e todos os comentários foram escritos no código. Você pode clicar na imagem para ampliá-la.

O processo principal é o seguinte:

  • Obtenha informações da conta.
  • Obter dados do Tick.
  • Calcule o spread de compra e venda em dados de ticks.
  • Calcule a diferença entre o saldo da conta e o valor de mercado do BTC.
  • Calcule as condições de compra e venda, o preço do pedido e a quantidade do pedido.
  • Faça um pedido e retorne verdadeiro.

6. Módulo de cancelamento de pedidos

// 撤单函数
function CancelPendingOrders() {
    Sleep(1000); // 休眠 1秒
    var ret = false;
    while (true) {
        var orders = null;
        // 持续获取未成交订单数组,如果返回异常,则继续获取
        while (!(orders = exchange.GetOrders())) {
            Sleep(1000); // 休眠 1秒
        }
        if (orders.length == 0) { // 如果订单数组为空
            return ret; // 返回撤单状态
        }
        for (var j = 0; j < orders.length; j++) { // 遍历未成交订单数组
            exchange.CancelOrder(orders[j].Id); // 依次取消未成交订单
            ret = true;
            if (j < (orders.length - 1)) {
                Sleep(1000); // 休眠 1秒
            }
        }
    }
}

O módulo de cancelamento de pedidos é ainda mais simples, os passos são os seguintes:

  • Aguarde 1 segundo antes de cancelar o pedido. Isso é um problema em algumas exchanges, sabia?
  • Continue a obter o array de pedidos não atendidos. Se uma exceção for retornada, continue a obter.
  • Se a matriz de pedidos não atendidos estiver vazia, o status de cancelamento do pedido será retornado imediatamente.
  • Se houver pedidos não atendidos, todo o conjunto é percorrido e os pedidos são cancelados um por um, de acordo com o número do pedido.

7. Código fonte da estratégia completa

// 回测环境
/*backtest
start: 2018-01-01 00:00:00
end: 2018-08-01 11:00:00
period: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/



// 撤单函数
function CancelPendingOrders() {
    Sleep(1000); // 休眠 1秒
    var ret = false;
    while (true) {
        var orders = null;
        // 持续获取未成交订单数组,如果返回异常,则继续获取
        while (!(orders = exchange.GetOrders())) {
            Sleep(1000); // 休眠 1秒
        }
        if (orders.length == 0) { // 如果订单数组为空
            return ret; // 返回撤单状态
        }
        for (var j = 0; j < orders.length; j++) { // 遍历未成交订单数组
            exchange.CancelOrder(orders[j].Id); // 依次取消未成交订单
            ret = true;
            if (j < (orders.length - 1)) {
                Sleep(1000); // 休眠 1秒
            }
        }
    }
}

// 下单函数
function onTick() {
    var acc = _C(exchange.GetAccount); // 获取账户信息
    var ticker = _C(exchange.GetTicker); // 获取 Tick 数据
    var spread = ticker.Sell - ticker.Buy; // 获取 Tick 数据的买卖价差
    // 账户余额与当前持仓价值的差值的 0.5倍
    var diffAsset = (acc.Balance - (acc.Stocks * ticker.Sell)) / 2;
    var ratio = diffAsset / acc.Balance; // diffAsset / 账户余额
    LogStatus('ratio:', ratio, _D()); // 打印 ratio和当前时间
    if (Math.abs(ratio) < threshold) { // 如果 ratio的绝对值小于指定阈值
        return false; // 返回 false
    }
    if (ratio > 0) { // 如果 ratio大于 0
        var buyPrice = _N(ticker.Sell + spread, ZPrecision); // 计算下单价格
        var buyAmount = _N(diffAsset / buyPrice, XPrecision); // 计算下单量
        if (buyAmount < MinStock) { // 如果下单量小于最小交易量
            return false; // 返回 false
        }
        exchange.Buy(buyPrice, buyAmount, diffAsset, ratio); // 买入下单
    } else {
        var sellPrice = _N(ticker.Buy - spread, ZPrecision); // 计算下单价格
        var sellAmount = _N(-diffAsset / sellPrice, XPrecision); // 计算下单量
        if (sellAmount < MinStock) { // 如果下单量小于最小交易量
            return false; // 返回 false
        }
        exchange.Sell(sellPrice, sellAmount, diffAsset, ratio); // 卖出下单
    }
    return true; // 返回 true
}

// 主函数
function main() {
    // 过滤非重要信息
    SetErrorFilter("GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout");
    while (true) { // 轮询模式
        if (onTick()) { // 执行 onTick 函数
            CancelPendingOrders(); // 取消未成交的挂单
            Log(_C(exchange.GetAccount)); // 打印当前账户信息
        }
        Sleep(LoopInterval * 1000); // 休眠
    }
}

Parâmetros externos Estratégia de equilíbrio dinâmico baseada em moeda digital

8. Backtesting de estratégia

Em seguida, vamos testar essa estratégia simples de equilíbrio dinâmico para ver se funciona. O que se segue é um backtest dos dados históricos do BTC, apenas para sua referência.

Ambiente de Backtesting Estratégia de equilíbrio dinâmico baseada em moeda digital

Desempenho do Backtest Estratégia de equilíbrio dinâmico baseada em moeda digital

Curva de backtest Estratégia de equilíbrio dinâmico baseada em moeda digital

Aqui está outro gráfico de preços do BTC para o mesmo período Estratégia de equilíbrio dinâmico baseada em moeda digital

Durante o período de backtest, o BTC caiu por até 8 meses, com a queda máxima ultrapassando 70%, o que fez com que muitos investidores perdessem a confiança nos ativos de blockchain. O retorno acumulado dessa estratégia é de até 160%, e a relação retorno-risco anualizada excede 5. Para uma estratégia de investimento tão simples, esse retorno sobre o investimento excedeu o da grande maioria das pessoas que vão all-in.

9. Obtenha o código fonte da estratégia

O código-fonte da estratégia foi tornado público no site oficial do Inventor Quantitative https://www.fmz.com/strategy/110545. Nenhuma configuração é necessária para backtesting online direto.

10. Conclusão

Essa estratégia de equilíbrio dinâmico tem apenas um parâmetro principal (limite), que é um método de investimento muito simples que busca retornos estáveis ​​em vez de retornos excessivos. Em contraste com a estratégia de tendência, a estratégia de equilíbrio dinâmico vai contra a tendência. A estratégia de equilíbrio dinâmico é exatamente o oposto. Quando o mercado está aquecido, você reduz posições para esfriar, e quando o mercado está calmo, você aumenta posições e fica dormente. É um pouco semelhante à regulamentação macroeconômica.

Na verdade, a estratégia de equilíbrio dinâmico é uma habilidade que segue o conceito de que os preços são imprevisíveis ao capturar flutuações de preços. A chave para a estratégia de equilíbrio dinâmico é definir e ajustar a taxa de alocação de ativos e o limite de gatilho. Devido a restrições de espaço, é impossível que um artigo cubra tudo. Você tem que saber que além das palavras, está o coração. O mais importante sobre a estratégia de equilíbrio dinâmico é a ideia de investimento. Você pode até substituir o ativo BTC único neste artigo por uma cesta de ativos de blockchain.

Por fim, vamos encerrar este artigo com uma citação famosa de Benjamin Graham em seu livro The Intelligent Investor:O mercado de ações não é uma “máquina de pesar” que pode medir valor com precisão. Em vez disso, é uma “máquina de votação”. As decisões tomadas por inúmeras pessoas são uma mistura de racionalidade e emoção. Muitas vezes, essas escolhas são Está longe de ser julgamento de valor racional. O segredo para investir é investir quando os preços estão muito abaixo do valor intrínseco e acreditar que a tendência do mercado irá se recuperar. ——Benjamin Graham, O Investidor Inteligente