Trading Analytics Platform

R
Shiny
Machine Learning
Trading
A comprehensive R Shiny application for systematic trade analysis and ML-driven strategy development
Published

January 1, 2025

Overview

A full-featured trading analytics platform built in R Shiny that processes trade data exported from Nordnet. The application has evolved from basic performance analysis to a sophisticated ML-driven strategy development environment.

Key Features

Performance Analytics

  • Van Tharp statistics (R-multiples, expectancy, SQN score)
  • Benchmark comparison against OSEBX and other indices
  • Temporal performance patterns (time of day, day of week, month)
  • Leverage analysis for BULL/BEAR products

Machine Learning

  • Three production ML models: Logistic Regression, Random Forest, XGBoost
  • Feature set including 50+ technical indicators, price action variables, and macroeconomic inputs (VIX, oil prices, interest rates, financial ratios)
  • Custom target variable system for flexible model training
  • Temporal cross-validation to prevent lookahead bias
  • Adaptive filter indicators for regime detection

Risk Management

  • Monte Carlo simulation for portfolio risk assessment
  • Position sizing optimization
  • Post-exit analysis to identify opportunity costs

Opportunity Scanner

  • Scans major stock indices for entry signals
  • Real-time data via Yahoo Finance API
  • Ensemble signal from multiple ML models

Technical Architecture

app/
├── R/
│   ├── modules/           # Shiny modules (one per tab)
│   │   ├── mod_performance.R
│   │   ├── mod_ml_models.R
│   │   ├── mod_scanner.R
│   │   ├── mod_risk.R
│   │   └── mod_backtest.R
│   ├── utils/             # Shared utilities
│   │   ├── data_processing.R
│   │   ├── feature_engineering.R
│   │   ├── ml_training.R
│   │   └── plotting.R
│   └── config.R
├── app.R
└── DESCRIPTION

Lessons Learned

  • Modularizing a large Shiny app with {golem} dramatically improves maintainability
  • Yahoo Finance API rate limiting requires careful batching and caching
  • Temporal cross-validation (not random k-fold) is essential for honest ML evaluation in time series
  • Reactive value scoping bugs are the #1 source of Shiny headaches

Source Code

Available on GitHub — link here