|
|
@@ -8,11 +8,8 @@ import numpy as np
|
|
|
from logger_config import logger
|
|
|
|
|
|
# 假设我们有一个数据流,订单簿和成交数据
|
|
|
-order_book_snapshots = deque(maxlen=600) # 存储过去600个订单簿快照
|
|
|
-
|
|
|
-# 数据积累的阈值
|
|
|
-DATA_THRESHOLD = 20
|
|
|
-messages = queue.Queue() # 创建一个线程安全队列
|
|
|
+order_book_snapshots = deque(maxlen=600) # 存储过去600个订单簿快照
|
|
|
+trade_snapshots = deque(maxlen=6000) # 存储过去6000个成交数据
|
|
|
|
|
|
stop_event = threading.Event()
|
|
|
|
|
|
@@ -22,7 +19,19 @@ A_initial = 1.0
|
|
|
|
|
|
# 假设S0是初始的参考价格
|
|
|
S0 = -1
|
|
|
-sigma = 0.2 # 假设一个波动率
|
|
|
+
|
|
|
+
|
|
|
+def on_message_trade(_ws, message):
|
|
|
+ global trade_snapshots
|
|
|
+ json_message = json.loads(message)
|
|
|
+ trade = {
|
|
|
+ 'price': float(json_message['data']['p']),
|
|
|
+ 'qty': float(json_message['data']['q']),
|
|
|
+ 'timestamp': pd.to_datetime(json_message['data']['T'], unit='ms'),
|
|
|
+ 'side': 'sell' if json_message['data']['m'] else 'buy'
|
|
|
+ }
|
|
|
+ trade_snapshots.append(trade)
|
|
|
+ process_depth_data()
|
|
|
|
|
|
|
|
|
def on_message_depth(_ws, message):
|
|
|
@@ -36,9 +45,7 @@ def on_message_depth(_ws, message):
|
|
|
'asks': asks,
|
|
|
'timestamp': timestamp
|
|
|
})
|
|
|
-
|
|
|
- if len(order_book_snapshots) >= DATA_THRESHOLD:
|
|
|
- process_depth_data(order_book_snapshots)
|
|
|
+ process_depth_data()
|
|
|
|
|
|
|
|
|
def calculate_phi(prices, k, S0):
|
|
|
@@ -84,14 +91,16 @@ def estimate_lambda(waiting_times, T):
|
|
|
waiting_times = np.array(waiting_times)
|
|
|
|
|
|
sum_indicator = np.sum(waiting_times < T)
|
|
|
- sum_waiting_times = np.sum(waiting_times)
|
|
|
+ sum_waiting_times = int(np.sum(waiting_times).total_seconds() * 1000)
|
|
|
lambda_hat = sum_indicator / sum_waiting_times
|
|
|
return lambda_hat
|
|
|
|
|
|
|
|
|
-def process_depth_data(order_book_snapshots):
|
|
|
- # 数据预热,至少10条数据才能用于计算
|
|
|
- if len(order_book_snapshots) < 10:
|
|
|
+def process_depth_data():
|
|
|
+ global order_book_snapshots, trade_snapshots
|
|
|
+
|
|
|
+ # 数据预热,至少10条深度数据以及100条成交数据才能用于计算
|
|
|
+ if len(order_book_snapshots) < 10 and len(trade_snapshots) < 100:
|
|
|
return
|
|
|
|
|
|
global k_initial, A_initial, S0
|
|
|
@@ -100,23 +109,26 @@ def process_depth_data(order_book_snapshots):
|
|
|
if S0 < 0:
|
|
|
S0 = S_values[0]
|
|
|
|
|
|
+ # ========================= 计算 log(∫ φ(k, ξ) dξ) ==================
|
|
|
# 提取时间戳并计算时间间隔
|
|
|
- timestamps = [snapshot['timestamp'] for snapshot in order_book_snapshots]
|
|
|
- order_book_time_points = [(timestamp - timestamps[0]).total_seconds() for timestamp in timestamps]
|
|
|
+ order_book_timestamps = [snapshot['timestamp'] for snapshot in order_book_snapshots]
|
|
|
+ order_book_time_points = [(timestamp - order_book_timestamps[0]).total_seconds() for timestamp in order_book_timestamps]
|
|
|
|
|
|
# 计算 ∫ φ(k, ξ) dξ
|
|
|
integral_phi_value = calculate_integral_phi(S_values, k_initial, S0, order_book_time_points)
|
|
|
|
|
|
# 计算 log(∫ φ(k, ξ) dξ)
|
|
|
log_integral_phi_value = np.log(integral_phi_value)
|
|
|
- logger.info("log(∫ φ(k, ξ) dξ) 的值: " + str(log_integral_phi_value))
|
|
|
|
|
|
+ # ========================== 估计 λ(δ) ==============================
|
|
|
# 计算等待时间
|
|
|
- waiting_times = [order_book_time_points[i] - order_book_time_points[i - 1] for i in range(1, len(order_book_time_points))]
|
|
|
- T = 0.25 # 时间窗口的大小
|
|
|
+ trade_timestamps = [snapshot['timestamp'] for snapshot in trade_snapshots]
|
|
|
+ waiting_times = [trade_timestamps[i] - trade_timestamps[i - 1] for i in range(1, len(trade_timestamps))]
|
|
|
+ # 时间窗口的大小
|
|
|
+ T = pd.to_datetime(100, unit='ms') - pd.to_datetime(0, unit='ms')
|
|
|
|
|
|
- # 估计 λ(δ)
|
|
|
lambda_hat = estimate_lambda(waiting_times, T)
|
|
|
+ # logger.info("λ(δ) 的值: " + str(lambda_hat) + "log(∫ φ(k, ξ) dξ) 的值: " + str(log_integral_phi_value))
|
|
|
log_lambda_hat_value = np.log(lambda_hat)
|
|
|
- logger.info("log(λ(δ)) 的值: " + str(log_lambda_hat_value))
|
|
|
+ logger.info("log(λ(δ)) 的值: " + str(log_lambda_hat_value) + "log(∫ φ(k, ξ) dξ) 的值: " + str(log_integral_phi_value))
|
|
|
|