O recurso está a ser carregado... Carregamento...

FMZ lança o Python, um motor de detecção nativo

Autora:Inventor quantificado - sonho pequeno, Criado: 2018-04-13 09:48:31, Atualizado: 2019-08-19 16:30:05

FMZ lança o Python, um motor de detecção nativo

FMZ backtest engine Python pacote FMZ Request Engine Python biblioteca Suporte para python2 e python3, suporte para Windows, Linux, Mac Suporte para Python 2 e Python 3, com suporte para sistemas Windows, Linux, Apple Mac OS

instalar

Instalação Na barra de comandos, digite o seguinte:

pip install https://github.com/fmzquant/backtest_python/archive/master.zip
  • Atenção: Quando o sistema Mac da Apple é instalado, se houver restrições de segurança, o comando pip deve ser precedido pelo comando sudo, que requer o ingresso do código do sistema antes de todo o comando de instalação ser executado.

exemplo simples

Exemplo simples

'''backtest
start: 2018-02-19 00:00:00
end: 2018-03-22 12:00:00
period: 15m
exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}]
'''
from fmz import *
task = VCtx(__doc__) # initialize backtest engine from __doc__
print exchange.GetAccount()
print exchange.GetTicker()
print task.Join() # print backtest result

The config string can be generated automaticamente by saving the backtest configuration in the strategy edit page. A config string pode ser gerada automaticamente por salvar a configuração do backtest na página de edição da estratégia. As strings de configuração podem ser geradas automaticamente através de configurações de retrospecção salvas na interface de edição da política

meta

Documentação

Documentação API: (isto é, documentos que chamam funções como GetAccount no exemplo)

O código Python é simplesmente descrito:

'''backtest
start: 2018-02-19 00:00:00
end: 2018-03-22 12:00:00
period: 15m
exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}]
'''
from fmz import *                                                  # 引用 发明者量化 库
task = VCtx(__doc__) # initialize backtest engine from __doc__     # 调用 VCtx 函数 根据 __doc__初始化。
print exchange.GetAccount()                                        # 测试 GetAccount 函数,并打印 回测系统测试交易所账户信息
print exchange.GetTicker()                                         # 测试 GetTicker 函数,并打印 回测系统 行情信息
print task.Join() # print backtest result                          # 调用 初始化后的 task 对象 显示回测结果
  • _doc__

    是两个下划线。__doc__用来访问模块,类声明或者函数的声明中第一个未被赋值的字符串,
    可以是被""" ""","" "",' ',括起来的,作用就是把 代码中 '''backtest   ...  ''' 的回测配置信息  传入 VCtx 类构造函数构造对象。
    
  • Em seguida, modifique o código de teste para ver como as funções Log e GetTicker são chamadas.

    # coding=UTF-8
    
    '''backtest
    start: 2018-02-19 00:00:00
    end: 2018-03-22 12:00:00
    period: 15m
    exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}]
    '''
    
    from fmz import *                                                # 引用 发明者量化 库
    task = VCtx(__doc__) # initialize backtest engine from __doc__     # 调用 VCtx 函数 根据 __doc__初始化。
    print exchange.GetAccount()                                        # 测试 GetAccount 函数,并打印 回测系统测试交易所账户信息
    Log("\n 调用Log")
    Log("调用 exchange.GetTicker() : ", exchange.GetTicker())
    print task.Join() # print backtest result                          # 调用 初始化后的 task 对象 显示回测结果
    
    • O código de saída do print exchange.GetAccount ((() é:
    {'Balance': 3.0, 'Stocks': 0.0, 'FrozenBalance': 0.0, 'FrozenStocks': 0.0}
    
    • Log (("\nLog chamada") 、 Log (("Log chamada exchange.GetTicker() ":", exchange.GetTicker())

    O conteúdo de saída está dentro da estrutura de dados de saída do print task.Join:

    {
        "Chart": {
     	   "Cfg": "",
     	   "Datas": []
        },
        "Elapsed": 42000000,
        "Finished": true,
        "Indicators": {},
        "LoadBytes": 441845,
        "LoadElapsed": 24000000,
        "LogsCount": 2,
        "Profit": 0.0,
        "ProfitLogs": [],
        "Progress": 100.0,
        "RuntimeLogs": [                                                  # 调用输出内容在此处
     	   [1, 1518969600200, 5, "", 0, 0.0, 0.0, "\n 调用Log", "", ""],
     	   [2, 1518969600400, 5, "", 0, 0.0, 0.0, "调用 exchange.GetTicker() :  {'Sell': 0.02113476, 'Volume': 519.6953, 'Buy': 0.02113474, 'Last': 0.02113475, 'High': 0.02113476, 'Time': 1518969600000L, 'Low': 0.02113474}", "", ""]
        ],
        "Snapshort": [{
     	   "Balance": 3.0,
     	   "BaseCurrency": "LTC",
     	   "Commission": 0.0,
     	   "FrozenBalance": 0.0,
     	   "FrozenStocks": 0.0,
     	   "Id": "OKEX",
     	   "QuoteCurrency": "BTC",
     	   "Stocks": 0.0,
     	   "Symbols": {
     		   "LTC_BTC_OKEX": {
     			   "Last": 0.01893785
     		   }
     	   },
     	   "TradeStatus": {}
        }],
        "Status": "",
        "Task": {
     	   "Args": null,
     	   "Exchanges": [{
     		   "Balance": 3,
     		   "BaseCurrency": "LTC",
     		   "BasePeriod": 300000,
     		   "BasePrecision": 4,
     		   "DepthDeep": 5,
     		   "FaultTolerant": 0,
     		   "FeeDenominator": 5,
     		   "FeeMaker": 75,
     		   "FeeMin": 0,
     		   "FeeTaker": 80,
     		   "Id": "OKEX",
     		   "Label": "OKEX",
     		   "PriceTick": 1e-08,
     		   "QuoteCurrency": "BTC",
     		   "QuotePrecision": 8,
     		   "SlipPoint": 0,
     		   "Stocks": 0
     	   }],
     	   "Options": {
     		   "DataServer": "q.botvs.net",
     		   "MaxChartLogs": 800,
     		   "MaxProfitLogs": 800,
     		   "MaxRuntimeLogs": 800,
     		   "NetDelay": 200,
     		   "Period": 900000,
     		   "RetFlags": 189,
     		   "SnapshortPeriod": 300000,
     		   "TimeBegin": 1518969600,
     		   "TimeEnd": 1521691200,
     		   "UpdatePeriod": 5000
     	   }
        },
        "TaskStatus": 1,
        "Time": 1521691200000
    }
    
  • Como usar uma política para rastrear em um motor de rastreamento local

# !/usr/local/bin/python
# -*- coding: UTF-8 -*-
'''backtest
start: 2018-02-19 00:00:00
end: 2018-03-22 12:00:00
period: 15m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD","balance":10000,"stocks":3}]
'''
import sys
sys.path.append("/usr/local/lib/python2.7/site-packages")    # 测试时添加了路径,如不需要可以删除

from fmz import *
import math
import talib

task = VCtx(__doc__) # initialize backtest engine from __doc__

# ------------------------------ 策略部分开始 --------------------------
print exchange.GetAccount()     # 调用一些接口,打印其返回值。
print exchange.GetTicker()

def adjustFloat(v):             # 策略中自定义的函数
    v = math.floor(v * 1000)
    return v / 1000

def onTick(e):
    Log("onTick")
    # ....

#
# ...
# 
# 此处省略 自定义函数实现等代码。

def main():
    InitAccount = GetAccount()
    
    while True:
        onTick(exchange)
        Sleep(1000)
# ------------------------------ 策略部分结束 --------------------------

try:
    main()                     # 回测结束时会 raise EOFError() 抛出异常,来停止回测的循环。所以要对这个异常处理,在检测到抛出的异常后调用 task.Join() 打印回测结果。
except:
    print task.Join()          # print backtest result  , 打印回测结果。

Mais.

Alextao/Users/taoxing/opt/anaconda3/envs/ai4f/lib/python3.8/site-packages/flask_sqlalchemy/__init__.py:793: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adiciona overhead significativo e será desativado por padrão no futuro. Warnings.warn ((FSADeprecationWarning)) Traceback (última chamada mais recente): File "/Users/taoxing/Desktop/quant/trading_api_study/fmz/fmz_extend_api_demo/app.py", linha 152, em db.create_all (em inglês) File "/Users/taoxing/opt/anaconda3/envs/ai4f/lib/python3.8/site-packages/flask_sqlalchemy/__init__.py", linha 963, em create_all self._execute_for_all_tables (app, bind, 'create_all') File "/Users/taoxing/opt/anaconda3/envs/ai4f/lib/python3.8/site-packages/flask_sqlalchemy/__init__.py", linha 955, em _execute_for_all_tables op ((bind=self.get_engine ((app, bind), **extra) File "/Users/taoxing/opt/anaconda3/envs/ai4f/lib/python3.8/site-packages/flask_sqlalchemy/__init__.py", linha 896, em get_engine return connector.get_engine (em inglês) File "/Users/taoxing/opt/anaconda3/envs/ai4f/lib/python3.8/site-packages/flask_sqlalchemy/__init__.py", linha 556, em get_engine Self._sa.apply_driver_hacks (self._app, info, opções) File "/Users/taoxing/opt/anaconda3/envs/ai4f/lib/python3.8/site-packages/flask_sqlalchemy/__init__.py", linha 861, em apply_driver_hacks info.database = os.path.join (app.root_path, info.database) AtributeError: não pode definir atributo O que você está fazendo de errado, peça a Deus para guiá-lo!

Guanyuwanglei 我想运行实盘机器人,添加Wex.app交易所相当于实盘模拟交易是吧?谢谢

GuanyuwangleiMas há apenas um pouco de dados do disco real, quais configurações podem ser otimizadas para obter mais dados do disco? /upload/asset/105f604eaceb0d3928a90.png /upload/asset/1066714d9a32c82eab7f1.png

GuanyuwangleiOlá, eu gostaria de usar o par de transações do token cash husd/usdt, eu tentei com o exchange.IO (("currency", "HUSD_USDT"), exchange.IO (("currency", "HUSD/USDT"), exchange.IO (("currency", "HUSDUSDT"), não executar o desistência ou o subscrição de variedade falhou, por favor, qual é a ortografia correta?

Todos os dias um bom modeloO resultado do teste é incompreensível, como visualizá-lo?

GuanyuwangleiPor favor, no sistema windows, o exchange não consegue resolver, obrigado.

WoshiituoshiO projeto de código aberto permite que o próprio desenvolvedor adicione alguns pares de transações?

1058715329Quando é que a otimização de parâmetros locais pode ser suportada?

A única coisa que eu seiEu já baixei a biblioteca do fmz, mas recebi um erro ao usá-lo e não consegui encontrar o pacote onde ele está.

- Não.Como configurar o modo Tick? Por padrão, parece que é usado o Tick de nível analógico, como mudar para o Tick de nível real

XiaojianOu não, onde a função principal de uma estratégia deve ser colocada neste exemplo

XiaojianO teste só funciona com LTC_BTC? Eu mudei para o programa BTC_USDT e recebi um erro

- O Teddy.O que é que o Python 3 tem a fazer com o print exchange.GetTicker?

yxybyqO retorno na plataforma não é um problema, o retorno local geralmente é errado.

liputEm fmz, é possível escrever a função main, e ver que a maioria das políticas é escrita enquanto True, e então a política é chamada ao ciclo. Mas, quando se usa o motor de retorno nativo do Python, o while True deixa o programa executar, não pode parar de executar dentro do tempo de início e término especificado pelo __doc__, e dá o resultado de Log. Além disso, eu vejo em outras plataformas de quantificação que geralmente são apenas funções especificadas escritas pelo desenvolvedor e depois revertidas pela plataforma. fmz permite escrever diretamente a entrada principal, há alguma vantagem ou consideração de design ou arquitetura?

liputA variável de entrada de interação no código, como pode ser escrita em __doc__, ou pode ser inserida como um parâmetro?

liputO código foi alterado para fmz, e o exemplo de código no documento precisa mudar o nome do pacote.

Sim SimO main (()) é normal. O que é que acontece quando o exchange de chamadas em uma classe produz um erro? File "D:/workspace/strategy/strategy_001.py", linha 101, em principal account = self._exchange.GetAccount (em inglês) File "C:\Users\User\AppData\Local\Programs\Python\Python36-32\lib\site-packages\botvs.py", linha 716, em GetAccount EOF (em inglês) File "C:\Users\User\AppData\Local\Programs\Python\Python36-32\lib\site-packages\botvs.py", linha 569, em EOF raise EOFError (em inglês)

TopscienO que é que isto faz?

Lizza.Não entendo muito bem o que fazer com isso, o retorno local também precisa de se comunicar com a plataforma botvs?

Inventor quantificado - sonho pequenoTente com o pacote mais recente fmz.

Inventor quantificado - sonho pequenoO servidor é gratuito, mas a implementação de um botão é a locação automática do servidor da Ali Cloud, que é paga pelo servidor.

GuanyuwangleiO que é claro é que o administrador paga, o robô pode usar o WexApp para testar, ou pode usar o mercado real para negociar, certo?

Inventor quantificado - sonho pequenoUm host de implantação, que é instalado em um servidor da nuvem Ali, é pago e será cobrado pelo saldo da sua conta. O bot é executado, apenas opera o disco de WexApp, o custo do bot não é cobrado e não tem relação com o custo do servidor de um host de implantação.

GuanyuwangleiOu seja, com um clique, você pode instalar um servidor, escolher entre o WexApp, o bot e a troca analógica, e testar a simulação, certo?

Inventor quantificado - sonho pequenoO servidor de aluguel é uma outra taxa adicional. Não tem nada a ver com a taxa do disco físico do robô, o uso do disco de WexApp é apenas para dizer que o robô funciona gratuitamente (o robô de moeda digital é cobrado se adicionar qualquer objeto de um disco de troca não-WexApp).

GuanyuwangleiUm servidor de aluguel de teclas, usando o exchange do wexApp gratuitamente? /upload/asset/1066e4b56fa103356dbc1.png

Inventor quantificado - sonho pequenoO wexApp é um simulador gratuito do FMZ.

Inventor quantificado - sonho pequenoNão é cortês.

Inventor quantificado - sonho pequenoO volume de dados de retomada no nível do disco real é relativamente grande, e a configuração no gráfico já é ideal.

GuanyuwangleiEm vez disso, para os períodos mais recentes, o conjunto de transações, exchange.SetCurrency (("BTC_USDT"), pode ser feito em tempo real, muito obrigado.

Inventor quantificado - sonho pequenoTente trocar o período de tempo mais recente.

Guanyuwanglei/upload/asset/1063627010637fee333ad.png Configure o exchange.SetCurrency assim no código (("BTC_USDT") Mas a sugestão geral de subscrição de variedades de bromélias falhou BTC_USDT_OKEX bromélias ou nada mostrado, sair imediatamente

GuanyuwangleiObrigado.

Inventor quantificado - sonho pequenoO disco físico, o re-metro de linha de plataforma e o motor de re-metro local são dados do centro de dados FMZ, que fornecem um número limitado de pares de transações, não todos os pares de transações.

GuanyuwangleiA negociação real pode obter essa transação, certo?

Inventor quantificado - sonho pequenoO sistema de retrospecção não possui dados do par de transações no momento.

Inventor quantificado - sonho pequenoO resultado do teste é uma forma de dados, se você quiser visualizar, escreva seu próprio código para resolver. Se não, use um sistema de teste on-line.

GuanyuwangleiA5: = MA ((C,5); A10: = MA (C,10); ângulo: IF (CROSS) (A5, A10), ATAN (A5/REF) (A5, 1) -1) * 100) - ATAN (A10/REF) (A10, 1) -1) * 100), 0*180/3.1416; E se você não sabe como fazer isso, então você não sabe como fazer isso.

Inventor quantificado - sonho pequenoA fórmula deve ser calculada de acordo com as necessidades, dentro da estratégia, e a fórmula pode ser encontrada através de uma pesquisa no Baidu.

GuanyuwangleiComo calcular o ângulo do Macd Golden Fork?

GuanyuwangleiPor favor, importar modelos de estatísticas no editor de políticas não é válido, por favor, onde posso importar uma base de dados de terceiros?

Inventor quantificado - sonho pequenoEsta é a hora de início da linha K fixa, e se for necessário que a linha K diária comece a partir de zero, pode ser calculada com uma síntese de linha K de uma hora.

GuanyuwangleiPor favor, a hora de fechamento do código e a hora de fechamento da retrospectiva são 8:00 da manhã, horário de Pequim? Se o horário de encerramento não for 8:00 da manhã, por favor, pergunte como configurá-lo, obrigado /upload/asset/1067eabe09e92d1610d71.png

Inventor quantificado - sonho pequenoA partir de agora, você pode encontrar alguns exemplos de estratégias na Praça das Estratégias e, se você entender tudo, pode começar a escrever algumas estratégias simples.

GuanyuwangleiPor favor, eu já li o material de ensino básico, o método de uso do FMZ e a documentação do API.

Inventor quantificado - sonho pequenoNão é cortês.

GuanyuwangleiObrigado.

Inventor quantificado - sonho pequenoA função pode ser executada diretamente na linha de comando.

GuanyuwangleiEste código é necessário para executar um arquivo.py, importando o ccxt, caso contrário o exchange não o reconhecerá. O Python Consle pode ser editado e executado normalmente.

Inventor quantificado - sonho pequenoNão é necessário, um programa Python normal pode ser executado. O código acima é um comando direto para executar.

Guanyuwanglei/upload/asset/106d6ff1919bdac419875.png Como é que o exchange pode importar o ccxt, usando o ccxt no fmz?

Inventor quantificado - sonho pequenoO que é que ele está a fazer? Nome do arquivo: testBackTest Não. Importação * Task = VCtx (('''backtest Start: 2018-02-19 00:00:00 end: 2018-03-22 12:00:00 Período: 15m Exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}] ' '') #createbacktest Print (exchange.GetAccount) (em inglês) Print (exchange.GetTicker) (em inglês) Não sei. /upload/asset/16bea6055e58a9ef7d5c.png

Inventor quantificado - sonho pequenoA última versão do fmz python está disponível no Google Play Store, mas não está disponível no Google Play Store.

Guanyuwanglei/upload/asset/1068d63bc6203599fc1c8.png Modificou a inicialização, mas o exchange/Log não reconheceu

Inventor quantificado - sonho pequenoNão. Importação * Task = VCtx (('''backtest Start: 2018-02-19 00:00:00 end: 2018-03-22 12:00:00 Período: 15m Exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}] ' '') # Criar um ambiente de retrospecção Não. Assim, inicializar é como configurar as informações sobre a troca, o par de transações, etc.

Guanyuwanglei/upload/asset/106581e23604bb2d701d8.jpg O exchange não foi identificado, já instalou o pacote fmz no Python.

Inventor quantificado - sonho pequenoO blogueiro também escreveu sobre o assunto:

Inventor quantificado - sonho pequenoNão é possível por enquanto, porque os dados de retrospecção são obtidos a partir do FMZ. Mas o código é de código aberto e pode ser modificado e substituído à vontade.

Inventor quantificado - sonho pequenoNão. /* backtest Start: 2019-09-21 00:00:00 end: 2019-10-20 00:00:00 Período: 1h Exchanges: [{"eid:"Bitfinex","currency:"BTC_USD"}] Modo: 1 */ Não. Através da configuração de configuração, a configuração pode ser definida na página de retrospecção e depois salvada diretamente na página de edição da política para acessar a string de informação de configuração.

A posterioriA mesma pergunta?

chujiuSim, é verdade.

xenetoO topo

Inventor quantificado - sonho pequenoO que você está fazendo aqui é muito ruim, mas o que você está fazendo é muito ruim.

A única coisa que eu seiMuito bem, obrigado.

Inventor quantificado - sonho pequenoO problema foi encontrado e está sendo resolvido.

A única coisa que eu seiSim, o mac os 10.14.4

Inventor quantificado - sonho pequenoO seu sistema operacional é o Mac OSX?

A única coisa que eu seiEu estou usando conda para gerenciar a versão python, eu confirmei ter baixado a versão python do fmz, localmente também existe. Mas olhei para o site e vi que ele suporta o python3, mas eu tentei.

Inventor quantificado - sonho pequenoSe você tem várias versões do Python, verifique onde o pacote está instalado.

Inventor quantificado - sonho pequenoA publicação foi atualizada e você pode ver o exemplo no final da publicação.

Inventor quantificado - sonho pequenoA função main está escrita, é chamada diretamente e está pronta.

Xiaojian https://github.com/fmzquant/backtest_python/issues/4,看看这个有没有帮助

Inventor quantificado - sonho pequenoA informação errada, em particular, pode ser vista no screenshot abaixo.

XiaojianO exemplo é que o código que foi alterado para BTC_USDT é errado.

Inventor quantificado - sonho pequenoA questão é qual é a escolha da bolsa de valores.

Inventor quantificado - sonho pequenoPara ver mais concretamente, veja a mensagem de erro, veja a posição errada.

Inventor quantificado - sonho pequenoO FMZ usa uma arquitetura de consulta, o que permite um pouco mais de controle sobre o processo do programa e uma maior flexibilidade na redação de políticas.

Inventor quantificado - sonho pequeno'''Backtest Start: 2018-02-19 00:00:00 end: 2018-03-22 12:00:00 Período: 15m Exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}] " ' São estes:

Inventor quantificado - sonho pequenoO blogueiro também escreveu sobre o assunto:

Inventor quantificado - sonho pequenoFicheiros começam a ser carregados Esta configuração de conta simulada, se estiver escrita na classe, não pode ser carregada.

Sim SimA configuração deve ser correta. Por que você não pode escrever uma referência para a classe?

Sim SimO que você está fazendo aqui? A função global principal tem uma referência normal. Mas cometeram um erro na classe. '' 'Backtest Start: 2018-02-19 00:00:00 end: 2018-03-22 12:00:00 Período: 15m Exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}] " ' importar * task = VCtx ((__doc__) # initialize backtest engine from __doc__

Inventor quantificado - sonho pequenoNão. def GetAccount ((self): r = _ACCOUNT ret = self.lib.api_Exchange_GetAccount ((self.ctx, self.idx, ctypes.byref(r)) Se ret == API_ERR_SUCCESS: return r.toObj ()) Elif ret == API_ERR_FAILED: Retorno Nenhum EOF (em inglês) Não. Olhando para o código abaixo, parece que api_Exchange_GetAccount é uma interface de DLL, você recebe um erro que diz que não retornou, que a chamada foi bem-sucedida ou que a chamada não retornou, e então executa o EOF.

Inventor quantificado - sonho pequenoO que eu quero dizer é que você pode empacotar o sistema de retrospecção em uma biblioteca de Python, e você pode fazer com que o Python local faça a sua política de retrospecção.

Inventor quantificado - sonho pequenoHá uma comunicação, quando o retraso é solicitado por dados, mas o sistema de retraso é executado localmente. Não. '' 'Backtest Start: 2018-02-19 00:00:00 end: 2018-03-22 12:00:00 Período: 15m Exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}] " ' importar * task = VCtx ((__doc__) # initialize backtest engine from __doc__ Print exchange.GetAccount (em inglês) Print exchange.GetTicker (em inglês) Print task.Join ((() # print backtest result Não. Este código é semelhante a uma política, onde o sistema de retrospecção é envelopado em uma biblioteca, testando a função do sistema de retrospecção durante a execução. O '' 'backtest... '' acima é a configuração do parâmetro de retest, que pode ser gerada na página de retest da política BotVS.