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

Uso de IA para aprender a revertir el diseño de estrategias: una nueva forma de mejorar las habilidades de trading cuantitativo

Creado el: 2025-04-27 10:14:30, Actualizado el: 2025-04-27 13:34:44
comments   2
hits   933

[TOC]

Uso de IA para aprender a revertir el diseño de estrategias: una nueva forma de mejorar las habilidades de trading cuantitativo

Con el rápido desarrollo de la tecnología de inteligencia artificial (IA), esta ha demostrado una eficiencia y creatividad extremadamente altas en muchos campos. Como campo altamente técnico, el comercio cuantitativo naturalmente también está explorando activamente la aplicación de la IA. Sin embargo, en la práctica, descubriremos que aún existen grandes desafíos a la hora de confiar únicamente en la IA para generar directamente estrategias comerciales completas, estables y sosteniblemente rentables.

Especialmente para los nuevos usuarios de la plataforma, debido a sus débiles habilidades de programación, es difícil implementar sus ideas comerciales en códigos de estrategia. Aunque actualmente podemos contarle nuestras ideas a la IA y dejar que genere estrategias. Sin embargo, el efecto de implementación no cumplió con las expectativas. A menudo me encuentro con usuarios que vienen a hacer preguntas con códigos generados por IA y, a veces, puedo ver las estrategias generadas por IA de un vistazo. Debido a que todavía existen muchos problemas con los códigos de estrategia generados por la IA en esta etapa, usar la IA de esta manera no solo no resuelve ningún problema, sino que también genera más confusión y problemas a los novatos. Cuanto más aprendía, más confundido estaba y al final “desistí de empezar”.

Personalmente creo que hay dos razones principales para los problemas actuales con las estrategias de salida directa de la IA:

  • La lógica, la precisión y la claridad del proceso de descripción de los requisitos estratégicos de cada persona varían enormemente, y la comprensión de estos lenguajes naturales por parte del modelo de IA estará sesgada.
  • El gran modelo de IA tiene una comprensión limitada de las funciones de la plataforma, las API, etc., porque el modelo general no está entrenado con la información de la plataforma y la precisión de la información generada es limitada.

Entonces, ¿existen otros métodos de aplicación más eficientes? Este artículo quiere compartir una nueva forma de pensar: dejar que la IA nos ayude a aprender estrategias existentes, comprender el diseño de estrategias, extraer detalles y técnicas clave y analizar más a fondo su eficacia y su margen de mejora. Este método no sólo puede ayudarnos a comprender la esencia del diseño de la estrategia más rápidamente, sino también a mejorar sistemáticamente nuestro nivel de trading cuantitativo.

Al aprovechar la IA, esta puede tener una comprensión relativamente precisa del análisis de código específico, porque para la IA, los datos del código son “1 es 1, 2 es 2” y no habrá confusión lógica, ambigüedad u otros problemas causados ​​por los requisitos de descripción del lenguaje natural. Entonces, ¿por qué no aprovechar las ventajas de la IA para reducir la carga de trabajo manual y aprovechar al máximo las ventajas del trabajo manual?

¿Cómo utilizar la IA para revertir estrategias de aprendizaje?

Se puede dividir en los siguientes pasos:

  • Seleccione una estrategia existente Puede ser de autoría propia, de código abierto o un excelente ejemplo de estrategia en la plataforma cuantitativa del inventor.

  • Dejemos que la IA nos ayude a explicar la estrategia

Comprender la idea general

Clasifique los módulos funcionales de cada parte

Aclarar los indicadores, parámetros y lógica comercial utilizados

  • Haga más preguntas para guiar a la IA a analizar los pros y los contras de la estrategia.

¿En qué condiciones de mercado la estrategia funciona mejor?

¿Cuáles son los posibles puntos de riesgo?

¿Qué áreas se pueden optimizar y mejorar?

  • Verificar y ajustar según su propio pensamiento

Pruebas retrospectivas en diferentes productos y períodos

Añadir filtros adicionales o medidas de control de riesgos

Observa los cambios de rendimiento y forma tus propios conocimientos

Práctica

Dejemos que la IA aprenda una estrategia y nos la explique para ver si cumple nuestras expectativas. Puede ayudarnos a aprender cuantificación.

Ejemplo de política

Diseño e implementación de una estrategia comercial de aumento de posiciones paso a paso basada en el filtrado de tendencias EMA Dirección de estrategia: https://www.fmz.com/strategy/492116

/*backtest
start: 2024-10-01 00:00:00
end: 2025-04-23 00:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
args: [["targetProfit",20],["amount",20],["amountPrecision",3],["isAmountForUSDT",true]]
*/

function getTotalEquity_OKEX_V5() {
    var totalEquity = null 
    var ret = exchange.IO("api", "GET", "/api/v5/account/balance", "ccy=USDT")
    if (ret) {
        try {
            totalEquity = parseFloat(ret.data[0].details[0].eq)
        } catch(e) {
            Log("获取账户总权益失败!")
            return null
        }
    }
    return totalEquity
}

function getTotalEquity_Binance() {
    var totalEquity = null 
    var ret = exchange.GetAccount()
    if (ret) {
        try {
            totalEquity = parseFloat(ret.Info.totalWalletBalance)
        } catch(e) {
            Log("获取账户总权益失败!")
            return null
        }
    }
    return totalEquity
}

function getTotalEquity() {
    var exName = exchange.GetName()
    if (exName == "Futures_OKCoin") {
        return getTotalEquity_OKEX_V5()
    } else if (exName == "Futures_Binance") {
        return getTotalEquity_Binance()
    } else {
        throw "不支持该交易所"
    }
}

function ceilToDecimals(value, decimals) {
    const factor = Math.pow(10, decimals);
    return Math.ceil(value * factor) / factor;
}

function cancelAll() {
    while (1) {
        var orders = _C(exchange.GetOrders)
        if (orders.length == 0) {
            break
        }
        for (var i = 0 ; i < orders.length ; i++) {
            exchange.CancelOrder(orders[i].Id, orders[i])
            Sleep(interval)
        }
        Sleep(interval)
    }
}

function trade(distance, price, amount) {
    var tradeFunc = null 
    if (distance == "buy") {
        tradeFunc = exchange.Buy
    } else if (distance == "sell") {
        tradeFunc = exchange.Sell
    } else if (distance == "closebuy") {
        tradeFunc = exchange.Sell
    } else {
        tradeFunc = exchange.Buy
    }
    exchange.SetDirection(distance)
    return tradeFunc(price, amount)
}

function openLong(price, amount) {
    return trade("buy", price, amount)
}

function openShort(price, amount) {
    return trade("sell", price, amount)
}

function coverLong(price, amount) {
    return trade("closebuy", price, amount)
}

function coverShort(price, amount) {
    return trade("closesell", price, amount)
}

function plotRecords(c, buyOrder, sellOrder, pos) {
    var bars = _C(exchange.GetRecords)
    if (bars.length == 0) {
        return  
    }

    bars.forEach(function(bar, index) {
        c.begin(bar)
        if (index == bars.length - 1) {
            if (buyOrder) {
                c.hline(buyOrder.Price, "buy", "rgba(255, 0, 0, 0.2)", "dotted")
            }
            if (sellOrder) {
                c.hline(sellOrder.Price, "sell", "rgba(0, 255, 0, 0.2)", "dotted")
            }
            if (pos && pos.length == 1) {
                c.hline(pos[0].Price, "pos", "rgba(0, 0, 255, 0.2)", "dashed")
            }
        }
        c.close()
    })
}

var buyOrderId = null
var sellOrderId = null
var logStatusMsgBuff = ""

function main() {
    var exName = exchange.GetName()    
    if (isSimulate && exName == "Futures_OKCoin") {
        exchange.IO("simulate", true)
    }

    if (isReset) {
        _G(null)
        LogReset(1)
        LogProfitReset()
        LogVacuum()
        Log("重置所有数据", "#FF0000")
    }

    exchange.SetContractType(contractType)
    exchange.SetPrecision(pricePrecision, amountPrecision)
    Log("设置精度", pricePrecision, amountPrecision)
    exchange.SetMarginLevel(marginLevel)

    if (totalEq == -1 && !IsVirtual()) {
        var recoverTotalEq = _G("totalEq")
        if (!recoverTotalEq) {
            var currTotalEq = getTotalEquity()
            if (currTotalEq) {
                totalEq = currTotalEq
                _G("totalEq", currTotalEq)
            } else {
                throw "获取初始权益失败"
            }
        } else {
            totalEq = recoverTotalEq
        }
    }

    var addCounter = _G("addCounter")
    if (!addCounter) {
        addCounter = 1
        if (setAddCounter != -1) {
            addCounter = setAddCounter
        }
        _G("addCounter", addCounter)
    } else {
        addCounter -= 1
    }

    let c = KLineChart({
        overlay: true
    })
    
    var isLock = false 
    while (true) {
        var ticker = _C(exchange.GetTicker)        
        var pos = _C(exchange.GetPosition)
        if (pos.length > 1) {
            Log(pos)
            throw "同时有多空持仓"
        }

        var r = _C(exchange.GetRecords, 60 * 60)
        var ema = TA.EMA(r, 60)
        if (Math.abs(ticker.Last - ema[ema.length - 2]) / ema[ema.length - 2] > 0.03) {
            cancelAll()
            isLock = true 
        }
        if (Math.abs(ticker.Last - ema[ema.length - 2]) / ema[ema.length - 2] < 0.02) {
            isLock = false 
        }
        if (isLock) {
            LogStatus(_D(), "暂停, 检测阈值:", _N(Math.abs(ticker.Last - ema[ema.length - 2]) / ema[ema.length - 2], 3), logStatusMsgBuff)
            plotRecords(c, null, null, pos)
            Sleep(interval)
            continue 
        }

        var currentAcc = _C(exchange.GetAccount)
        if (currentAcc.Balance < totalEq * reserve) {
            throw "no money, stop"
        }

        if (addCounter > maxAddCounter) {
            LogStatus(_D(), "加仓已达到上限", logStatusMsgBuff)
            if (isMaxAddCounterClear && pos.length >= 1) {
                Log("加仓已达到上限,撤单,清仓")
                cancelAll()
                if (pos[0].Type == PD_LONG) {
                    var coverId = coverLong(-1, pos[0].Amount)
                } else if (pos[0].Type == PD_SHORT) {
                    var coverId = coverShort(-1, pos[0].Amount)
                }
                addCounter = 1
            }
            continue
        }

        if (pos.length == 0) {
            if (!IsVirtual()) {
                var currTotalEq = getTotalEquity()
                if (currTotalEq) {
                    LogProfit(currTotalEq - totalEq, "当前总权益:", currTotalEq)
                }
            }

            var tradeAmountLong = amount
            var tradeAmountShort = amount
            if (isAmountForUSDT) {
                tradeAmountLong = ceilToDecimals(tradeAmountLong * 1.01 / (ticker.Last - targetProfit / 5) / oneCtValue, amountPrecision)
                tradeAmountShort = ceilToDecimals(tradeAmountShort * 1.01 / (ticker.Last + targetProfit / 5) / oneCtValue, amountPrecision)
            }

            buyOrderId = openLong(ticker.Last - targetProfit / 5, tradeAmountLong)
            sellOrderId = openShort(ticker.Last + targetProfit / 5, tradeAmountShort)

            addCounter = 1
            _G("addCounter", addCounter)
        } else if (pos[0].Type == PD_LONG) {
            var n = ratio
            var price = ticker.Last
            var addAmount = isDoubling ? pos[0].Amount : (isAmountForUSDT ? (ceilToDecimals(amount * 1.01 / (price - targetProfit * n) / oneCtValue, amountPrecision)) : amount)
            buyOrderId = openLong(price - targetProfit * n, addAmount)
            sellOrderId = coverLong(pos[0].Price + targetProfit, pos[0].Amount)

            addCounter++
            _G("addCounter", addCounter)
        } else if (pos[0].Type == PD_SHORT) {
            var n = ratio
            var price = ticker.Last
            var addAmount = isDoubling ? pos[0].Amount : (isAmountForUSDT ? (ceilToDecimals(amount * 1.01 / (price + targetProfit * n) / oneCtValue, amountPrecision)) : amount)
            buyOrderId = coverShort(pos[0].Price - targetProfit, pos[0].Amount)
            sellOrderId = openShort(price + targetProfit * n, addAmount)

            addCounter++
            _G("addCounter", addCounter)
        }

        if (!sellOrderId || !buyOrderId) {
            cancelAll()
            buyOrderId = null 
            sellOrderId = null
            continue
        } 

        while (1) { 
            var isFindBuyId = false 
            var isFindSellId = false
            var orders = _C(exchange.GetOrders)
            var buyOrder = null 
            var sellOrder = null 
            for (var i = 0 ; i < orders.length ; i++) {
                if (buyOrderId == orders[i].Id) {
                    isFindBuyId = true 
                    buyOrder = orders[i]
                }
                if (sellOrderId == orders[i].Id) {
                    isFindSellId = true 
                    sellOrder = orders[i]
                }               
            }
            if (!isFindSellId && !isFindBuyId) {    
                cancelAll()
                break
            } else if (!isFindBuyId) {   
                Log("买单成交")
                cancelAll()
                break
            } else if (!isFindSellId) {  
                Log("卖单成交")
                cancelAll()
                break
            }

            var acc = _C(exchange.GetAccount)
            var tbl = {"type": "table", "title": "data", "cols": ["data", "symbol", "type", "price", "amount"], "rows": []}
            if (buyOrder) {
                tbl.rows.push(["订单", buyOrder.Symbol, buyOrder.Type == ORDER_TYPE_BUY ? "买入" : "卖出", buyOrder.Price, buyOrder.Amount])
            }
            if (sellOrder) {
                tbl.rows.push(["订单", sellOrder.Symbol, sellOrder.Type == ORDER_TYPE_BUY ? "买入" : "卖出", sellOrder.Price, sellOrder.Amount])
            }
            if (pos && pos.length == 1) {
                tbl.rows.push(["持仓", pos[0].Symbol, pos[0].Type == PD_LONG ? "多" : "空", pos[0].Price, pos[0].Amount])
            }

            logStatusMsgBuff = "当前权益:" + acc.Equity + ", 初始权益:" + totalEq + (!IsVirtual() ? ", 浮动盈亏:" + (acc.Equity - totalEq) : "") + ", 加仓次数:" + addCounter + "\n`" + JSON.stringify(tbl) + "`"
            LogStatus(_D(), "当前权益:", acc.Equity, ", 初始权益:", totalEq, !IsVirtual() ? ", 浮动盈亏:" + (acc.Equity - totalEq) : "", ", 加仓次数:" + addCounter, "\n`" + JSON.stringify(tbl) + "`")

            plotRecords(c, buyOrder, sellOrder, pos)            
            Sleep(interval)
        }
        Sleep(interval)
    }
}

function onexit() {
    Log("扫尾,撤销所有挂单")
    cancelAll()
}

Para los nuevos estudiantes de la plataforma FMZ, ver tal pila de códigos puede hacerlos sentir perdidos. En lugar de estudiar el código línea por línea, podríamos (ser perezosos) y arrojárselo a la IA, dejar que la IA nos lo explique y mejorar la eficiencia del aprendizaje.

Explicación de la IA

Aquí estoy usando GPT y el siguiente contenido está explicado por IA:

  • Un resumen Este artículo presentará una estrategia comercial de aumento de posiciones paso a paso basada en el filtrado de tendencias EMA (promedio móvil exponencial). Esta estrategia se utiliza principalmente en Binance Futures (Futures_Binance), admite pruebas retrospectivas de 1 hora y se basa en la agregación de datos de línea K de 1 minuto. Mediante el monitoreo en tiempo real de la desviación entre el precio y la EMA, la estrategia cambia dinámicamente los modos de negociación (negociación normal/negociación suspendida), aumenta gradualmente las posiciones en condiciones de mercado estables y suspende automáticamente las posiciones en caso de fluctuaciones anormales para evitar riesgos.

    1. Lógica de la estrategia
      1. Filtrado de tendencias (control de posición de bloqueo) Calcule la EMA de 60 períodos de los datos de velas de la hora más reciente. Cuando el precio actual se desvíe de la EMA en más del 3%, suspenda la colocación de órdenes y cancele las órdenes pendientes. Cuando la desviación vuelva a caer al 2%, se reanudará la negociación normal. Mediante el filtrado de tendencias, puede evitar el riesgo de liquidación causado por el aumento frecuente de posiciones en condiciones de mercado turbulentas.
      1. Lógica de adición de posiciones (añadiendo posiciones gradualmente) Cuando no hay ninguna posición inicialmente, se colocan al mismo tiempo dos órdenes pendientes, una orden de compra baja y una orden de venta alta. Precio del pedido: La orden de compra se coloca por debajo del precio actual (distancia objetivo/5) La orden de venta se coloca por encima del precio actual (distancia targetProfit/5) Si se ejecuta la orden pendiente, se realizará un aumento de posición paso a paso: Si se ejecuta la orden de compra, continúe colocando la siguiente orden de compra a un precio más bajo y establezca una orden de venta con stop-profit para la posición existente. Si se ejecuta la orden de venta, continúe colocando la siguiente orden de venta a un precio más alto y establezca una orden de compra con stop-profit para la posición existente. La cantidad de posiciones agregadas se puede establecer como doble o como una cantidad fija. Cuando el número de adiciones de posiciones alcanza maxAddCounter, la estrategia puede optar por forzar la liquidación.
      1. Control de posiciones y protección del capital Establezca el monto de cada posición abierta en función del capital total inicial (totalEq). Admite la estimación del número de contratos por monto en USDT (calcula automáticamente la cantidad del pedido en función del precio subyacente). Asegúrese de que el saldo restante en la cuenta sea mayor que una determinada proporción (reserva). Si el saldo es insuficiente, deje de operar.
    1. Introducción a las funciones y módulos principales
      1. Obtenga el capital total de la cuenta La función getTotalEquity está encapsulada para Binance Futures (Futures_Binance) y OKEX V5 (Futures_OKCoin). Compatible con las diferencias de API de diferentes exchanges, devuelve uniformemente los activos totales actuales de la cuenta (denominados en USDT).
      1. Módulo de colocación y cancelación de pedidos comercio(dirección, precio, cantidad): encapsula una interfaz de orden unificada. cancelAll(): cancela todas las órdenes pendientes para evitar la acumulación de riesgos debido a demasiadas órdenes pendientes.
      1. Apertura larga, apertura corta y cierre de posiciones openLong(precio, cantidad): apertura larga. openShort(precio, cantidad): abre una posición corta. coverLong(precio, cantidad): cercano a largo. coverShort(precio, cantidad): vacío.
      1. Número de puestos añadidos y registros de estado Utilización_G() registra de forma persistente la cantidad de adiciones de posiciones addCounter para evitar la pérdida del estado de adición de posiciones después de la desconexión y el reinicio. Utilice LogStatus para mostrar dinámicamente información de la cuenta en tiempo real, el estado de los pedidos pendientes y la información de la posición.
      1. Dibujo de gráficos Utilice KLineChart para dibujar líneas clave, como el precio de la orden de compra, el precio de la orden de venta, el precio de la posición promedio, etc., para ayudar en las pruebas retrospectivas visuales y el monitoreo en tiempo real.
    1. Diagrama de flujo de la estrategia
  flowchart TD
      开始 --> 初始化参数
      初始化参数 --> 账户余额检查
      账户余额检查 --> 计算EMA
      计算EMA --> 判断是否锁仓
      判断是否锁仓 -->|是| 暂停交易
      判断是否锁仓 -->|否| 正常交易
      正常交易 --> 是否有持仓
      是否有持仓 -->|无| 首次挂单
      是否有持仓 -->|有| 按持仓方向加仓与止盈挂单
      首次挂单 --> 等待成交
      按持仓方向加仓与止盈挂单 --> 等待成交
      等待成交 --> 挂单成交检测
      挂单成交检测 --> 成交后调整
      成交后调整 --> 更新加仓次数
      更新加仓次数 --> 是否超出最大加仓次数
      是否超出最大加仓次数 -->|是| 平仓
      是否超出最大加仓次数 -->|否| 继续交易
  • Cinco, resumen Esta estrategia de aumento de posición paso a paso basada en el filtrado de EMA tiene en cuenta tanto los rendimientos como el control de riesgos, y es adecuada para operar en un mercado volátil y débilmente volátil. A través de métodos flexibles de adición de posiciones y mecanismos de pausa de tendencia, se puede reducir efectivamente la probabilidad de liquidación y se puede mejorar la eficiencia del uso del capital. Admite tanto pruebas retrospectivas como operaciones reales y su diseño modular facilita su expansión. Por ejemplo, puede introducir además un ajuste dinámico de targetProfit y del monto, o agregar otros indicadores técnicos para mejorar el efecto de filtrado.

    • ¿Quieres que te de una sugerencia adelantada? Por ejemplo: Cómo mejorar la posición bidireccional (posición bidireccional) Cómo ajustar dinámicamente la relación de aumento de posición ¿Cómo integrar la lógica de stop-loss de control de riesgos?

Preguntas/explicaciones locales

Respecto a las preguntas sobre GPT:

Uso de IA para aprender a revertir el diseño de estrategias: una nueva forma de mejorar las habilidades de trading cuantitativo

El siguiente contenido es explicado por IA:

En esta estrategia, el filtrado de tendencias se logra mediante:

var ema = TA.EMA(r, 60)
if (Math.abs(ticker.Last - ema[ema.length - 2]) / ema[ema.length - 2] > 0.03) {
    cancelAll()
    isLock = true 
}
if (Math.abs(ticker.Last - ema[ema.length - 2]) / ema[ema.length - 2] < 0.02) {
    isLock = false 
}
if (isLock) {
    LogStatus(_D(), "暂停, 检测阈值:", _N(Math.abs(ticker.Last - ema[ema.length - 2]) / ema[ema.length - 2], 3), logStatusMsgBuff)
    plotRecords(c, null, null, pos)
    Sleep(interval)
    continue 
}
  • Análisis de código Filtro de tendencia EMA: TA.EMA(r, 60) se utiliza para calcular la media móvil exponencial (EMA) de las últimas 60 horas. r son los datos históricos de la línea K obtenidos por exchange.GetRecords, y cada punto de datos representa una hora de información de precios. La matriz EMA almacena el valor EMA para cada hora.[ema.length - 2] representa el valor EMA de la hora anterior en el punto de tiempo actual.

Bloqueo y liberación de tendencias: Comparando la diferencia entre el precio actual (ticker.Last) y el valor EMA de la hora anterior, se calcula el porcentaje en que el precio se desvía de la EMA. Math.abs(ticker.Last - ema[ema.length - 2]) / ema[ema.length - 2] calcula la desviación porcentual del precio actual con respecto a la EMA de la hora anterior. Si la desviación supera el 3% (> 0,03), se considera que la tendencia del mercado ha cambiado significativamente y se llama a la función cancelAll() para cancelar todas las órdenes pendientes, y isLock se establece en verdadero, es decir, la posición se bloquea, lo que impide futuras operaciones. Si el precio se desvía de la EMA en menos del 2% (,02), se libera el estado de bloqueo y isLock se establece en falso.

Suspensión de operaciones: Si isLock es verdadero (lo que indica que la posición está actualmente bloqueada), no se realizarán más operaciones comerciales. El programa generará registros de registro y llamará a plotRecords() para dibujar un gráfico que muestre la tendencia actual y el estado de la posición. Utilice Sleep(intervalo) para hacer una pausa durante un período de tiempo determinado y luego continuar el bucle.

  • Prueba retrospectiva

Uso de IA para aprender a revertir el diseño de estrategias: una nueva forma de mejorar las habilidades de trading cuantitativo

Parece que algunas tendencias se pueden filtrar. Al leer el código yo mismo, descubrí que la explicación de la IA era muy clara, incluso más clara que si la hubiera explicado yo mismo.

Resumir

Al permitir que la IA analice y explique la estrategia general y luego, basándose en la explicación de la IA de la estrategia general, analizar, desmontar y explicar gradualmente los detalles locales de la estrategia y las ideas de diseño. Las explicaciones que recibimos fueron relativamente precisas. La IA enumeró casi todos los detalles diseñados en la estrategia sin omisiones y realizó un análisis detallado a través de preguntas adicionales. Esta forma de aprender toda la estrategia de pensamiento, los detalles del diseño de código y aumentar la experiencia en diseño de estrategia son muy útiles.

En el camino del comercio cuantitativo, la IA puede convertirse en un socio de aprendizaje y crecimiento extremadamente poderoso para nosotros. En lugar de depender de la IA para generar estrategias terminadas con un solo clic, la IA puede:

  • Estrategias existentes de aprendizaje profundo
  • Comprender rápidamente la lógica compleja
  • Experiencia en diseño sistemático
  • Optimización e innovación continuas

Sólo este camino puede mejorar verdaderamente nuestras capacidades comerciales cuantitativas y establecer nuestro propio sistema de comercio sistemático. En la plataforma de comercio cuantitativo Inventor, podemos aprovechar al máximo el poder de la IA y combinarlo con nuestra propia práctica para llegar más lejos y volar más alto.