Files
MidasEngine/src/griffin-stuff/backtester/main.py
2024-12-14 12:57:00 -05:00

66 lines
2.3 KiB
Python

import json
import logging
import pandas as pd
import os
from indicators import calculate_indicator_signals
from evaluation import evaluate_indicator_accuracy
def setup_logging(log_path):
os.makedirs(os.path.dirname(log_path), exist_ok=True)
logging.basicConfig(
filename=log_path,
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
def load_config(config_path="config.json"):
with open(config_path, 'r') as f:
config = json.load(f)
return config
def load_data(csv_path, date_col, price_col):
df = pd.read_csv(csv_path)
df[date_col] = pd.to_datetime(df[date_col])
df = df.sort_values(date_col).reset_index(drop=True)
df = df.dropna(subset=[date_col, price_col])
return df
if __name__ == "__main__":
config = load_config("config.json")
setup_logging(config["evaluation"]["log_file"])
# Load data
df = load_data(config["data"]["input_csv"],
config["data"]["date_column"],
config["data"]["price_column"])
# Calculate indicators and signals, evaluate accuracy
all_results = []
for category, indicators in config["indicators"].items():
for ind_name in indicators:
params = config["parameters"].get(ind_name, {})
signals_df = calculate_indicator_signals(
df.copy(),
indicator_name=ind_name,
params=params,
price_col=config["data"]["price_column"],
high_col=config["data"]["high_column"],
low_col=config["data"]["low_column"],
volume_col=config["data"]["volume_column"]
)
accuracy = evaluate_indicator_accuracy(
signals_df,
price_col=config["data"]["price_column"],
horizon=config["evaluation"]["prediction_horizon"]
)
logging.info(f"Category: {category}, Indicator: {ind_name}, Accuracy: {accuracy:.4f}")
all_results.append((category, ind_name, accuracy))
# Print results to console as well
for category, ind_name, acc in all_results:
print(f"Category: {category}, Indicator: {ind_name}, Accuracy: {acc:.4f}")