avatar of 发明者量化-小小梦 发明者量化-小小梦
Seguir Mensajes Privados
4
Seguir
1271
Seguidores

Estrategia de equilibrio dinámico basada en moneda digital

Creado el: 2020-03-03 10:17:43, Actualizado el: 2023-10-09 22:49:27
comments   3
hits   3707

Estrategia de equilibrio dinámico basada en moneda digital

I. Resumen

El mentor de Warren Buffett, Benjamin Graham, mencionó una vez un modelo comercial de equilibrio dinámico entre acciones y bonos en su libro “El inversor inteligente”. Estrategia de equilibrio dinámico basada en moneda digital Este modelo comercial es muy simple:

  • Invierte el 50% de tu dinero en fondos de acciones y el 50% restante en fondos de bonos. Es decir, las acciones y los bonos representan cada uno la mitad.
  • Reequilibrar los activos a intervalos fijos o en función de los cambios del mercado para restablecer la relación entre activos de acciones y activos de bonos al valor inicial de 1:1. Ésta es toda la lógica de la estrategia, incluido cuándo comprar y vender, y cuánto comprar y vender. ¡Bastante simple!

2. Principio de equilibrio dinámico

En este método, la volatilidad de los fondos de bonos es en realidad muy pequeña, mucho menor que la volatilidad de las acciones, por lo que aquí se utilizan los bonos como un “ancla de referencia”, es decir, se utilizan bonos para medir si las acciones han subido demasiado. Es todavía muy poco.

Si el precio de las acciones aumenta, el valor de mercado de las acciones será mayor que el valor de mercado de los bonos. Cuando la relación entre el valor de mercado de los dos supere el umbral establecido, se reajustará la posición total, se venderán las acciones y se El bono se comprará para restaurar la relación entre el valor de mercado de las acciones y los bonos al original 1:1.

Por el contrario, si el precio de las acciones cae, el valor de mercado de las acciones será menor que el valor de mercado de los bonos. Cuando la relación entre el valor de mercado de los dos supere el umbral establecido, la posición total se reajustará para comprar acciones y vender bonos para restaurar la relación valor de mercado acciones-bonos al original 1:1. Estrategia de equilibrio dinámico basada en moneda digital

De esta manera, al equilibrar dinámicamente la relación entre acciones y bonos, es posible disfrutar de los frutos del crecimiento de las acciones y reducir la volatilidad de los activos. Como pionero de la inversión en valor, Graham nos brinda una buena idea. Dado que esta es una estrategia completa, ¿por qué no la aplicamos a las criptomonedas?

3. Lógica de la estrategia

Estrategia de equilibrio dinámico en el activo blockchain BTC

Lógica de estrategia

  • Según el valor actual de BTC, el saldo de la cuenta será de ¥5000 en efectivo y 0,1 BTC, es decir, la relación inicial de efectivo al valor de mercado de BTC es 1:1.
  • Si el precio de BTC sube a ¥6000, es decir, el valor de mercado de BTC es mayor que el saldo de la cuenta y la diferencia entre ellos excede el umbral establecido, entonces se venderán (6000-5000)/6000/2 monedas. Esto significa que BTC se ha apreciado y el dinero puede volver a cambiarse.
  • Si el precio de BTC cae a ¥4000, es decir, el valor de mercado de BTC es menor que el saldo de la cuenta y la diferencia entre ellos excede el umbral establecido, entonces compre (5000-4000)/4000/2 monedas. Esto significa que BTC se ha depreciado, así que recompra BTC.

De esta manera, no importa si BTC se aprecia o se deprecia, el saldo de la cuenta y el valor de mercado de BTC siempre se mantienen iguales. Si BTC se deprecia, compre algo, y cuando vuelva a subir, venda algo, como si fuera un saldo.

4. Marco estratégico

Entonces, ¿cómo implementarlo con código? Tomemos como ejemplo la plataforma de negociación cuantitativa Inventor. Primero, veamos el marco de estrategia:

// 撤单函数
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); // 休眠
    }
}

Todo el marco de la estrategia es en realidad muy simple, con una función principal, una función de orden onTick, una función CancelPendingOrders y los parámetros necesarios.

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
}

La lógica de las órdenes de compraventa es clara y todos los comentarios se han escrito en el código. Puede hacer clic en la imagen para ampliarla.

El proceso principal es el siguiente:

  • Obtener información de la cuenta.
  • Obtener datos de Tick.
  • Calcule el diferencial entre oferta y demanda en datos de ticks.
  • Calcule la diferencia entre el saldo de la cuenta y el valor de mercado de BTC.
  • Calcular las condiciones de compra y venta, el precio del pedido y la cantidad del pedido.
  • Realizar un pedido y devolver verdadero.

6. Módulo de cancelación 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秒
            }
        }
    }
}

El módulo de cancelación de pedidos es aún más sencillo, los pasos son los siguientes:

  • Espere 1 segundo antes de cancelar el pedido. Este es un problema en algunos exchanges, ¿sabe?
  • Continuar obteniendo la matriz de pedidos no completados. Si se devuelve una excepción, continuar obteniendo.
  • Si la matriz de pedidos no cumplidos está vacía, el estado de cancelación del pedido se devuelve inmediatamente.
  • Si hay pedidos sin cumplir, se recorre toda la matriz y se cancelan los pedidos uno por uno según el número de pedido.

7. Código fuente de la estrategia 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 Estrategia de equilibrio dinámico basada en moneda digital

8. Backtesting de estrategia

A continuación, probemos esta sencilla estrategia de equilibrio dinámico para ver si funciona. Lo que sigue es una prueba retrospectiva de los datos históricos de BTC, solo para su referencia.

Entorno de backtesting Estrategia de equilibrio dinámico basada en moneda digital

Rendimiento de las pruebas retrospectivas Estrategia de equilibrio dinámico basada en moneda digital

Curva de backtest Estrategia de equilibrio dinámico basada en moneda digital

Aquí hay otro gráfico de precios de BTC para el mismo período. Estrategia de equilibrio dinámico basada en moneda digital

Durante el período de backtest, BTC ha estado cayendo durante 8 meses, con una caída máxima que supera el 70%, lo que ha provocado que muchos inversores pierdan la confianza en los activos blockchain. La rentabilidad acumulada de esta estrategia es de hasta el 160% y la relación rentabilidad-riesgo anualizada supera el 5. Para una estrategia de inversión tan simple, este retorno de la inversión ha superado el de la gran mayoría de personas que apuestan todo.

9. Obtenga el código fuente de la estrategia

El código fuente de la estrategia se ha publicado en el sitio web oficial de Inventor Quantitative https://www.fmz.com/strategy/110545. No se requiere ninguna configuración para realizar pruebas retrospectivas en línea directas.

10. Conclusión

Esta estrategia de equilibrio dinámico tiene un solo parámetro central (umbral), que es un método de inversión muy simple que busca retornos estables en lugar de retornos excedentes. A diferencia de la estrategia de tendencia, la estrategia de equilibrio dinámico va contra la tendencia. La estrategia de equilibrio dinámico es exactamente lo opuesto. Cuando el mercado está en auge, se reducen las posiciones para enfriarlo, y cuando el mercado está tranquilo, se aumentan las posiciones y se permanece inactivo. Es algo similar a la regulación macroeconómica.

De hecho, la estrategia de equilibrio dinámico es una habilidad que se adhiere al concepto de que los precios son impredecibles mientras captura las fluctuaciones de precios. La clave de la estrategia de equilibrio dinámico es establecer y ajustar el ratio de asignación de activos y el umbral de activación. Por cuestiones de espacio, es imposible que un artículo lo cubra todo. Hay que saber que más allá de las palabras, está el corazón. Lo más importante de la estrategia de equilibrio dinámico es la idea de inversión. Incluso puedes reemplazar el único activo BTC de este artículo con una canasta de activos de blockchain.

Finalmente, terminemos este artículo con una famosa cita de Benjamin Graham en su libro El inversor inteligente:El mercado de valores no es una “máquina de pesar” que pueda medir el valor con precisión. Es, en cambio, una “máquina de votar”. Las decisiones que toman innumerables personas son una mezcla de racionalidad y emoción. Muchas veces, estas elecciones están lejos de ser juicio de valor racional. El secreto para invertir es invertir cuando los precios están muy por debajo del valor intrínseco y creer que la tendencia del mercado se recuperará. —Benjamin Graham, El inversor inteligente