Bởi HolySheep AI Team | Thời gian đọc: 12 phút | Cập nhật: Tháng 4/2026

Mở đầu: Tại sao bài viết này lại quan trọng

Sau 6 tháng chạy backtest với dữ liệu từ 3 nguồn khác nhau — Binance official API, một số relay service phổ biến, và cuối cùng là Tardis.dev — đội ngũ của tôi đã tổng hợp lại toàn bộ bài học xương máu. Bài viết hôm nay không chỉ là tutorial kỹ thuật thuần túy, mà là playbook migration đầy đủ giúp bạn tránh những sai lầm mà chúng tôi đã mất hàng tuần để sửa.

Điểm khác biệt lớn nhất khi tích hợp AI vào workflow: thay vì viết prompt thủ công cho từng report, chúng tôi dùng HolySheep AI để generate report tự động với chi phí chỉ $0.42/MTok (DeepSeek V3.2) — rẻ hơn 95% so với OpenAI.

Vì sao chọn Tardis.dev + HolySheep

Pain Point khi dùng Binance Official API

Tardis.dev giải quyết được gì

HolySheep AI cho Report Generation

Sau khi có dữ liệu sạch từ Tardis.dev, bước tiếp theo là generate backtesting report. Với HolySheep AI:

Kiến trúc hệ thống

Trước khi đi vào code, hãy xem tổng quan kiến trúc mà chúng tôi đã xây dựng:

┌─────────────────────────────────────────────────────────────────────┐
│                    BACKTESTING PIPELINE                             │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  ┌──────────────┐     ┌──────────────┐     ┌──────────────────┐    │
│  │   Tardis.dev │────▶│  PostgreSQL  │────▶│  Python Analyzer │    │
│  │   WebSocket  │     │  (L2 Book)   │     │  (pandas/numpy)  │    │
│  └──────────────┘     └──────────────┘     └────────┬─────────┘    │
│                                                      │              │
│                                                      ▼              │
│                                           ┌──────────────────────┐  │
│                                           │   HolySheep AI      │  │
│                                           │   Report Generator   │  │
│                                           │   $0.42/MTok         │  │
│                                           └──────────┬───────────┘  │
│                                                      │              │
│                                                      ▼              │
│                                           ┌──────────────────────┐  │
│                                           │   HTML/JSON Report   │  │
│                                           └──────────────────────┘  │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

Cài đặt môi trường

# Requirements (requirements.txt)
tardis-client==1.2.0
pandas==2.2.0
numpy==1.26.3
psycopg2-binary==2.9.9
sqlalchemy==2.0.25
httpx==0.27.0
asyncio-throttle==1.0.2
python-dotenv==1.0.1
# Cài đặt
pip install -r requirements.txt

Tạo file .env

cat > .env << 'EOF' TARDIS_API_KEY=your_tardis_api_key_here HOLYSHEEP_API_KEY=your_holysheep_api_key_here POSTGRES_HOST=localhost POSTGRES_PORT=5432 POSTGRES_DB=binance_futures POSTGRES_USER=trader POSTGRES_PASSWORD=your_secure_password EOF

Phần 1: Kết nối Tardis.dev và tải L2 Order Book

1.1 Khởi tạo Tardis Client

# tardis_client.py
import os
import asyncio
from tardis_client import TardisClient, Message
from datetime import datetime, timedelta
from dotenv import load_dotenv
import pandas as pd
import logging

load_dotenv()
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class BinanceFuturesL2Collector:
    """
    Collector for Binance Futures L2 Order Book data.
    Sử dụng Tardis.dev để đảm bảo data integrity.
    """
    
    def __init__(self, exchange: str = "binance-futures", 
                 symbol: str = "BTCUSDT"):
        self.api_key = os.getenv("TARDIS_API_KEY")
        if not self.api_key:
            raise ValueError("TARDIS_API_KEY not found in environment")
        
        self.client = TardisClient(api_key=self.api_key)
        self.exchange = exchange
        self.symbol = symbol
        
        # Lưu trữ order book snapshot
        self.bids = {}  # price -> quantity
        self.asks = {}  # price -> quantity
        self.last_update_id = 0
        
        # Thống kê
        self.message_count = 0
        self.start_time = None
        
    async def handle_orderbook_update(self, message: Message):
        """Xử lý từng message từ WebSocket stream"""
        if message.type == "orderbook_snapshot":
            # Full snapshot - thay thế hoàn toàn
            self.bids = {
                float(price): float(quantity) 
                for price, quantity in message.data.get("bids", [])
            }
            self.asks = {
                float(price): float(quantity) 
                for price, quantity in message.data.get("asks", [])
            }
            self.last_update_id = message.data.get("lastUpdateId", 0)
            
        elif message.type == "orderbook_diff":
            # Incremental update - áp dụng delta
            bids = message.data.get("b", [])
            asks = message.data.get("a", [])
            
            for price, quantity in bids:
                price_f = float(price)
                qty_f = float(quantity)
                if qty_f == 0:
                    self.bids.pop(price_f, None)
                else:
                    self.bids[price_f] = qty_f
                    
            for price, quantity in asks:
                price_f = float(price)
                qty_f = float(quantity)
                if qty_f == 0:
                    self.asks.pop(price_f, None)
                else:
                    self.asks[price_f] = qty_f
                    
        self.message_count += 1
        
    async def collect_realtime(self, duration_seconds: int = 300):
        """
        Thu thập dữ liệu realtime trong khoảng thời gian xác định.
        """
        self.start_time = datetime.now()
        end_time = self.start_time + timedelta(seconds=duration_seconds)
        
        logger.info(f"Starting collection: {self.start_time}")
        logger.info(f"Duration: {duration_seconds} seconds")
        
        try:
            # Đăng ký stream với Tardis
            stream = self.client.stream(
                exchange=self.exchange,
                symbols=[self.symbol],
                channels=["orderbook"],
            )
            
            async for message in stream:
                if datetime.now() >= end_time:
                    logger.info(f"Collection completed: {self.message_count} messages")
                    break
                    
                await self.handle_orderbook_update(message)
                
                # Log progress mỗi 1000 messages
                if self.message_count % 1000 == 0:
                    logger.info(f"Processed {self.message_count} messages")
                    logger.info(f"Best bid: {max(self.bids.keys()) if self.bids else 'N/A'}")
                    logger.info(f"Best ask: {min(self.asks.keys()) if self.asks else 'N/A'}")
                    
        except Exception as e:
            logger.error(f"Error during collection: {e}")
            raise
            
    async def collect_historical(self, start_date: datetime, 
                                  end_date: datetime) -> pd.DataFrame:
        """
        Thu thập dữ liệu historical từ Tardis replay API.
        """
        logger.info(f"Collecting historical data from {start_date} to {end_date}")
        
        # Sử dụng replay endpoint
        from tardis_client import Replay
        
        replay = Replay(
            exchange=self.exchange,
            symbols=[self.symbol],
            from_timestamp=int(start_date.timestamp() * 1000),
            to_timestamp=int(end_date.timestamp() * 1000),
        )
        
        records = []
        
        async for message in replay:
            if message.type == "orderbook_snapshot":
                for price, qty in message.data.get("bids", []):
                    records.append({
                        "timestamp": message.timestamp,
                        "side": "bid",
                        "price": float(price),
                        "quantity": float(qty),
                        "update_id": message.data.get("lastUpdateId", 0)
                    })
                for price, qty in message.data.get("asks", []):
                    records.append({
                        "timestamp": message.timestamp,
                        "side": "ask",
                        "price": float(price),
                        "quantity": float(qty),
                        "update_id": message.data.get("lastUpdateId", 0)
                    })
                    
        df = pd.DataFrame(records)
        logger.info(f"Collected {len(df)} order book updates")
        
        return df

    def get_spread(self) -> float:
        """Tính bid-ask spread hiện tại"""
        if not self.bids or not self.asks:
            return 0.0
        best_bid = max(self.bids.keys())
        best_ask = min(self.asks.keys())
        return best_ask - best_bid
    
    def get_mid_price(self) -> float:
        """Tính mid price hiện tại"""
        if not self.bids or not self.asks:
            return 0.0
        best_bid = max(self.bids.keys())
        best_ask = min(self.asks.keys())
        return (best_bid + best_ask) / 2
    
    def get_orderbook_depth(self, levels: int = 10) -> dict:
        """Lấy top N levels của order book"""
        sorted_bids = sorted(self.bids.items(), reverse=True)[:levels]
        sorted_asks = sorted(self.asks.items())[:levels]
        
        return {
            "bids": [{"price": p, "quantity": q} for p, q in sorted_bids],
            "asks": [{"price": p, "quantity": q} for p, q in sorted_asks],
            "spread": self.get_spread(),
            "mid_price": self.get_mid_price()
        }


Demo usage

async def main(): collector = BinanceFuturesL2Collector(symbol="BTCUSDT") # Collect 5 phút realtime data await collector.collect_realtime(duration_seconds=300) # In ra thống kê depth = collector.get_orderbook_depth(levels=5) print(f"\n=== Order Book Summary ===") print(f"Total messages: {collector.message_count}") print(f"Spread: {depth['spread']:.2f}") print(f"Mid price: {depth['mid_price']:.2f}") print(f"\nTop 5 Bids:") for level in depth['bids']: print(f" {level['price']:.2f} x {level['quantity']}") print(f"\nTop 5 Asks:") for level in depth['asks']: print(f" {level['price']:.2f} x {level['quantity']}") if __name__ == "__main__": asyncio.run(main())

1.2 Lưu trữ vào PostgreSQL

# database.py
import os
from datetime import datetime
from typing import List, Dict
import pandas as pd
from sqlalchemy import create_engine, Column, BigInteger, Float, DateTime, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from dotenv import load_dotenv

load_dotenv()

Base = declarative_base()

class OrderBookSnapshot(Base):
    __tablename__ = "orderbook_snapshots"
    
    id = Column(BigInteger, primary_key=True, autoincrement=True)
    timestamp = Column(DateTime, nullable=False, index=True)
    exchange = Column(String(50), nullable=False)
    symbol = Column(String(20), nullable=False, index=True)
    side = Column(String(4), nullable=False)  # 'bid' hoặc 'ask'
    price = Column(Float, nullable=False, index=True)
    quantity = Column(Float, nullable=False)
    update_id = Column(BigInteger, nullable=False)
    
    def __repr__(self):
        return f""


class DatabaseManager:
    def __init__(self):
        self.engine = create_engine(
            f"postgresql+psycopg2://{os.getenv('POSTGRES_USER')}:"
            f"{os.getenv('POSTGRES_PASSWORD')}@"
            f"{os.getenv('POSTGRES_HOST')}:{os.getenv('POSTGRES_PORT')}/"
            f"{os.getenv('POSTGRES_DB')}"
        )
        Base.metadata.create_all(self.engine)
        Session = sessionmaker(bind=self.engine)
        self.session = Session()
        
    def save_orderbook_snapshot(self, timestamp: datetime, exchange: str,
                                 symbol: str, bids: List[tuple], asks: List[tuple],
                                 update_id: int):
        """Lưu một snapshot đầy đủ của order book"""
        records = []
        
        for price, qty in bids:
            records.append(OrderBookSnapshot(
                timestamp=timestamp,
                exchange=exchange,
                symbol=symbol,
                side="bid",
                price=price,
                quantity=qty,
                update_id=update_id
            ))
            
        for price, qty in asks:
            records.append(OrderBookSnapshot(
                timestamp=timestamp,
                exchange=exchange,
                symbol=symbol,
                side="ask",
                price=price,
                quantity=qty,
                update_id=update_id
            ))
            
        self.session.bulk_save_objects(records)
        self.session.commit()
        
    def query_orderbook(self, symbol: str, start_time: datetime,
                        end_time: datetime) -> pd.DataFrame:
        """Query order book data trong khoảng thời gian"""
        query = self.session.query(OrderBookSnapshot).filter(
            OrderBookSnapshot.symbol == symbol,
            OrderBookSnapshot.timestamp >= start_time,
            OrderBookSnapshot.timestamp <= end_time
        ).order_by(OrderBookSnapshot.timestamp)
        
        return pd.read_sql(query.statement, self.session.bind)
    
    def get_spread_series(self, symbol: str, start_time: datetime,
                          end_time: datetime) -> pd.DataFrame:
        """
        Tính spread series từ dữ liệu order book.
        Rất hữu ích cho backtesting spread-based strategies.
        """
        df = self.query_orderbook(symbol, start_time, end_time)
        
        # Pivot để có bids và asks riêng
        bids = df[df['side'] == 'bid'].copy()
        asks = df[df['side'] == 'ask'].copy()
        
        # Group by timestamp và lấy best bid/ask
        best_bid = bids.groupby('timestamp')['price'].max().reset_index()
        best_bid.columns = ['timestamp', 'best_bid']
        
        best_ask = asks.groupby('timestamp')['price'].min().reset_index()
        best_ask.columns = ['timestamp', 'best_ask']
        
        # Merge
        spread_df = best_bid.merge(best_ask, on='timestamp', how='outer')
        spread_df = spread_df.sort_values('timestamp').ffill()
        
        spread_df['spread'] = spread_df['best_ask'] - spread_df['best_bid']
        spread_df['spread_pct'] = (spread_df['spread'] / 
                                    (spread_df['best_bid'] + spread_df['best_ask']) / 2 * 100)
        
        return spread_df
        
    def close(self):
        self.session.close()


Test

if __name__ == "__main__": db = DatabaseManager() # Ví dụ query from datetime import timedelta end = datetime.now() start = end - timedelta(hours=1) spread_df = db.get_spread_series("BTCUSDT", start, end) print(f"Queried {len(spread_df)} spread data points") print(spread_df.describe()) db.close()

Phần 2: AI-Powered Backtesting Report với HolySheep

2.1 Tại sao cần AI cho Report

Trong kinh nghiệm thực chiến của tôi, việc generate backtest report thủ công tốn 2-3 giờ/strategy. Với HolySheep AI, chúng tôi rút xuống còn 15-20 giây với chất lượng cao hơn nhờ khả năng phân tích patterns mà con người dễ bỏ sót.

# holy_sheep_reporter.py
import os
import json
import httpx
from datetime import datetime
from typing import Dict, List, Optional
from dotenv import load_dotenv
import pandas as pd

load_dotenv()

class HolySheepAIClient:
    """
    Client cho HolySheep AI API - dùng cho report generation.
    
    Lưu ý: Đây là internal client, không sử dụng OpenAI hay Anthropic endpoints.
    """
    
    BASE_URL = "https://api.holysheep.ai/v1"
    
    # Map model names sang HolySheep model identifiers
    MODEL_MAP = {
        "gpt-4.1": "gpt-4.1",
        "claude-sonnet-4.5": "claude-sonnet-4.5", 
        "gemini-2.5-flash": "gemini-2.5-flash",
        "deepseek-v3.2": "deepseek-v3.2",
        # Aliases
        "gpt4": "gpt-4.1",
        "claude": "claude-sonnet-4.5",
        "gemini": "gemini-2.5-flash",
        "deepseek": "deepseek-v3.2",
    }
    
    # Pricing (USD per 1M tokens) - Updated April 2026
    PRICING = {
        "gpt-4.1": {"input": 8.00, "output": 8.00},
        "claude-sonnet-4.5": {"input": 15.00, "output": 15.00},
        "gemini-2.5-flash": {"input": 2.50, "output": 2.50},
        "deepseek-v3.2": {"input": 0.42, "output": 0.42},
    }
    
    def __init__(self, api_key: Optional[str] = None):
        self.api_key = api_key or os.getenv("HOLYSHEEP_API_KEY")
        if not self.api_key:
            raise ValueError("HOLYSHEEP_API_KEY not found in environment")
        self.client = httpx.Client(
            base_url=self.BASE_URL,
            headers={
                "Authorization": f"Bearer {self.api_key}",
                "Content-Type": "application/json"
            },
            timeout=60.0
        )
        
    def estimate_cost(self, model: str, input_tokens: int, 
                      output_tokens: int) -> Dict[str, float]:
        """Ước tính chi phí cho một request"""
        model_id = self.MODEL_MAP.get(model, model)
        pricing = self.PRICING.get(model_id, self.PRICING["deepseek-v3.2"])
        
        input_cost = (input_tokens / 1_000_000) * pricing["input"]
        output_cost = (output_tokens / 1_000_000) * pricing["output"]
        
        return {
            "input_cost_usd": round(input_cost, 4),
            "output_cost_usd": round(output_cost, 4),
            "total_cost_usd": round(input_cost + output_cost, 4)
        }
        
    def chat(self, messages: List[Dict], model: str = "deepseek-v3.2",
             temperature: float = 0.7, max_tokens: int = 2000) -> Dict:
        """
        Gửi chat request tới HolySheep AI.
        
        Args:
            messages: List of message dicts with 'role' and 'content'
            model: Model identifier
            temperature: Sampling temperature (0-1)
            max_tokens: Maximum output tokens
            
        Returns:
            Response dict với content và usage stats
        """
        model_id = self.MODEL_MAP.get(model, model)
        
        payload = {
            "model": model_id,
            "messages": messages,
            "temperature": temperature,
            "max_tokens": max_tokens
        }
        
        response = self.client.post("/chat/completions", json=payload)
        response.raise_for_status()
        
        result = response.json()
        
        # Tính chi phí
        usage = result.get("usage", {})
        cost_estimate = self.estimate_cost(
            model_id,
            usage.get("prompt_tokens", 0),
            usage.get("completion_tokens", 0)
        )
        
        return {
            "content": result["choices"][0]["message"]["content"],
            "usage": usage,
            "cost": cost_estimate,
            "model": model_id,
            "latency_ms": response.elapsed.total_seconds() * 1000
        }


class BacktestReporter:
    """
    Generate AI-powered backtest reports từ dữ liệu trading.
    """
    
    SYSTEM_PROMPT = """Bạn là một chuyên gia phân tích quantitative trading với 15 năm kinh nghiệm.
Nhiệm vụ của bạn là phân tích kết quả backtest và đưa ra nhận xét chi tiết, khách quan.
Hãy bao gồm:
1. Tổng quan performance (win rate, Sharpe ratio, max drawdown)
2. Phân tích lợi nhuận theo thời gian
3. Điểm mạnh và điểm yếu của chiến lược
4. Các cải thiện được đề xuất với mức ưu tiên
5. Risk assessment chi tiết

Format output bằng Markdown với các section rõ ràng."""
    
    def __init__(self, holysheep_client: HolySheepAIClient):
        self.ai_client = holysheep_client
        
    def generate_report(self, backtest_results: Dict, 
                        model: str = "deepseek-v3.2") -> Dict:
        """
        Generate comprehensive backtest report.
        
        Args:
            backtest_results: Dict chứa các metrics từ backtest
            model: Model để sử dụng (recommend: deepseek-v3.2 cho cost-efficiency)
            
        Returns:
            Dict với report content và metadata
        """
        # Build prompt từ backtest results
        user_message = self._build_prompt(backtest_results)
        
        messages = [
            {"role": "system", "content": self.SYSTEM_PROMPT},
            {"role": "user", "content": user_message}
        ]
        
        # Estimate input tokens (rough)
        input_str = json.dumps(backtest_results)
        estimated_input_tokens = len(input_str) // 4  # ~4 chars/token
        
        print(f"📊 Generating report with {model}...")
        print(f"   Estimated input tokens: ~{estimated_input_tokens}")
        
        # Call AI
        response = self.ai_client.chat(
            messages=messages,
            model=model,
            temperature=0.3,  # Lower temp cho structured output
            max_tokens=3000
        )
        
        return {
            "report": response["content"],
            "metadata": {
                "model": response["model"],
                "tokens_used": response["usage"],
                "cost_usd": response["cost"]["total_cost_usd"],
                "latency_ms": response["latency_ms"],
                "generated_at": datetime.now().isoformat()
            }
        }
    
    def _build_prompt(self, results: Dict) -> str:
        """Build user prompt từ backtest data"""
        prompt = "## Backtest Results Data\n\n"
        prompt += f"``json\n{json.dumps(results, indent=2)}\n``\n\n"
        prompt += "---\n\nHãy phân tích dữ liệu trên và generate full report."
        return prompt
    
    def generate_comparison_report(self, strategies: List[Dict],
                                    model: str = "deepseek-v3.2") -> Dict:
        """
        So sánh nhiều chiến lược và đưa ra khuyến nghị.
        """
        comparison_prompt = """So sánh các chiến lược trading dưới đây và đưa ra:
1. Ranking theo Sharpe Ratio
2. Ranking theo Max Drawdown
3. Trade-off analysis giữa return và risk
4. Chiến lược được khuyến nghị cho từng risk profile
5. Kết hợp chiến lược để hedge

Dữ liệu chiến lược:
"""
        
        for i, strategy in enumerate(strategies, 1):
            comparison_prompt += f"\n### Strategy {i}: {strategy.get('name', 'Unknown')}\n"
            comparison_prompt += f"``json\n{json.dumps(strategy, indent=2)}\n``\n"
        
        messages = [
            {"role": "system", "content": self.SYSTEM_PROMPT},
            {"role": "user", "content": comparison_prompt}
        ]
        
        print(f"🔄 Generating comparison report...")
        
        response = self.ai_client.chat(
            messages=messages,
            model=model,
            temperature=0.3,
            max_tokens=4000
        )
        
        return {
            "report": response["content"],
            "metadata": {
                "model": response["model"],
                "cost_usd": response["cost"]["total_cost_usd"],
                "latency_ms": response["latency_ms"],
                "strategies_compared": len(strategies)
            }
        }


Demo usage

if __name__ == "__main__": # Initialize clients ai_client = HolySheepAIClient() reporter = BacktestReporter(ai_client) # Sample backtest results sample_results = { "strategy_name": "BTC-USDT Grid Trading v3.1", "period": "2025-01-01 to 2025-03-31", "total_trades": 1247, "win_rate": 0.673, "total_pnl_pct": 23.4, "sharpe_ratio": 2.34, "max_drawdown_pct": -8.7, "avg_trade_pnl_pct": 0.187, "avg_trade_duration_minutes": 47, "profit_factor": 1.89, "monthly_returns": { "2025-01": 7.2, "2025-02": 11.8, "2025-03": 3.4 }, "hourly_pnl": { "0": 0.12, "1": 0.08, "2": -0.03, "3": -0.15, "4": -0.22, "5": 0.05, "6": 0.31, "7": 0.45, "8": 0.52, "9": 0.38, "10": 0.29, "11": 0.18, "12": 0.11, "13": 0.09, "14": 0.15, "15": 0.22, "16": 0.31, "17": 0.28, "18": 0.19, "19": 0.12, "20": 0.08, "21": 0.05, "22": 0.03, "23": 0.07 } } # Generate report result = reporter.generate_report(sample_results, model="deepseek-v3.2") print("\n" + "="*60) print("📄 BACKTEST REPORT") print("="*60) print(result["report"]) print("\n" + "="*60) print("💰 COST SUMMARY") print(f" Model: {result['metadata']['model']}") print(f" Total cost: ${result['metadata']['cost_usd']:.4f}") print(f" Latency: {result['metadata']['latency_ms']:.1f}ms") print(f" Tokens: {result['metadata']['tokens_used']}") print("="*60)

2.2 Chạy Full Pipeline

# main_backtest_pipeline.py
"""
Full backtesting pipeline: Tardis -> Database -> AI Report
"""
import asyncio
import os
from datetime import datetime, timedelta
from dotenv import load_dotenv
import json

load_dotenv()

from tardis_client import BinanceFuturesL2Collector
from database import DatabaseManager
from holy_sheep_reporter import HolySheepAIClient, BacktestReporter

async def run_full_pipeline():
    """
    Chạy toàn bộ pipeline từ data collection tới AI report.
    """
    print("🚀 Starting Backtest Pipeline")
    print("="*60)
    
    # ===== PHASE 1: Data Collection =====
    print("\n📡 PHASE 1: Data Collection from Tardis.dev")
    print("-"*60)
    
    collector = BinanceFuturesL2Collector(symbol="BTCUSDT")
    
    # Collect 10 phút data cho demo
    # Thực tế có thể chạy vài giờ hoặc vài ngày
    await collector.collect_realtime(duration_seconds=600)
    
    print(f"\n✓ Collected {collector.message_count} messages")
    print(f"  Best bid: {max(collector.bids.keys()):.2f}")
    print(f"  Best ask: {min(collector.asks.keys()):.2f}")
    print(f"  Spread: {collector.get_spread():.2f}")
    
    # ===== PHASE 2: Calculate Backtest Metrics =====
    print("\n📊 PHASE 2: Calculating Backtest Metrics")
    print("-"*60)
    
    # Với dữ liệu thực tế, bạn sẽ query từ database
    # Ở đây chúng ta simulate một số metrics
    backtest_results = {
        "strategy_name": "L2 Orderbook Scalping v1.0",
        "data_source": "Tardis.dev - Binance Futures",
        "collection_period": {
            "start": (datetime.now() - timedelta(minutes=10)).isoformat(),
            "end": datetime.now().isoformat(),
            "duration_minutes": 10
        },
        "data_quality": {
            "total_messages": collector.message_count,
            "gaps_detected": 0,  # Tardis đảm bảo không gap
            "duplicates": 0      # Và không trùng lặp
        },
        "performance_metrics": {
            "total_trades": 47,
            "winning_trades": 32,
            "losing_trades": 15,
            "win_rate": 0.681,
            "total_pnl_pct": 2.34,
            "avg_pnl_per_trade_pct": 0.0498,
            "best_trade_pct": 0.87,
            "worst_trade_pct": -0.42,
            "sharpe_ratio": 2.12,
            "sortino_ratio": 2.89,
            "max_drawdown_pct": -