avatar of 永赢量化-1 永赢量化-1
Seguir Mensajes Privados
1
Seguir
6
Seguidores

Usamos fmz para realizar una función de backtesting de comercio de cuadrícula en línea

Creado el: 2020-10-18 23:56:01, Actualizado el:
comments   2
hits   4457

Regreso al punto de partida

Antes de buscar una herramienta que pudiera hacer un retroceso en tiempo real, había estudiado durante un tiempo si era demasiado difícil que vnpy se convirtiera en una interfaz. Por último, busqué en el manual de novatos de FMZ. En este post, el autor de este post, el blogger y bloguero de la web, el blogger y bloguero de la red social, el blogger y bloguero de la red social, el blogger y bloguero de la red social, el blogger y bloguero de la red social, el blogger y bloguero de la red social, el blogger y bloguero de la red social, el blogger y bloguero de la red social, el blogger y bloguero de la red social, el blogger y bloguero de la red social, el blogger y bloguero de la red social, el blogger y bloguero de la red social, el blogger y bloguero de la red social, el blogger y bloguero de la red social. Por cierto, los artículos de fmz son muy escasos, es tan útil que está en la guía para principiantes, que solo se entendió preguntando por el post.

La primera es que el usuario puede elegir la hora de inicio y la hora de finalización. Usamos fmz para realizar una función de backtesting de comercio de cuadrícula en línea

Esto necesita ser parametrizado:

Usamos fmz para realizar una función de backtesting de comercio de cuadrícula en línea Si no hay una función que se inicie, entonces no hay una función que se inicie, pero si hay una función que se inicie, entonces no hay una función que se inicie.

self.grid_setting = {
          "min_price": min_price,
          "max_price": max_price,
          "grid_diff": grid_diff,
          "re_diff": grid_diff,
          "total_amount_B": total_amount_B
      }

Parámetros de configuración de la cuadrícula: mínimo, máximo precio, intervalo de distribución de la cuadrícula y intervalo de reinstalación.

Estos son los parámetros que han sido enviados por los usuarios.

La función principal del bus es

    def bus(self):
      params = gen_params(self.begin, self.end, self.currency, self.balance, self.stocks)
      task = VCtx(params)
      done = self.train()
      ret = task.Join(True)
      benefit_cal = self.cal_benefit(ret,done)
      result = {}
      result['done'] = done
      result['ret'] = benefit_cal
      return result
  • Obtenga la configuración de retroceso de fmz con la función gen_params que hemos mencionado
  • Función de entrenamiento de ejecución
  • Basado en la estructura de los datos devueltos por fmz, calcula la rentabilidad y muestra el registro de transacciones

La invocación de task.Join() terminará la tarea de respuesta y devolverá datos de valor neto. El parámetro de unión no se transmite. True indica que se devuelve el resultado de la respuesta original sin analizar, y después de la finalización no se puede volver a llamar a la función relacionada con la transacción o la situación.

A través de la documentación, me refiero a lo que se devuelve como resultado de la estrategia de adivinar.

El código de cálculo de los datos de ganancias que se adjunta a la devolución de fmz

  def cal_benefit(self,ret,done):
      #计算相隔多少天
      day_begin =  datetime.datetime.strptime(self.begin, '%Y-%m-%d %H:%M:%S')
      day_end =  datetime.datetime.strptime(self.end, '%Y-%m-%d %H:%M:%S')
      days = (day_end - day_begin).days
      begin = ret.iloc[0].net
      end = ret.iloc[-1].net
      fee = ret.iloc[-1].fee
      #计算一共多少次套利
      df = pd.DataFrame(done)
      #如果没有成交记录
      if len(done) == 0:
          benefit_cal = {}
          benefit_cal['benefit'] = 0
          benefit_cal['count'] = 0
          benefit_cal['fee'] = 0
          benefit_cal['benefit_p'] = 0
          return benefit_cal

      buy_count = len(df[df['type'] == 'buy'])
      sell_count = len(df[df['type'] == 'sell'])
      count = min(buy_count , sell_count)
      benefit = count * self.grid_diff * float(done[0]['amount'])
      benefit_cal = {}
      benefit_cal['benefit']= benefit
      benefit_cal['count']= count
      benefit_cal['fee']= fee
      print(benefit_cal)
      per = benefit / self.total_amount_B * 360 / days
      print(per)
      benefit_cal['benefit_p']= round( per , 4)
      return benefit_cal

Sí. Me siento un poco desorientado, pero primero quiero hablar de lo que pensamos de nuestra red:

Se realizan mediante el método de la inspección de la ficha

  • Primero inicializa la grilla de acuerdo con los parámetros del usuario
  • Suscribirse por primera vez
  • Revisar periódicamente las transacciones de los listados de compra y venta y volver a colocarlos de acuerdo con los mismos.
          while True:
              Sleep(1000 * 60 * 5)
              if 'refreash_data_finish!' != mid.refreash_data():
                  continue
              # 初始化网格
              if not init_flag:
                  cur_price = mid.ticker['Last']
                  grid_list = grid.cal_grid_list(cur_price)
                  init_flag = True

              # 开始挂单
              if not place_flag:
                  grid.place_orders()
                  place_flag = True

              # 开始检查订单状态及时挂单
              grid.check_order_update()
              done = grid.done

En la actualidad, la mayoría de los bloggers de la red social de noticias de la India están interesados en el tema, y se han convertido en fanáticos de este tema.

La velocidad de respuesta de fmz en 14 días es básicamente suficiente para satisfacer el tiempo de espera de los usuarios en el front-end, y es un poco más lento, es una buena herramienta de respuesta cuantitativa como interfaz, ¡saludo!

Sí, esta vez volvemos a promocionar una ola de competición de comercio, nuestro equipo de Cantificación de Ganancias Infinitas organizó una competición de comercio, participación gratuita. Siempre que todos ofrezcan la API de consulta, pueden inscribirse y tener éxito, como un torneo de dos semanas, también es bueno para ganar nuestro premio.