Files
nt8-sdk/src/NT8.Core/Analytics/AnalyticsModels.cs
mo 0e36fe5d23
Some checks failed
Build and Test / build (push) Has been cancelled
feat: Complete Phase 5 Analytics & Reporting implementation
Analytics Layer (15 components):
- TradeRecorder: Full trade lifecycle tracking with partial fills
- PerformanceCalculator: Sharpe, Sortino, win rate, profit factor, expectancy
- PnLAttributor: Multi-dimensional attribution (grade/regime/time/strategy)
- DrawdownAnalyzer: Period detection and recovery metrics
- GradePerformanceAnalyzer: Grade-level edge analysis
- RegimePerformanceAnalyzer: Regime segmentation and transitions
- ConfluenceValidator: Factor validation and weighting optimization
- ReportGenerator: Daily/weekly/monthly reporting with export
- TradeBlotter: Real-time trade ledger with filtering
- ParameterOptimizer: Grid search and walk-forward scaffolding
- MonteCarloSimulator: Confidence intervals and risk-of-ruin
- PortfolioOptimizer: Multi-strategy allocation and portfolio metrics

Test Coverage (90 new tests):
- 240+ total tests, 100% pass rate
- >85% code coverage
- Zero new warnings

Project Status: Phase 5 complete (85% overall), ready for NT8 integration
2026-02-16 21:30:51 -05:00

394 lines
9.1 KiB
C#

using System;
using System.Collections.Generic;
using NT8.Core.Common.Models;
using NT8.Core.Intelligence;
namespace NT8.Core.Analytics
{
/// <summary>
/// Time period used for analytics aggregation.
/// </summary>
public enum AnalyticsPeriod
{
/// <summary>
/// Daily period.
/// </summary>
Daily,
/// <summary>
/// Weekly period.
/// </summary>
Weekly,
/// <summary>
/// Monthly period.
/// </summary>
Monthly,
/// <summary>
/// Lifetime period.
/// </summary>
AllTime
}
/// <summary>
/// Represents one complete trade lifecycle.
/// </summary>
public class TradeRecord
{
/// <summary>
/// Trade identifier.
/// </summary>
public string TradeId { get; set; }
/// <summary>
/// Trading symbol.
/// </summary>
public string Symbol { get; set; }
/// <summary>
/// Strategy name.
/// </summary>
public string StrategyName { get; set; }
/// <summary>
/// Entry timestamp.
/// </summary>
public DateTime EntryTime { get; set; }
/// <summary>
/// Exit timestamp.
/// </summary>
public DateTime? ExitTime { get; set; }
/// <summary>
/// Trade side.
/// </summary>
public OrderSide Side { get; set; }
/// <summary>
/// Quantity.
/// </summary>
public int Quantity { get; set; }
/// <summary>
/// Average entry price.
/// </summary>
public double EntryPrice { get; set; }
/// <summary>
/// Average exit price.
/// </summary>
public double? ExitPrice { get; set; }
/// <summary>
/// Realized PnL.
/// </summary>
public double RealizedPnL { get; set; }
/// <summary>
/// Unrealized PnL.
/// </summary>
public double UnrealizedPnL { get; set; }
/// <summary>
/// Confluence grade at entry.
/// </summary>
public TradeGrade Grade { get; set; }
/// <summary>
/// Confluence weighted score at entry.
/// </summary>
public double ConfluenceScore { get; set; }
/// <summary>
/// Risk mode at entry.
/// </summary>
public RiskMode RiskMode { get; set; }
/// <summary>
/// Volatility regime at entry.
/// </summary>
public VolatilityRegime VolatilityRegime { get; set; }
/// <summary>
/// Trend regime at entry.
/// </summary>
public TrendRegime TrendRegime { get; set; }
/// <summary>
/// Stop distance in ticks.
/// </summary>
public int StopTicks { get; set; }
/// <summary>
/// Target distance in ticks.
/// </summary>
public int TargetTicks { get; set; }
/// <summary>
/// R multiple for the trade.
/// </summary>
public double RMultiple { get; set; }
/// <summary>
/// Trade duration.
/// </summary>
public TimeSpan Duration { get; set; }
/// <summary>
/// Metadata bag.
/// </summary>
public Dictionary<string, object> Metadata { get; set; }
/// <summary>
/// Creates a new trade record.
/// </summary>
public TradeRecord()
{
Metadata = new Dictionary<string, object>();
}
}
/// <summary>
/// Per-trade metrics.
/// </summary>
public class TradeMetrics
{
/// <summary>
/// Trade identifier.
/// </summary>
public string TradeId { get; set; }
/// <summary>
/// Gross PnL.
/// </summary>
public double PnL { get; set; }
/// <summary>
/// R multiple.
/// </summary>
public double RMultiple { get; set; }
/// <summary>
/// Maximum adverse excursion.
/// </summary>
public double MAE { get; set; }
/// <summary>
/// Maximum favorable excursion.
/// </summary>
public double MFE { get; set; }
/// <summary>
/// Slippage amount.
/// </summary>
public double Slippage { get; set; }
/// <summary>
/// Commission amount.
/// </summary>
public double Commission { get; set; }
/// <summary>
/// Net PnL.
/// </summary>
public double NetPnL { get; set; }
/// <summary>
/// Whether trade is a winner.
/// </summary>
public bool IsWinner { get; set; }
/// <summary>
/// Hold time.
/// </summary>
public TimeSpan HoldTime { get; set; }
/// <summary>
/// Return on investment.
/// </summary>
public double ROI { get; set; }
/// <summary>
/// Custom metrics bag.
/// </summary>
public Dictionary<string, object> CustomMetrics { get; set; }
/// <summary>
/// Creates a trade metrics model.
/// </summary>
public TradeMetrics()
{
CustomMetrics = new Dictionary<string, object>();
}
}
/// <summary>
/// Point-in-time portfolio performance snapshot.
/// </summary>
public class PerformanceSnapshot
{
/// <summary>
/// Snapshot time.
/// </summary>
public DateTime Timestamp { get; set; }
/// <summary>
/// Equity value.
/// </summary>
public double Equity { get; set; }
/// <summary>
/// Cumulative PnL.
/// </summary>
public double CumulativePnL { get; set; }
/// <summary>
/// Drawdown percentage.
/// </summary>
public double DrawdownPercent { get; set; }
/// <summary>
/// Open positions count.
/// </summary>
public int OpenPositions { get; set; }
}
/// <summary>
/// PnL attribution breakdown container.
/// </summary>
public class AttributionBreakdown
{
/// <summary>
/// Attribution dimension.
/// </summary>
public string Dimension { get; set; }
/// <summary>
/// Total PnL.
/// </summary>
public double TotalPnL { get; set; }
/// <summary>
/// Dimension values with contribution amount.
/// </summary>
public Dictionary<string, double> Contributions { get; set; }
/// <summary>
/// Creates a breakdown model.
/// </summary>
public AttributionBreakdown()
{
Contributions = new Dictionary<string, double>();
}
}
/// <summary>
/// Aggregate performance metrics for a trade set.
/// </summary>
public class PerformanceMetrics
{
/// <summary>
/// Total trade count.
/// </summary>
public int TotalTrades { get; set; }
/// <summary>
/// Win count.
/// </summary>
public int Wins { get; set; }
/// <summary>
/// Loss count.
/// </summary>
public int Losses { get; set; }
/// <summary>
/// Win rate [0,1].
/// </summary>
public double WinRate { get; set; }
/// <summary>
/// Loss rate [0,1].
/// </summary>
public double LossRate { get; set; }
/// <summary>
/// Gross profit.
/// </summary>
public double GrossProfit { get; set; }
/// <summary>
/// Gross loss absolute value.
/// </summary>
public double GrossLoss { get; set; }
/// <summary>
/// Net profit.
/// </summary>
public double NetProfit { get; set; }
/// <summary>
/// Average win.
/// </summary>
public double AverageWin { get; set; }
/// <summary>
/// Average loss absolute value.
/// </summary>
public double AverageLoss { get; set; }
/// <summary>
/// Profit factor.
/// </summary>
public double ProfitFactor { get; set; }
/// <summary>
/// Expectancy.
/// </summary>
public double Expectancy { get; set; }
/// <summary>
/// Sharpe ratio.
/// </summary>
public double SharpeRatio { get; set; }
/// <summary>
/// Sortino ratio.
/// </summary>
public double SortinoRatio { get; set; }
/// <summary>
/// Max drawdown percent.
/// </summary>
public double MaxDrawdownPercent { get; set; }
/// <summary>
/// Recovery factor.
/// </summary>
public double RecoveryFactor { get; set; }
}
/// <summary>
/// Trade outcome classification.
/// </summary>
public enum TradeOutcome
{
/// <summary>
/// Winning trade.
/// </summary>
Win,
/// <summary>
/// Losing trade.
/// </summary>
Loss,
/// <summary>
/// Flat trade.
/// </summary>
Breakeven
}
}