chapaty 0.1.4

A software to backtest trading strategies.
Documentation
use crate::{
    data_frame_operations::io_operations::save_df_as_csv,
    equity_curve::{EquityCurvesAggMarkets, EquityCurvesAggYears, EquityCurvesReport},
    performance_report::{
        PerformanceReportAggMarkets, PerformanceReports, PerformanceReportsAggYears,
    },
    pnl::{
        pnl_statement::PnLStatement, pnl_statement_agg_markets::PnLStatementAggMarkets,
        pnl_statement_agg_markets_and_agg_years::PnLStatementAggMarketsAggYears,
        pnl_statement_agg_years::PnLStatementAggYears,
    },
    trade_breakdown_report::{
        TradeBreakDownReportAggMarkets,
        TradeBreakDownReportsAggYears,
        TradeBreakdownReports,
    },
};

use polars::prelude::DataFrame;
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
pub struct BacktestResult {
    pub market_and_year: MarketAndYearBacktestResult,
    pub agg_market_and_year: AggMarketsAndYearBacktestResult,
    pub market_and_agg_year: MarketAndAggYearsBacktestResult,
    pub agg_market_and_agg_year: AggMarketsAndAggYearsBacktestResult,
}

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct MarketAndYearBacktestResult {
    pub pnl_statement: PnLStatement,
    pub performance_reports: PerformanceReports,
    pub trade_breakdown_reports: TradeBreakdownReports,
    pub equity_curves: EquityCurvesReport,
}

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct AggMarketsAndYearBacktestResult {
    pub pnl_statement: PnLStatementAggMarkets,
    pub performance_report: PerformanceReportAggMarkets,
    pub trade_breakdown_report: TradeBreakDownReportAggMarkets,
    pub equity_curves: EquityCurvesAggMarkets,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct MarketAndAggYearsBacktestResult {
    pub pnl_statement: PnLStatementAggYears,
    pub performance_report: PerformanceReportsAggYears,
    pub trade_breakdown_report: TradeBreakDownReportsAggYears,
    pub equity_curves: EquityCurvesAggYears,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct AggMarketsAndAggYearsBacktestResult {
    pub pnl_statement: PnLStatementAggMarketsAggYears,
    pub performance_report: DataFrame,
    pub trade_breakdown_report: DataFrame,
    pub equity_curve: Vec<f64>,
}

impl From<MarketAndYearBacktestResult> for BacktestResult {
    fn from(value: MarketAndYearBacktestResult) -> Self {
        let agg_market_and_year: AggMarketsAndYearBacktestResult = value.clone().into();
        Self {
            market_and_year: value.clone(),
            agg_market_and_year: agg_market_and_year.clone(),
            market_and_agg_year: value.clone().into(),
            agg_market_and_agg_year: agg_market_and_year.into(),
        }
    }
}

impl From<MarketAndYearBacktestResult> for AggMarketsAndYearBacktestResult {
    fn from(value: MarketAndYearBacktestResult) -> Self {
        let pnl_statement: PnLStatementAggMarkets = value.pnl_statement.clone().into();
        Self {
            pnl_statement: pnl_statement.clone(),
            performance_report: pnl_statement.compute_performance_report(),
            trade_breakdown_report: pnl_statement.compute_trade_breakdown_report(),
            equity_curves: pnl_statement.compute_equity_curves(),
        }
    }
}

impl From<MarketAndYearBacktestResult> for MarketAndAggYearsBacktestResult {
    fn from(value: MarketAndYearBacktestResult) -> Self {
        let pnl_statement: PnLStatementAggYears = value.pnl_statement.clone().into();
        Self {
            pnl_statement: pnl_statement.clone(),
            performance_report: pnl_statement.compute_performance_reports(),
            trade_breakdown_report: pnl_statement.compute_trade_breakdown_reports(),
            equity_curves: pnl_statement.compute_equity_curves(),
        }
    }
}

impl From<AggMarketsAndYearBacktestResult> for AggMarketsAndAggYearsBacktestResult {
    fn from(value: AggMarketsAndYearBacktestResult) -> Self {
        let pnl_statement: PnLStatementAggMarketsAggYears = value.pnl_statement.into();
        Self {
            pnl_statement: pnl_statement.clone(),
            performance_report: pnl_statement.compute_performance_report(),
            trade_breakdown_report: pnl_statement.compute_trade_breakdown_report(),
            equity_curve: pnl_statement.compute_equity_curve(),
        }
    }
}

impl BacktestResult {
    pub fn save_as_csv(&self, file_name: &str) {
        self.market_and_year.save_as_csv(file_name);
        self.agg_market_and_year.save_as_csv(file_name);
        self.market_and_agg_year.save_as_csv(file_name);
        self.agg_market_and_agg_year.save_as_csv(file_name);
    }
}

impl MarketAndYearBacktestResult {
    pub fn save_as_csv(&self, file_name: &str) {
        self.pnl_statement.save_as_csv(file_name);
        self.performance_reports.save_as_csv(file_name);
        self.trade_breakdown_reports.save_as_csv(file_name);
    }
}

impl AggMarketsAndYearBacktestResult {
    pub fn save_as_csv(&self, file_name: &str) {
        self.pnl_statement.save_as_csv(file_name);
        self.performance_report.save_as_csv(file_name);
        self.trade_breakdown_report.save_as_csv(file_name);
    }
}
impl MarketAndAggYearsBacktestResult {
    pub fn save_as_csv(&self, file_name: &str) {
        self.pnl_statement.save_as_csv(file_name);
        self.performance_report.save_as_csv(file_name);
        self.trade_breakdown_report.save_as_csv(file_name);
    }
}
impl AggMarketsAndAggYearsBacktestResult {
    pub fn save_as_csv(&self, file_name: &str) {
        self.pnl_statement.save_as_csv(file_name);
        let name = format!("{file_name}_all_markets_all_years_performance_report");
        save_df_as_csv(&mut self.performance_report.clone(), &name);
        let name = format!("{file_name}_all_markets_all_years_trade_breakdown_report");
        save_df_as_csv(&mut self.trade_breakdown_report.clone(), &name);
    }
}