-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbacktest.py
More file actions
104 lines (89 loc) · 3.88 KB
/
Copy pathbacktest.py
File metadata and controls
104 lines (89 loc) · 3.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import argparse
import time
import requests
from datetime import datetime, timedelta
from dotenv import load_dotenv
import os
load_dotenv()
CMC_API_KEY = os.getenv("CMC_API_KEY")
BASE_URL = "https://pro-api.coinmarketcap.com/v1"
def get_historical_prices(symbol: str, days: int = 30):
"""
Recupera prezzi storici giornalieri da CMC.
NOTA: L'endpoint OHLCV richiede piano Pro. In questa versione demo,
simuliamo lo storico usando il prezzo attuale e i change percentuali.
Per un backtest reale, servirebbe un piano CMC a pagamento o un'altra fonte.
"""
# Otteniamo il prezzo attuale e i change percentuali
url = f"{BASE_URL}/cryptocurrency/quotes/latest"
headers = {"X-CMC_PRO_API_KEY": CMC_API_KEY, "Accept": "application/json"}
params = {"symbol": symbol.upper(), "convert": "USD"}
try:
response = requests.get(url, headers=headers, params=params, timeout=10)
response.raise_for_status()
data = response.json()
quote = data.get("data", {}).get(symbol.upper(), {}).get("quote", {}).get("USD", {})
price = quote.get("price", 0)
pct_24h = quote.get("percent_change_24h", 0)
pct_7d = quote.get("percent_change_7d", 0)
# Costruzione di prezzi giornalieri simulati (trend lineare basato sui change)
# Questo è un placeholder. Per un backtest accurato, servirebbe OHLCV storico.
prices = []
today = datetime.now()
for i in range(days):
# Simulazione: prezzo decrescente se i change sono negativi
days_ago = days - i
if days_ago <= 7:
change = pct_7d / 7
else:
change = pct_24h
simulated_price = price * (1 + change * (days_ago / 100))
prices.append(round(simulated_price, 2))
return prices
except Exception as e:
print(f"[Backtest] Error: {e}")
return []
def run_backtest(symbol: str = "BTC", days: int = 30):
print(f"\n📈 Running BACKTEST for {symbol} over {days} days (CMC data)\n")
prices = get_historical_prices(symbol, days)
if not prices:
print("❌ Failed to fetch historical prices. Check API key or upgrade CMC plan.")
return
# Simulazione di segnali basati su trend
signals = []
for i in range(1, len(prices)):
prev_price = prices[i-1]
curr_price = prices[i]
change = (curr_price - prev_price) / prev_price * 100
# Segnale semplice per demo: SHORT se calo > 2%, LONG se salita > 2%
if change < -2:
signals.append("SHORT")
elif change > 2:
signals.append("LONG")
else:
signals.append("HOLD")
short_signals = signals.count("SHORT")
long_signals = signals.count("LONG")
hold_signals = signals.count("HOLD")
# Stima di performance fittizia (solo per demo)
total_return = ((prices[-1] - prices[0]) / prices[0]) * 100
print("=" * 65)
print(f"📊 BACKTEST RESULTS: {symbol} | {days} days")
print("=" * 65)
print(f" Starting price: ${prices[0]:,.2f}")
print(f" Ending price: ${prices[-1]:,.2f}")
print(f" Total return: {total_return:+.2f}%")
print(f"\n Signal distribution:")
print(f" SHORT signals: {short_signals}")
print(f" LONG signals: {long_signals}")
print(f" HOLD signals: {hold_signals}")
print("=" * 65)
# Avvertenza sulla limitazione del backtest
print("\n⚠️ NOTE: This backtest uses simulated prices based on CMC percent changes.")
print(" For accurate backtesting, upgrade to CMC Pro plan for OHLCV historical data.\n")
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--token", type=str, default="BTC")
parser.add_argument("--days", type=int, default=30)
args = parser.parse_args()
run_backtest(args.token.upper(), args.days)