predictor_new.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. import time
  2. from decimal import Decimal
  3. import utils
  4. from util.instant_volatility import InstantVolatilityIndicator
  5. from util.trading_intensity import TradingIntensityIndicator
  6. class PredictorNew:
  7. '''
  8. reference
  9. '''
  10. def __init__(self, ref_name=["Unknown Market"], alpha=[1.0 for _ in range(99)], gamma=0.999):
  11. self.loop = 0
  12. self.arr = []
  13. self.trade_mp_series = []
  14. self.ref_mp_series = []
  15. self.ref_num = len(ref_name)
  16. ### 定价
  17. self.window = 10
  18. ### 价格系数
  19. self.alpha = alpha
  20. # 参考
  21. print('定价系数:', gamma)
  22. self.gamma = gamma
  23. self.avg_spread = [None for _ in range(self.ref_num)]
  24. self.vol = InstantVolatilityIndicator(sampling_length=100, processing_length=1)
  25. self.trading_intensity = TradingIntensityIndicator(sampling_length=20)
  26. def processer(self):
  27. '''
  28. 计算任务
  29. '''
  30. # update trade mp
  31. bp = self.arr[-1][utils.BP_INDEX]
  32. ap = self.arr[-1][utils.AP_INDEX]
  33. mp = (bp + ap) * 0.5
  34. self.trade_mp_series.append(mp)
  35. # 更新参考盘口mp
  36. ref_mp = []
  37. for i in range(self.ref_num):
  38. bp = self.arr[-1][utils.LEN * (1 + i) + utils.BP_INDEX]
  39. ap = self.arr[-1][utils.LEN * (1 + i) + utils.AP_INDEX]
  40. mp = (bp + ap) * 0.5
  41. ref_mp.append(mp)
  42. self.ref_mp_series.append(ref_mp)
  43. # 偏差计算
  44. self._update_avg_spread()
  45. def _update_avg_spread(self):
  46. '''
  47. 更新平均偏差
  48. '''
  49. # 计算偏差1
  50. for i in range(self.ref_num):
  51. bias = self.ref_mp_series[-1][i] * self.alpha[i] - self.trade_mp_series[-1]
  52. # 如果是刚启动 gamma不能太大
  53. if self.loop < 100:
  54. gamma = 0.9
  55. else:
  56. gamma = self.gamma
  57. if self.avg_spread[i] == None:
  58. self.avg_spread[i] = bias
  59. else:
  60. self.avg_spread[i] = self.avg_spread[i] * gamma + bias * (1 - gamma)
  61. def check_length(self):
  62. # 行情缓存
  63. if len(self.arr) > self.window: del (self.arr[0])
  64. if len(self.trade_mp_series) > self.window: del (self.trade_mp_series[0])
  65. if len(self.ref_mp_series) > self.window: del (self.ref_mp_series[0])
  66. # @utils.timeit
  67. def onTime(self, data):
  68. if isinstance(data, list):
  69. if len(data) > 0:
  70. self.loop += 1
  71. self.arr.append(data)
  72. self.processer()
  73. self.check_length()
  74. else:
  75. print("行情数据为空")
  76. else:
  77. print("行情数据为None")
  78. def market_update(self, best_mid_price, time_num):
  79. self.vol.add_sample(best_mid_price)
  80. self.trading_intensity.calculate(best_mid_price, time_num)
  81. # @utils.timeit
  82. # def Get_ref(self, ref_ticker):
  83. # '''
  84. # get ref price
  85. # '''
  86. # ref_mid = []
  87. # for i in range(self.ref_num):
  88. # ref_mid.append(
  89. # [ref_ticker[i][0] * self.alpha[i] - self.avg_spread[i],
  90. # ref_ticker[i][1] * self.alpha[i] - self.avg_spread[i]]
  91. # )
  92. # return ref_mid
  93. def Get_ref(self, ref_ticker):
  94. '''
  95. get ref price
  96. '''
  97. bp = ref_ticker[0][0]
  98. ap = ref_ticker[0][1]
  99. mp = Decimal((bp + ap) * 0.5)
  100. std = self.vol.current_value
  101. gamma = Decimal(0.5)
  102. alpha, kappa = self.trading_intensity.current_value
  103. ref_mid = []
  104. if alpha != 0 and kappa > 0 and std != 0:
  105. factor = Decimal(1) + gamma / kappa
  106. _optimal_spread = gamma * std
  107. _optimal_spread += 2 * factor.ln()
  108. _optimal_ask = mp + _optimal_spread / 2
  109. _optimal_bid = mp - _optimal_spread / 2
  110. ref_mid.append(
  111. [_optimal_ask,
  112. _optimal_bid]
  113. )
  114. return ref_mid
  115. if __name__ == "__main__":
  116. import pandas as pd
  117. import matplotlib
  118. matplotlib.use('TkAgg')
  119. import matplotlib.pyplot as plt
  120. arr = pd.read_csv('history/ftm_usdt_binance_usdt_swap.csv').values.tolist()
  121. def line_data_to_tickers(data, ref_num):
  122. ref_tickers = []
  123. for i in range(ref_num):
  124. ref_tickers.append([data[utils.LEN * (i + 1) + utils.BP_INDEX], data[utils.LEN * (i + 1) + utils.AP_INDEX]])
  125. return ref_tickers
  126. ref_num = len(arr[0]) // utils.LEN - 1
  127. p = PredictorNew(ref_name=["unkwon" for _ in range(ref_num)])
  128. t = []
  129. ref_index = 1
  130. for data in arr:
  131. p.onTime(data)
  132. trade_mp = (data[utils.BP_INDEX] + data[utils.AP_INDEX]) * 0.5
  133. ref_price = p.Get_ref(line_data_to_tickers(data, ref_num))
  134. t.append([
  135. trade_mp,
  136. (ref_price[ref_index][0] + ref_price[ref_index][1]) * 0.5,
  137. ])
  138. t = pd.DataFrame(t, columns=['mp', 'ref'])
  139. if 1:
  140. plt.figure()
  141. plt.plot(t['mp'], 'k')
  142. plt.plot(t['ref'], 'g')
  143. plt.grid()
  144. plt.show()