lowkey_backtest/strategy_config.py

96 lines
3.2 KiB
Python

import os
from dotenv import load_dotenv
# Load environment variables
load_dotenv()
# ==============================================================================
# --- 1. MASTER STRATEGY CONFIG ---
# ==============================================================================
ASSET = 'BTC'
TIMEFRAME_HOURS = 1.0 # We work with 1h candles for the ML model
# --- Define Strategy Logic (in HOURS) ---
PREDICT_HOURS = 5.0
SMA_FAST_HOURS = 12.0
SMA_SLOW_HOURS = 50.0
VOLATILITY_HOURS = 12.0
BBAND_HOURS = 20.0
MOMENTUM_1_HOURS = 5.0
MOMENTUM_2_HOURS = 10.0
ATR_PERIOD_HOURS = 10.0
# --- Backtest / Trade Config ---
PROB_THRESHOLD = 0.55
SL_ATR_MULT = 1.5 # Widened from 0.8
TP_ATR_MULT = 3.0 # Widened from 1.5
FEES_PERCENT = 0.001
SLIPPAGE_PERCENT = 0.001
# --- MVRV/NUPL Strategy-Specific Config ---
NUPL_MA_HOURS = 200.0 # ~200-day MA (normalized to hours if needed, source used hours directly)
MVRV_MA_HOURS = 111.0 # ~111-day MA
# Thresholds for "Overheated" Regime
MVRV_Z_THRESH = 1.5
NUPL_THRESH = 0.6
FUNDING_FILTER = -0.05 # Filter out if funding rate is below this (but source used > -0.05, wait check source)
# Source: (fund_grid_bool_base > funding_rate_filters_b) where filter is -0.05.
# So we want Funding Rate > -0.05.
# ==============================================================================
# --- 2. CRYPTOQUANT METRICS ---
# ==============================================================================
ONCHAIN_FEATURE_NAMES = [
'funding_rate', 'sopr_ratio', 'leverage_ratio',
'net_exchange_flow', 'fund_flow_ratio',
'exchange_whale_ratio',
'nupl', 'mvrv', 'lth_sopr', 'puell_multiple',
'active_addresses'
]
# ==============================================================================
# --- 3. AUTO-CALCULATED PARAMETERS ---
# ==============================================================================
import math
def hours_to_candles(hours):
return math.ceil(hours / TIMEFRAME_HOURS)
PREDICTION_PERIOD = hours_to_candles(PREDICT_HOURS)
SMA_FAST_PERIODS = hours_to_candles(SMA_FAST_HOURS)
SMA_SLOW_PERIODS = hours_to_candles(SMA_SLOW_HOURS)
VOLATILITY_PERIODS = hours_to_candles(VOLATILITY_HOURS)
BBAND_PERIODS = hours_to_candles(BBAND_HOURS)
MOMENTUM_1_PERIODS = hours_to_candles(MOMENTUM_1_HOURS)
MOMENTUM_2_PERIODS = hours_to_candles(MOMENTUM_2_HOURS)
ATR_PERIOD = hours_to_candles(ATR_PERIOD_HOURS)
NUPL_MA_PERIODS = hours_to_candles(NUPL_MA_HOURS)
MVRV_MA_PERIODS = hours_to_candles(MVRV_MA_HOURS)
# --- FEATURE NAMES ---
BASE_FEATURE_NAMES = [
'returns', 'log_returns', f'momentum_{MOMENTUM_1_PERIODS}',
f'momentum_{MOMENTUM_2_PERIODS}', f'SMA_{SMA_FAST_PERIODS}',
f'SMA_{SMA_SLOW_PERIODS}', f'volatility_{VOLATILITY_PERIODS}',
'bb_lower', 'bb_middle', 'bb_upper', 'bb_width', 'bb_percent', 'atr'
]
# Append cycle MAs
BASE_FEATURE_NAMES += [
f'nupl_ma_{NUPL_MA_PERIODS}', f'mvrv_ma_{MVRV_MA_PERIODS}'
]
ONCHAIN_Z_SCORES = [f'{feat}_z' for feat in ONCHAIN_FEATURE_NAMES]
FEATURE_NAMES = BASE_FEATURE_NAMES + ONCHAIN_Z_SCORES
# --- PATHS ---
DATA_DIR = 'data'
if not os.path.exists(DATA_DIR):
os.makedirs(DATA_DIR)
FEATURES_PATH = os.path.join(DATA_DIR, 'features.csv')
MODEL_PATH = os.path.join(DATA_DIR, 'model.pkl')