Trong lĩnh vực quant trading, việc backtest chiến lược giao dịch trên dữ liệu perpetual futures đòi hỏi kết hợp nhiều nguồn dữ liệu khác nhau. Bài viết này sẽ hướng dẫn chi tiết cách sử dụng HolySheep AI làm proxy để kết nối với Tardis — dịch vụ cung cấp dữ liệu crypto theo thời gian thực, đồng thời tối ưu chi phí thông qua caching và xử lý rate limiting thông minh.

Bảng so sánh: HolySheep vs API chính thức vs Relay Services

Tiêu chí HolySheep AI API chính thức (OpenAI/Anthropic) Other Relay Services
Giá GPT-4.1 $8/MTok $60/MTok $15-25/MTok
Giá Claude Sonnet 4.5 $15/MTok $45/MTok $20-30/MTok
DeepSeek V3.2 $0.42/MTok Không hỗ trợ $1-2/MTok
Độ trễ trung bình <50ms 100-300ms 80-150ms
Thanh toán WeChat/Alipay/VNPay Thẻ quốc tế Thẻ quốc tế
Cache thông minh Không Ít khi
Tỷ giá ¥1 = $1 Đô la Mỹ Đô la Mỹ

Tardis Data API — Nguồn dữ liệu perpetual futures

Tardis cung cấp historical market data cho perpetual futures với độ chi tiết cao. Tuy nhiên, API chính thức có một số hạn chế về rate limit và chi phí khi cần xử lý khối lượng lớn historical data cho việc factor backtesting.

Cài đặt môi trường và cấu hình

# Cài đặt các thư viện cần thiết
pip install tardis-sdk requests python-dotenv redis aiohttp asyncio

Tạo file .env

cat > .env << 'EOF' TARDIS_API_KEY=your_tardis_api_key HOLYSHEEP_API_KEY=your_holysheep_key REDIS_HOST=localhost REDIS_PORT=6379 EOF

Khởi động Redis để caching

docker run -d -p 6379:6379 redis:alpine

Factor Backtesting Pipeline hoàn chỉnh

# factor_backtest.py
import os
import json
import time
import hashlib
import requests
import redis
from datetime import datetime, timedelta
from typing import List, Dict, Optional
import numpy as np

============ CẤU HÌNH HOLYSHEEP ============

HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1" HOLYSHEEP_API_KEY = os.getenv("HOLYSHEEP_API_KEY")

============ CACHE LAYER ============

class SmartCache: def __init__(self, redis_host='localhost', redis_port=6379, ttl=3600): self.redis_client = redis.Redis( host=redis_host, port=redis_port, decode_responses=True ) self.ttl = ttl print(f"✅ SmartCache initialized - TTL: {ttl}s") def _make_key(self, prefix: str, data: dict) -> str: """Tạo cache key deterministic""" raw = json.dumps(data, sort_keys=True) hash_val = hashlib.sha256(raw.encode()).hexdigest()[:16] return f"{prefix}:{hash_val}" def get(self, prefix: str, params: dict) -> Optional[dict]: key = self._make_key(prefix, params) cached = self.redis_client.get(key) if cached: print(f"📦 Cache HIT: {prefix}") return json.loads(cached) return None def set(self, prefix: str, params: dict, data: dict): key = self._make_key(prefix, params) self.redis_client.setex(key, self.ttl, json.dumps(data)) print(f"💾 Cache SET: {prefix} (TTL: {self.ttl}s)")

============ HOLYSHEEP API CLIENT ============

class HolySheepClient: def __init__(self, api_key: str): self.api_key = api_key self.base_url = HOLYSHEEP_BASE_URL self.cache = SmartCache(ttl=7200) # Cache AI responses 2h def generate_factor_signals(self, price_data: List[dict], factor_type: str = "momentum") -> dict: """ Sử dụng AI để phân tích và tạo factor signals từ price data Chi phí: DeepSeek V3.2 chỉ $0.42/MTok - tiết kiệm 85%+ """ # Check cache trước cache_params = { "factor_type": factor_type, "data_hash": hashlib.md5( json.dumps(price_data[:100]).encode() ).hexdigest() } cached = self.cache.get("factor_signal", cache_params) if cached: return cached prompt = f"""Analyze this perpetual futures price data and generate {factor_type} factor signals. Return JSON with: - signal: 1 (bullish), -1 (bearish), 0 (neutral) - confidence: 0-1 - reasoning: brief explanation Data sample: {price_data[:50]}""" start = time.time() response = requests.post( f"{self.base_url}/chat/completions", headers={ "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json" }, json={ "model": "deepseek-v3.2", "messages": [{"role": "user", "content": prompt}], "temperature": 0.3 }, timeout=30 ) latency = (time.time() - start) * 1000 if response.status_code == 200: result = response.json() ai_response = result['choices'][0]['message']['content'] signal_data = { "raw_response": ai_response, "latency_ms": round(latency, 2), "model": "deepseek-v3.2", "cost_estimate": "$0.000042" # ~100 tokens } self.cache.set("factor_signal", cache_params, signal_data) print(f"⚡ HolySheep response: {latency:.2f}ms") return signal_data raise Exception(f"HolySheep API Error: {response.status_code}")

============ TARDIS DATA FETCHER ============

class TardisDataFetcher: def __init__(self, api_key: str): self.api_key = api_key self.base_url = "https://api.tardis.dev/v1" self.cache = SmartCache(ttl=1800) self.rate_limit_remaining = 100 self.last_request_time = 0 self.min_request_interval = 0.1 # 100ms between requests def _rate_limit_wait(self): """Hạn chế rate limit - tuân thủ Tardis API constraints""" now = time.time() elapsed = now - self.last_request_time if elapsed < self.min_request_interval: wait_time = self.min_request_interval - elapsed print(f"⏳ Rate limit wait: {wait_time*1000:.0f}ms") time.sleep(wait_time) self.last_request_time = time.time() def fetch_perpetual_candles(self, exchange: str, symbol: str, start_date: str, end_date: str) -> List[dict]: """ Fetch historical candle data từ Tardis Hỗ trợ: Binance, Bybit, OKX, Hyperliquid... """ cache_params = { "exchange": exchange, "symbol": symbol, "start": start_date, "end": end_date } # Check cache cached = self.cache.get("candles", cache_params) if cached: return cached["data"] self._rate_limit_wait() url = f"{self.base_url}/historical/candles" params = { "exchange": exchange, "symbol": symbol, "dateFrom": start_date, "dateTo": end_date, "limit": 1000 } headers = {"Authorization": f"Bearer {self.api_key}"} all_data = [] page = 1 while True: print(f"📥 Fetching page {page}...") response = requests.get( url, params={**params, "page": page}, headers=headers, timeout=60 ) if response.status_code == 429: print("⚠️ Rate limit hit - waiting 60s...") time.sleep(60) continue if response.status_code != 200: raise Exception(f"Tardis API Error: {response.status_code}") data = response.json() if not data.get("data"): break all_data.extend(data["data"]) if not data.get("hasMore"): break page += 1 time.sleep(0.5) # Be nice to API result = {"data": all_data, "count": len(all_data)} self.cache.set("candles", cache_params, result) return all_data

============ FACTOR COMPUTATION ============

class FactorBacktester: def __init__(self, holy_sheep_client: HolySheepClient): self.ai_client = holy_sheep_client self.results = [] def compute_momentum_factor(self, candles: List[dict], lookback: int = 20) -> List[dict]: """Tính toán momentum factor từ candle data""" factors = [] for i in range(lookback, len(candles)): window = candles[i-lookback:i+1] closes = [c["close"] for c in window] volumes = [c["volume"] for c in window] # Momentum = % thay đổi giá momentum = (closes[-1] - closes[0]) / closes[0] * 100 # Volume momentum vol_change = (sum(volumes[-5:]) - sum(volumes[:5])) / sum(volumes[:5]) factor = { "timestamp": window[-1]["timestamp"], "symbol": candles[i].get("symbol"), "momentum": momentum, "volume_momentum": vol_change, "close": closes[-1] } factors.append(factor) return factors def generate_ai_signals(self, factors: List[dict]) -> List[dict]: """ Sử dụng HolySheep AI để enhance factor signals Chi phí cực thấp với DeepSeek V3.2 """ enhanced_factors = [] # Batch xử lý để tiết kiệm API calls batch_size = 50 for i in range(0, len(factors), batch_size): batch = factors[i:i+batch_size] print(f"🧠 Processing batch {i//batch_size + 1}...") # Gửi batch sang HolySheep ai_result = self.ai_client.generate_factor_signals( batch, factor_type="momentum" ) for factor in batch: factor["ai_signal"] = ai_result.get("signal", "unknown") factor["ai_confidence"] = ai_result.get("confidence", 0.5) factor["ai_latency_ms"] = ai_result.get("latency_ms", 0) enhanced_factors.append(factor) return enhanced_factors def run_backtest(self, signals: List[dict], initial_capital: float = 10000) -> dict: """Chạy backtest đơn giản""" capital = initial_capital position = 0 trades = [] for i, signal in enumerate(signals): if signal["ai_signal"] == 1 and position == 0: # Buy signal shares = capital / signal["close"] position = shares capital = 0 trades.append({ "type": "BUY", "price": signal["close"], "timestamp": signal["timestamp"] }) elif signal["ai_signal"] == -1 and position > 0: # Sell signal capital = position * signal["close"] position = 0 trades.append({ "type": "SELL", "price": signal["close"], "timestamp": signal["timestamp"] }) # Final PnL if position > 0: final_value = position * signals[-1]["close"] else: final_value = capital pnl = (final_value - initial_capital) / initial_capital * 100 return { "initial_capital": initial_capital, "final_value": round(final_value, 2), "pnl_percent": round(pnl, 2), "total_trades": len(trades), "trades": trades }

============ MAIN PIPELINE ============

def main(): print("=" * 60) print("🚀 HolySheep + Tardis Factor Backtest Pipeline") print("=" * 60) # Khởi tạo clients holy_sheep = HolySheepClient(os.getenv("HOLYSHEEP_API_KEY")) tardis = TardisDataFetcher(os.getenv("TARDIS_API_KEY")) # Fetch dữ liệu từ Tardis print("\n📊 Bước 1: Fetching historical data từ Tardis...") candles = tardis.fetch_perpetual_candles( exchange="binance", symbol="BTC-USDT-PERP", start_date="2024-01-01", end_date="2024-06-01" ) print(f"✅ Fetched {len(candles)} candles") # Tính factors print("\n📈 Bước 2: Computing momentum factors...") backtester = FactorBacktester(holy_sheep) factors = backtester.compute_momentum_factor(candles) print(f"✅ Computed {len(factors)} factors") # Generate AI signals với HolySheep print("\n🤖 Bước 3: Generating AI-enhanced signals...") print("💰 Model: DeepSeek V3.2 @ $0.42/MTok (85% tiết kiệm)") enhanced = backtester.generate_ai_signals(factors) print(f"✅ Enhanced {len(enhanced)} signals") # Run backtest print("\n💹 Bước 4: Running backtest...") results = backtester.run_backtest(enhanced) print("\n" + "=" * 60) print("📊 BACKTEST RESULTS") print("=" * 60) print(f"Initial Capital: ${results['initial_capital']:,.2f}") print(f"Final Value: ${results['final_value']:,.2f}") print(f"PnL: {results['pnl_percent']:+.2f}%") print(f"Total Trades: {results['total_trades']}") # Chi phí ước tính total_tokens = len(enhanced) * 100 # ~100 tokens per batch cost_usd = (total_tokens / 1_000_000) * 0.42 print(f"\n💵 Estimated HolySheep Cost: ${cost_usd:.4f}") print(f"📉 So với OpenAI: ${cost_usd * 143:.2f} (tiết kiệm 99.3%)") if __name__ == "__main__": main()

Chiến lược Caching và Data Completion

# advanced_caching.py - Chiến lược caching nâng cao
import hashlib
import json
import time
from functools import wraps
from typing import Callable, Any
import redis
import requests

class HierarchicalCache:
    """
    Cache nhiều tầng cho Tardis data:
    - L1: In-memory (dict)
    - L2: Redis (cross-process)
    - L3: Persistent (disk/DB)
    """
    
    def __init__(self, redis_host='localhost', redis_port=6379):
        self.l1_cache = {}  # In-memory
        self.l1_maxsize = 1000
        self.l1_access = {}  # LRU tracking
        
        self.redis = redis.Redis(
            host=redis_host,
            port=redis_port,
            decode_responses=True
        )
        
        self.cache_stats = {
            "l1_hits": 0, "l1_misses": 0,
            "l2_hits": 0, "l2_misses": 0,
            "l3_hits": 0, "l3_misses": 0
        }
    
    def _hash_key(self, data: Any) -> str:
        """Tạo deterministic hash key"""
        serialized = json.dumps(data, sort_keys=True, default=str)
        return hashlib.sha256(serialized.encode()).hexdigest()
    
    def get(self, key: str) -> Any:
        # L1: In-memory
        if key in self.l1_cache:
            self.cache_stats["l1_hits"] += 1
            self.l1_access[key] = time.time()
            return self.l1_cache[key]
        
        self.cache_stats["l1_misses"] += 1
        
        # L2: Redis
        try:
            l2_data = self.redis.get(f"tardis:{key}")
            if l2_data:
                self.cache_stats["l2_hits"] += 1
                data = json.loads(l2_data)
                # Promote to L1
                self._l1_set(key, data)
                return data
        except:
            pass
        
        self.cache_stats["l2_misses"] += 1
        
        return None
    
    def set(self, key: str, data: Any, ttl: int = 3600):
        # Always set in Redis (L2)
        try:
            self.redis.setex(f"tardis:{key}", ttl, json.dumps(data))
        except:
            pass
        
        # L1 promotion
        self._l1_set(key, data)
    
    def _l1_set(self, key: str, data: Any):
        """LRU eviction for L1 cache"""
        if len(self.l1_cache) >= self.l1_maxsize:
            # Remove oldest accessed
            oldest = min(self.l1_access.items(), key=lambda x: x[1])
            del self.l1_cache[oldest[0]]
            del self.l1_access[oldest[0]]
        
        self.l1_cache[key] = data
        self.l1_access[key] = time.time()
    
    def get_stats(self) -> dict:
        total = sum(self.cache_stats.values())
        return {
            **self.cache_stats,
            "hit_rate_l1": f"{self.cache_stats['l1_hits']/max(total,1)*100:.1f}%",
            "hit_rate_l2": f"{self.cache_stats['l2_hits']/max(total,1)*100:.1f}%",
            "l1_size": len(self.l1_cache)
        }


class TardisDataCompleter:
    """
    Xử lý missing data points trong Tardis historical data
    Sử dụng HolySheep để interpolate thông minh
    """
    
    def __init__(self, holy_sheep_url: str, api_key: str):
        self.holy_sheep_url = holy_sheep_url
        self.api_key = api_key
        self.cache = HierarchicalCache()
    
    def complete_missing_gaps(self, candles: list, 
                               max_gap_minutes: int = 60) -> list:
        """
        Detect và complete missing data points
        
        Args:
            candles: Raw candles từ Tardis
            max_gap_minutes: Gap lớn hơn sẽ được interpolate
        """
        if len(candles) < 2:
            return candles
        
        completed = []
        
        for i in range(len(candles)):
            completed.append(candles[i])
            
            if i < len(candles) - 1:
                current_ts = candles[i]["timestamp"]
                next_ts = candles[i+1]["timestamp"]
                
                gap_minutes = (next_ts - current_ts) / 60000
                
                if gap_minutes > max_gap_minutes:
                    print(f"⚠️ Detected gap: {gap_minutes:.0f} minutes")
                    
                    # Generate interpolated candles
                    interpolated = self._interpolate_candles(
                        candles[i],
                        candles[i+1],
                        gap_minutes
                    )
                    
                    completed.extend(interpolated)
        
        return completed
    
    def _interpolate_candles(self, start: dict, end: dict, 
                              gap_minutes: float) -> list:
        """Interpolate missing candles sử dụng HolySheep AI"""
        
        # Check cache trước
        cache_key = self.cache._hash_key({
            "start": start["timestamp"],
            "end": end["timestamp"]
        })
        
        cached = self.cache.get(cache_key)
        if cached:
            return cached
        
        # Calculate number of candles to generate
        interval = start.get("interval", 1)  # 1 minute default
        num_candles = int(gap_minutes / interval) - 1
        
        if num_candles <= 0:
            return []
        
        # Sử dụng HolySheep để tạo realistic interpolated data
        prompt = f"""Given these two cryptocurrency candles:
Start: {start}
End: {end}

Generate {num_candles} intermediate candles with realistic price movements.
Use linear interpolation with noise for OHLCV data.
Return as JSON array with same structure as input."""

        try:
            response = requests.post(
                f"{self.holy_sheep_url}/chat/completions",
                headers={
                    "Authorization": f"Bearer {self.api_key}",
                    "Content-Type": "application/json"
                },
                json={
                    "model": "deepseek-v3.2",
                    "messages": [{"role": "user", "content": prompt}],
                    "temperature": 0.1
                },
                timeout=15
            )
            
            if response.status_code == 200:
                result = response.json()
                content = result["choices"][0]["message"]["content"]
                
                # Parse JSON từ response
                import re
                json_match = re.search(r'\[.*\]', content, re.DOTALL)
                if json_match:
                    interpolated = json.loads(json_match.group())
                    
                    # Cache kết quả
                    self.cache.set(cache_key, interpolated, ttl=86400)
                    return interpolated
                    
        except Exception as e:
            print(f"❌ Interpolation error: {e}")
        
        # Fallback: Linear interpolation
        return self._linear_interpolation(start, end, num_candles)
    
    def _linear_interpolation(self, start: dict, end: dict, 
                               num_candles: int) -> list:
        """Fallback linear interpolation"""
        result = []
        
        for i in range(1, num_candles + 1):
            ratio = i / (num_candles + 1)
            
            interpolated = {
                "timestamp": start["timestamp"] + 
                    (end["timestamp"] - start["timestamp"]) * ratio,
                "open": start["open"] + (end["open"] - start["open"]) * ratio,
                "high": max(start["high"], end["high"]) - 
                    abs(end["high"] - start["high"]) * (1 - ratio),
                "low": min(start["low"], end["low"]) + 
                    abs(end["low"] - start["low"]) * ratio,
                "close": start["close"] + (end["close"] - start["close"]) * ratio,
                "volume": start["volume"] + (end["volume"] - start["volume"]) * ratio,
                "interpolated": True
            }
            
            result.append(interpolated)
        
        return result


Usage example

if __name__ == "__main__": cache = HierarchicalCache() completer = TardisDataCompleter( holy_sheep_url="https://api.holysheep.ai/v1", api_key="your_key" ) # Test cache stats print(f"📊 Cache Stats: {cache.get_stats()}")

Rate Limiting và Cost Governance

# rate_limit_cost_governance.py
import time
import threading
import requests
from collections import defaultdict
from datetime import datetime, timedelta
from dataclasses import dataclass
from typing import Dict, Optional
import sqlite3

@dataclass
class CostRecord:
    timestamp: float
    model: str
    tokens: int
    cost_usd: float
    latency_ms: float
    cache_hit: bool

class RateLimiter:
    """Token bucket rate limiter với spillover protection"""
    
    def __init__(self, requests_per_minute: int = 60):
        self.rpm = requests_per_minute
        self.bucket = requests_per_minute
        self.last_refill = time.time()
        self.refill_rate = requests_per_minute / 60.0  # per second
        self.lock = threading.Lock()
    
    def acquire(self, tokens: int = 1) -> float:
        """Acquire tokens, return wait time if needed"""
        with self.lock:
            now = time.time()
            elapsed = now - self.last_refill
            
            # Refill bucket
            self.bucket = min(
                self.rpm, 
                self.bucket + elapsed * self.refill_rate
            )
            self.last_refill = now
            
            if self.bucket >= tokens:
                self.bucket -= tokens
                return 0.0
            
            # Calculate wait time
            deficit = tokens - self.bucket
            wait_time = deficit / self.refill_rate
            
            return max(wait_time, 0.0)
    
    def wait_and_acquire(self, tokens: int = 1):
        """Block until tokens acquired"""
        wait = self.acquire(tokens)
        if wait > 0:
            print(f"⏳ Rate limiter: waiting {wait:.2f}s")
            time.sleep(wait)


class CostGovernor:
    """
    Kiểm soát chi phí API với:
    - Budget limits theo ngày/tháng
    - Auto fallback sang model rẻ hơn
    - Cost alerts
    """
    
    # HolySheep Pricing (2026)
    PRICING = {
        "gpt-4.1": 8.0,           # $8/MTok
        "claude-sonnet-4.5": 15.0, # $15/MTok
        "gemini-2.5-flash": 2.50,  # $2.50/MTok
        "deepseek-v3.2": 0.42,    # $0.42/MTok
    }
    
    # Fallback chain: expensive -> cheap
    FALLBACK_CHAIN = [
        "claude-sonnet-4.5",
        "gpt-4.1", 
        "gemini-2.5-flash",
        "deepseek-v3.2"  # Cheapest - primary for high volume
    ]
    
    def __init__(self, daily_budget_usd: float = 10.0):
        self.daily_budget = daily_budget_usd
        self.daily_spent = 0.0
        self.day_start = datetime.now().date()
        
        # Persistent cost tracking
        self.db_path = "cost_tracking.db"
        self._init_db()
        
        # Alerts
        self.alert_thresholds = [0.5, 0.8, 0.95]  # 50%, 80%, 95%
    
    def _init_db(self):
        """Initialize SQLite tracking database"""
        conn = sqlite3.connect(self.db_path)
        cursor = conn.cursor()
        
        cursor.execute("""
            CREATE TABLE IF NOT EXISTS cost_records (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                timestamp REAL,
                date TEXT,
                model TEXT,
                tokens INTEGER,
                cost_usd REAL,
                latency_ms REAL,
                cache_hit INTEGER
            )
        """)
        
        conn.commit()
        conn.close()
    
    def _reset_daily_if_needed(self):
        """Reset daily counter at midnight"""
        today = datetime.now().date()
        if today > self.day_start:
            self.daily_spent = 0.0
            self.day_start = today
    
    def _record_cost(self, record: CostRecord):
        """Persist cost record to database"""
        conn = sqlite3.connect(self.db_path)
        cursor = conn.cursor()
        
        cursor.execute("""
            INSERT INTO cost_records 
            (timestamp, date, model, tokens, cost_usd, latency_ms, cache_hit)
            VALUES (?, ?, ?, ?, ?, ?, ?)
        """, (
            record.timestamp,
            datetime.fromtimestamp(record.timestamp).date().isoformat(),
            record.model,
            record.tokens,
            record.cost_usd,
            record.latency_ms,
            1 if record.cache_hit else 0
        ))
        
        conn.commit()
        conn.close()
    
    def can_afford(self, model: str, estimated_tokens: int) -> bool:
        """Check if budget allows this request"""
        self._reset_daily_if_needed()
        
        price = self.PRICING.get(model, 1.0)
        estimated_cost = (estimated_tokens / 1_000_000) * price
        
        return (self.daily_spent + estimated_cost) <= self.daily_budget
    
    def get_optimal_model(self, required_quality: str = "medium") -> str:
        """
        Get best model within budget
        
        Quality levels:
        - high: claude-sonnet-4.5 or gpt-4.1
        - medium: gemini-2.5-flash
        - high_volume: deepseek-v3.2
        """
        self._reset_daily_if_needed()
        
        remaining = self.daily_budget - self.daily_spent
        
        if required_quality == "high":
            candidates = ["claude-sonnet-4.5", "gpt-4.1"]
        elif required_quality == "medium":
            candidates = ["gemini-2.5-flash", "deepseek-v3.2"]
        else:
            candidates = self.FALLBACK_CHAIN
        
        # Pick cheapest that we can afford for high volume
        for model in candidates:
            if model == "deepseek-v3.2":
                return model
        
        return candidates[0]
    
    def record_and_check(self, model: str, tokens: int, 
                          latency_ms: float, cache_hit: bool = False):
        """Record cost and check alerts"""
        price = self.PRICING.get(model, 1.0)
        cost = (tokens / 1_000_000) * price
        
        self.daily_spent += cost
        
        record = CostRecord(
            timestamp=time.time(),
            model=model,
            tokens=tokens,
            cost_usd=cost,
            latency_ms=latency_ms,
            cache_hit=cache_hit
        )
        
        self._record_cost(record)
        
        # Check alert thresholds
        usage_ratio = self.daily_spent / self.daily_budget
        for threshold in self.alert_thresholds:
            if usage_ratio >= threshold and (usage_ratio - threshold) < 0.01:
                print(f"⚠️ COST ALERT: {usage_ratio*100:.0f}% daily budget used")
    
    def get_daily_report(self) -> Dict:
        """Generate daily cost report"""
        conn = sqlite3.connect(self.db_path)