Multi-Asset Portfolio Manager - Optimize investment portfolios using quantitative strategies with a desktop GUI
QuantFolio is a C# desktop application for constructing, optimizing, and backtesting multi-asset investment portfolios. It implements modern portfolio theory with three quantitative strategies:
- Low Risk - Minimum variance optimization
- Low Turnover - Cost-efficient rebalancing
- High Yield Equity - Dividend-focused allocation
Built with .NET 8.0 and WPF, QuantFolio provides a GUI for portfolio managers, financial analysts, and quantitative researchers to test investment strategies using historical market data.
- Portfolio Management - Create and manage multiple investment portfolios
- Market Data Integration - Fetch historical OHLCV data from Alpha Vantage & Financial Modeling Prep (with automatic failover)
- Strategy Implementation - Three tested quantitative strategies
- Portfolio Optimization - Mathematical optimization using Math.NET Numerics
- Backtesting Engine - Walk-forward analysis with performance metrics
- Performance Analytics - Sharpe ratio, volatility, drawdown, returns
- Interactive Charts - Performance visualization with LiveCharts2
- SQLite Database - Persistent storage with Entity Framework Core
- WPF GUI - MVVM architecture with CommunityToolkit.Mvvm
- CLI Interface - Terminal-based portfolio management with Spectre.Console
- 214 Unit Tests - 100% passing with comprehensive coverage
- Repository Pattern - Clean data access layer
- Dependency Injection - Microsoft.Extensions.DependencyInjection
- Async/Await - Non-blocking operations throughout
- Nullable Reference Types - Null safety
- Configuration Management - Flexible appsettings.json support
- Objective: Minimize portfolio variance
- Method: Quadratic programming (minimum variance optimization)
- Use Case: Conservative investors, capital preservation
- Optimization: Uses covariance matrix of returns
- Objective: Minimize transaction costs
- Method: Constrained optimization with turnover penalty
- Use Case: Long-term investors, tax efficiency
- Optimization: Balances return vs. trading costs
- Objective: Maximize dividend income
- Method: Dividend yield weighting with volatility constraints
- Use Case: Income-focused investors, retirees
- Optimization: Dividend-weighted allocation
quantfolio/
│
├── src/ # Core application logic
│ ├── core/ # Domain layer
│ │ ├── models/ # Financial entities (Portfolio, Product, Deal, etc.)
│ │ ├── interfaces/ # Repository & service contracts
│ │ └── services/ # Business logic (StrategyFactory, RiskMetrics)
│ │
│ ├── data/ # Data management layer
│ │ ├── PortfolioDbContext.cs # EF Core database context
│ │ ├── repositories/ # Repository implementations
│ │ ├── DataCollector.cs # Market data fetching
│ │ ├── DataCleaner.cs # Data preprocessing
│ │ └── DatabaseManager.cs # Database operations
│ │
│ ├── strategy/ # Portfolio optimization
│ │ ├── PortfolioOptimizer.cs # Main optimizer service
│ │ ├── LowRiskStrategy.cs # Minimum variance strategy
│ │ ├── LowTurnoverStrategy.cs # Cost-efficient strategy
│ │ └── HighYieldStrategy.cs # Dividend-focused strategy
│ │
│ ├── backtesting/ # Backtesting engine
│ │ ├── Backtester.cs # Main backtesting engine
│ │ ├── WalkForwardAnalysis.cs # Walk-forward validation
│ │ └── MetricsCalculator.cs # Performance calculations
│ │
│ ├── visualization/ # Charts & reporting
│ │ ├── ChartGenerator.cs # Chart creation
│ │ ├── RiskReturnPlot.cs # Risk/return visualization
│ │ └── PortfolioComparisonView.cs # Portfolio comparisons
│ │
│ └── utils/ # Utilities
│ ├── ConfigManager.cs # Configuration management
│ ├── Logger.cs # Logging service
│ └── Extensions.cs # Helper extensions
│
├── gui/ # WPF Desktop Application
│ ├── Views/ # XAML views
│ │ ├── PortfolioCreationView.xaml # Portfolio management UI
│ │ ├── DataFetchingView.xaml # Data fetching UI
│ │ └── OptimizationView.xaml # Optimization UI
│ ├── ViewModels/ # MVVM ViewModels
│ │ ├── MainViewModel.cs # Main navigation
│ │ ├── PortfolioCreationViewModel.cs
│ │ ├── DataFetchingViewModel.cs
│ │ └── OptimizationViewModel.cs
│ ├── Converters/ # Value converters
│ ├── MainWindow.xaml # Main application window
│ └── App.xaml.cs # Application entry & DI setup
│
├── tests/ # Unit & integration tests
│ ├── core/ # Domain logic tests
│ ├── data/ # Repository tests
│ ├── strategies/ # Strategy tests
│ ├── backtesting/ # Backtesting tests
│ ├── utils/ # Utility tests
│ └── visualization/ # Visualization tests
│
├── docs/ # Documentation
│ ├── database_schema.md # Complete DB schema
│ ├── database_implementation.md # Implementation guide
│ └── ConfigManager_Implementation.md # Config system docs
│
├── outputs/ # Runtime files (gitignored)
│ ├── database/ # SQLite database
│ └── reports/ # Generated reports
│
└── scripts/ # Automation scripts
├── setup-database.ps1 # Database initialization
├── run-tests.ps1 # Test execution
└── build-and-test.ps1 # Complete build pipeline
- .NET 8.0 SDK or later (Download)
- Windows 10/11 (for WPF GUI)
- Git (for cloning repository)
- Visual Studio 2022 or VS Code (recommended IDEs)
git clone https://github.com/Alter-404/quantfolio.git
cd quantfoliodotnet restore src/QuantFolio.Core.csproj
dotnet restore src/QuantFolio.Data.csproj
dotnet restore gui/QuantFolio.GUI.csproj
dotnet restore tests/QuantFolio.Tests.csproj# Build all projects
dotnet build src/QuantFolio.Core.csproj
dotnet build src/QuantFolio.Data.csproj
dotnet build gui/QuantFolio.GUI.csproj.\setup-database.ps1This will:
- Create the SQLite database
- Run migrations
- Seed initial data (products, clients, managers)
QuantFolio uses Alpha Vantage (primary) and Financial Modeling Prep (backup) for fetching historical market data.
-
Alpha Vantage (Get Key)
- Free tier: 25 requests/day
- Sign up at alphavantage.co
-
Financial Modeling Prep (Get Key)
- Free tier: 250 requests/day
- Sign up at financialmodelingprep.com
Edit appsettings.json in the project root:
{
"MarketDataApi": {
"AlphaVantage": {
"ApiKey": "YOUR_ALPHA_VANTAGE_KEY_HERE",
"BaseUrl": "https://www.alphavantage.co/query"
},
"FinancialModelingPrep": {
"ApiKey": "YOUR_FMP_KEY_HERE",
"BaseUrl": "https://financialmodelingprep.com/api/v3"
}
}
}Note: The application automatically fails over to FMP if Alpha Vantage rate limits are reached.
# GUI Application
dotnet run --project gui/QuantFolio.GUI.csproj
# CLI Application
dotnet run --project cli/QuantFolio.CLI.csprojOr open in Visual Studio and press F5.
# Quick test run
.\run-tests.ps1
# With detailed output
.\run-tests.ps1 -Verbose
# Specific test class
dotnet test --filter PortfolioOptimizerTestsCurrent test statistics:
- Total Tests: 214
- Passing: 214
- Skipped: 0
- Failed: 0
Test categories:
- Core Tests: Domain logic, services, risk metrics, strategy factory
- Data Tests: Repository CRUD, database operations, data collection & cleaning
- Strategy Tests: Portfolio optimizer, Low Risk, Low Turnover, High Yield strategies
- Backtesting Tests: Backtester, walk-forward analysis, metrics calculator
- Visualization Tests: Chart generation, risk-return plots, portfolio comparisons
- Utils Tests: Extensions, logger, configuration manager
using QuantFolio.Core.Models;
using QuantFolio.Data.Repositories;
// Create repository
var portfolioRepo = new PortfolioRepository(dbContext);
// Create new portfolio
var portfolio = new Portfolio
{
ClientId = 1,
ManagerId = 1,
Name = "Growth Portfolio",
Strategy = "High Yield Equity",
AssetUniverse = "US Equities",
InitialCapital = 100000m,
CreationDate = DateTime.Now
};
await portfolioRepo.CreateAsync(portfolio);using QuantFolio.Strategy;
// Create optimizer
var optimizer = new PortfolioOptimizer(marketDataRepo, productRepo);
// Run optimization
var result = await optimizer.OptimizePortfolioAsync(
strategyName: "Low Risk",
assetUniverse: "US Equities",
trainingStart: new DateTime(2022, 1, 1),
trainingEnd: new DateTime(2023, 1, 1),
testingStart: new DateTime(2023, 1, 1),
testingEnd: new DateTime(2024, 1, 1),
initialCapital: 100000m
);
// Access results
Console.WriteLine($"Final Value: ${result.FinalValue:N2}");
Console.WriteLine($"Total Return: {result.TotalReturn:F2}%");
Console.WriteLine($"Sharpe Ratio: {result.SharpeRatio:F2}");
Console.WriteLine($"Max Drawdown: {result.MaxDrawdown:F2}%");-
Portfolio Creation Tab:
- Enter portfolio details (name, client, manager)
- Select investment strategy
- Choose asset universe
- Set initial capital
- Click "Create Portfolio"
-
Data Fetching Tab:
- Select product (stock ticker)
- Choose data source
- Set date range
- Click "Fetch Data"
-
Optimization Tab:
- Select portfolio
- Set training period
- Set testing period
- Click "Optimize"
- View performance chart and metrics
- .NET 8.0 - Latest C# application framework
- C# 12 - With nullable reference types enabled
- Entity Framework Core 8.0.1 - ORM with SQLite provider
- Microsoft.Extensions.DependencyInjection 8.0.1 - DI container
- Math.NET Numerics 5.0.0 - Matrix operations, optimization algorithms
- MathNet.Numerics.Providers.MKL 3.1.0 - Intel MKL for performance
- (Planned) Accord.NET - Machine learning (future enhancement)
- (Planned) ML.NET - Microsoft's ML framework (future enhancement)
- SQLite 3.x - Lightweight, embedded database
- Microsoft.EntityFrameworkCore.Sqlite 8.0.1 - SQLite provider
- Microsoft.EntityFrameworkCore.Design 8.0.1 - Migrations tooling
- Windows Presentation Foundation (WPF) - Modern desktop UI
- CommunityToolkit.Mvvm 8.2.2 - MVVM framework (ObservableObject, RelayCommand)
- LiveChartsCore.SkiaSharpView.WPF 2.0.0-rc3.3 - Interactive charting
- Microsoft.Extensions.Hosting 8.0.1 - Application hosting for DI
- Alpha Vantage API - Stock market data (primary source)
- Yahoo Finance - Historical market data (secondary source)
- (Planned) Binance.Net - Cryptocurrency data (future enhancement)
- xUnit 2.5.4 - Unit testing framework
- xUnit.runner.visualstudio 2.5.4 - Visual Studio test runner
- Moq 4.20.69 - Mocking framework for dependencies
- Microsoft.NET.Test.Sdk 17.7.2 - Test SDK
- 218 Tests - Test coverage
- CLI User Manual - Command-line interface guide
- GUI User Manual - Desktop application guide
- Technical Guide - Architecture and implementation details
- Database Schema - Complete database design and relationships
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ View │────▶│ ViewModel │────▶│ Model │
│ (XAML) │◀────│ (Commands) │◀────│ (Services) │
└─────────────┘ └─────────────┘ └─────────────┘
┌──────────────────────────────────────┐
│ Presentation Layer │
│ (WPF Views + ViewModels) │
└──────────────────────────────────────┘
↓
┌──────────────────────────────────────┐
│ Business Layer │
│ (PortfolioOptimizer, Strategies, │
│ Backtester, RiskMetrics) │
└──────────────────────────────────────┘
↓
┌──────────────────────────────────────┐
│ Data Layer │
│ (Repositories, DbContext, │
│ DataCollector, DataCleaner) │
└──────────────────────────────────────┘
↓
┌──────────────────────────────────────┐
│ Database (SQLite) │
│ (Products, Portfolios, MarketData) │
└──────────────────────────────────────┘
- Repository Pattern - Data access abstraction
- Strategy Pattern - Investment strategy implementations
- Factory Pattern - Strategy creation (StrategyFactory)
- MVVM Pattern - View-ViewModel separation
- Dependency Injection - Loose coupling throughout
Contributions are welcome! Please follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
- Write unit tests for new features (aim for >80% coverage)
- Follow existing code style and conventions
- Update documentation for significant changes
- Ensure all tests pass before submitting PR
Mariano BENJAMIN Marius CALAQUE Noah CHIKHI
Project Link: https://github.com/Alter-404/quantfolio
This project is released under the MIT License. See LICENSE file for details.
- Math.NET - Numerical computing library
- LiveCharts2 - Beautiful charting library
- CommunityToolkit.Mvvm - Excellent MVVM framework
- Entity Framework Core - Robust ORM framework
- xUnit - Reliable testing framework
- Alpha Vantage & FMP - Market data providers
- 214 Tests - 100% passing
- 6 Projects - Core, Data, GUI, CLI, Tests
- 50+ Classes - Well-structured codebase
- 3 Strategies - Production-ready implementations
- MVVM Architecture - Clean separation of concerns
- Entity Framework Core - Modern data access