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

Versão Python da estratégia de equilíbrio de plataforma única

Criado em: 2020-02-05 10:02:03, atualizado em: 2023-10-12 21:20:47
comments   1
hits   2701

Versão Python da estratégia de equilíbrio de plataforma única

Versão Python da estratégia de equilíbrio de plataforma única

Versão JavaScript

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

Neste artigo, vamos praticar a portabilidade de uma estratégia simples de JavaScript. Ao transplantar estratégias, você se familiarizará mais com as chamadas da interface da Inventor Quantitative Trading Platform e entenderá as pequenas diferenças entre diferentes linguagens ao desenvolver estratégias na plataforma. Na verdade, a diferença entre a estratégia da versão JavaScript e a versão Python a estratégia é muito pequena porque as chamadas de interface são basicamente as mesmas.

Descrição da estratégia

Citando a versão JavaScript das instruções:

Isso requer a abertura de uma posição. Por exemplo, se a conta tiver 5.000 yuans e 1 moeda, se o valor da moeda for maior que o saldo da conta de 5.000 e a diferença de preço exceder o limite, por exemplo, a moeda agora vale 6.000 yuan, então venda (6.000-5.000)/6.000. /2 moedas, significa que a moeda se valorizou, troque o dinheiro de volta, se a moeda se desvalorizar, por exemplo, para 4.000 yuan, compre (5.000-4.000)/4.000/2 moedas, compre algumas de volta quando a moeda cair, se ela subir novamente, eu a venderei novamente, assim como um equilíbrio, com diferentes proteções em ambos os lados, então eu a chamei de estratégia equilibrada.

O princípio da estratégia é muito simples, e a versão JavaScript do código não é longa, apenas mais de 70 linhas. Transplantado para a estratégia da linguagem Python com sintaxe mais concisa, o código é mais curto e muito adequado para iniciantes aprenderem. Há muitos códigos compartilhados por desenvolvedores na Inventor Quantitative Trading Platform, e a linguagem suportaJavaScript/C++/PythonEtc., portanto, dominar mais uma linguagem de desenvolvimento não é útil apenas para estratégias de aprendizado, pesquisa e desenvolvimento, mas também permite que você se familiarize mais com as diversas interfaces de API da plataforma.

Código de estratégia

'''backtest
start: 2019-12-01 00:00:00
end: 2020-02-01 11:00:00
period: 1m
exchanges: [{"eid":"OKEX","currency":"BTC_USDT","stocks":1}]
'''

InitAccount = None

def CancelPendingOrders():
    ret = False
    while True:
        orders = _C(exchange.GetOrders)
        if len(orders) == 0 :
            return ret

        for j in range(len(orders)):
            exchange.CancelOrder(orders[j].Id)
            ret = True
            if j < len(orders) - 1:
                Sleep(Interval)
    return ret 

def onTick():
    acc = _C(exchange.GetAccount)
    ticker = _C(exchange.GetTicker)
    spread = ticker.Sell - ticker.Buy
    diffAsset = (acc.Balance - (acc.Stocks * ticker.Sell)) / 2
    ratio = diffAsset / acc.Balance
    LogStatus("ratio:", ratio, _D())
    if abs(ratio) < threshold:
        return False
    if ratio > 0 :
        buyPrice = _N(ticker.Sell + spread, ZPrecision)
        buyAmount = _N(diffAsset / buyPrice, XPrecision)
        if buyAmount < MinStock:
            return False
        exchange.Buy(buyPrice, buyAmount, diffAsset, ratio)
    else :
        sellPrice = _N(ticker.Buy - spread, ZPrecision)
        sellAmount = _N(-diffAsset / sellPrice, XPrecision)
        if sellAmount < MinStock:
            return False 
        exchange.Sell(sellPrice, sellAmount, diffAsset, ratio)
    return True

def main():
    global InitAccount, LoopInterval
    InitAccount = _C(exchange.GetAccount)
    LoopInterval = max(LoopInterval, 1)
    while True:
        if onTick():
            Sleep(1000)
            CancelPendingOrders()
            Log(_C(exchange.GetAccount))
        Sleep(LoopInterval * 1000)

O código começa com

'''backtest
start: 2019-12-01 00:00:00
end: 2020-02-01 11:00:00
period: 1m
exchanges: [{"eid":"OKEX","currency":"BTC_USDT","stocks":1}]
'''

É a configuração do backtest, o que significa que a configuração do backtest (configurações) é salva na forma de código, e o backtest é configurado automaticamente de acordo com essa configuração. Esta parte pode ser excluída. Se excluída, você precisará definir manualmente as informações de configuração do backtest na página do backtest durante o backtesting. Referência: https://www.fmz.com/bbs-topic/859

Os parâmetros desta estratégia são exatamente os mesmos da versão JavaScript. O código da estratégia também é transplantado frase por frase, e a estrutura do programa não mudou. Você pode compará-los frase por frase para ver as diferenças entre as estratégias escritas em diferentes línguas.

Testes retrospectivos

Configuração de parâmetros Versão Python da estratégia de equilíbrio de plataforma única

Estatísticas Versão Python da estratégia de equilíbrio de plataforma única

Versão Python da estratégia de equilíbrio de plataforma única

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

A estratégia é apenas para referência, backtesting e teste. Se você estiver interessado, pode otimizá-la e atualizá-la.