NautilusTrainer / tests /mock_data.py
Nautilus AI
Deploy: Trainer to Root (Retry)
c5c085b
import pandas as pd
import numpy as np
import time
from typing import List, Dict
class MockDataGenerator:
"""Generates synthetic L2 Orderbook and Trade data for testing."""
@staticmethod
def generate_l2_snapshot(num_rows: int = 100, levels: int = 20) -> pd.DataFrame:
"""
Generates a DataFrame mimicking the L2 Snapshot structure.
Columns: ts_event, instrument_id, bids, asks
"""
base_price = 2000.0
data = []
start_time = time.time() * 1000
for i in range(num_rows):
ts = start_time + i * 1000 # 1 sec intervals
# Random Walk Price
noise = np.random.normal(0, 1)
mid_price = base_price + noise
base_price = mid_price
# Generate Levels
bids = []
asks = []
for l in range(levels):
spread = (l + 1) * 0.5
bid_p = mid_price - spread
ask_p = mid_price + spread
bid_sz = abs(np.random.normal(10, 5)) + 1
ask_sz = abs(np.random.normal(10, 5)) + 1
bids.append([bid_p, bid_sz])
asks.append([ask_p, ask_sz])
data.append({
"ts_event": ts,
"instrument_id": "ETH-USD",
"bids": bids, # List of lists format
"asks": asks
})
return pd.DataFrame(data)
@staticmethod
def generate_trades(num_rows: int = 100) -> pd.DataFrame:
"""
Generates synthetic trade data.
Columns: time, coin, px, sz, side
"""
base_price = 2000.0
data = []
start_time = time.time() * 1000
for i in range(num_rows):
ts = start_time + i * 500
px = base_price + np.random.normal(0, 1)
sz = abs(np.random.normal(1, 0.5))
side = 'B' if np.random.random() > 0.5 else 'A'
data.append({
"time": ts,
"coin": "ETH",
"px": px,
"sz": sz,
"side": side
})
return pd.DataFrame(data)