From b41618c6276fb3110ec36c432d59934559aa5a87 Mon Sep 17 00:00:00 2001 From: ThotDjehuty Date: Fri, 6 Mar 2026 20:22:35 +0100 Subject: [PATCH] docs(theory): enrich Section 4 optimal control with 4 worked examples - Add HJB/PMP/HJBI comparison overview table - Add Merton 1969 portfolio allocation example (log-utility, constant fraction) - Add Almgren-Chriss inventory liquidation example (LQR + TWAP-like schedule) - Add PMP costate derivation for Merton problem - Add American option as viscosity example (variational inequality, smooth-pasting) - Explain jump integral term intuition in HJBI - Add shooting method pseudocode for PMP - Mirror all enrichments in LaTeX .tex source - Regenerate PDF (13 pages, cross-refs resolved) --- .../_static/mathematical_foundations.pdf | Bin 0 -> 77078 bytes .../_static/mathematical_foundations.tex | 941 ++++++++++++++++++ .../source/theory/mathematical_foundations.md | 209 +++- 3 files changed, 1135 insertions(+), 15 deletions(-) create mode 100644 docs/source/_static/mathematical_foundations.pdf create mode 100644 docs/source/_static/mathematical_foundations.tex diff --git a/docs/source/_static/mathematical_foundations.pdf b/docs/source/_static/mathematical_foundations.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f62ce2ca432e844f3cedb72a5b9c9e3ef98045d9 GIT binary patch literal 77078 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

hYD|W_J1zf!`wDJnFHM{}x#TgTDpGoTxBQER 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/mathematical_foundations.tex b/docs/source/_static/mathematical_foundations.tex new file mode 100644 index 0000000..38dbc3e --- /dev/null +++ b/docs/source/_static/mathematical_foundations.tex @@ -0,0 +1,941 @@ +\documentclass[11pt,a4paper]{article} + +%% ── Encoding & Fonts ──────────────────────────────────────────────────────── +\usepackage{fontspec} +\setmainfont{Latin Modern Roman} +\setsansfont{Latin Modern Sans} +\setmonofont{Latin Modern Mono} + +%% ── Maths ─────────────────────────────────────────────────────────────────── +\usepackage{amsmath,amssymb,amsthm,mathtools} +\usepackage{bm} % \bm for bold math + +%% ── Layout & Typography ───────────────────────────────────────────────────── +\usepackage[a4paper, margin=2.5cm]{geometry} +\usepackage{microtype} +\usepackage{parskip} +\usepackage{setspace} +\setstretch{1.1} + +%% ── Colour ────────────────────────────────────────────────────────────────── +\usepackage{xcolor} +\definecolor{optblue}{HTML}{1A3A5C} +\definecolor{optgold}{HTML}{C8960C} +\definecolor{defbg}{HTML}{EEF4FB} +\definecolor{thmbg}{HTML}{FFF8EC} +\definecolor{codebg}{HTML}{F5F5F5} + +%% ── Theorem environments ───────────────────────────────────────────────────── +\usepackage{tcolorbox} +\tcbuselibrary{skins,breakable} + +\newtcolorbox{defbox}[1]{ + breakable, enhanced, + colback=defbg, colframe=optblue, coltitle=white, + fonttitle=\bfseries\sffamily, + title={Definition — #1}, + arc=3pt, boxrule=0.6pt, left=6pt, right=6pt, top=4pt, bottom=4pt +} + +\newtcolorbox{thmbox}[1]{ + breakable, enhanced, + colback=thmbg, colframe=optgold, coltitle=white, + fonttitle=\bfseries\sffamily, + title={Theorem — #1}, + arc=3pt, boxrule=0.6pt, left=6pt, right=6pt, top=4pt, bottom=4pt +} + +\newtcolorbox{codebox}{ + breakable, enhanced, + colback=codebg, colframe=gray!40, + arc=2pt, boxrule=0.4pt, left=8pt, right=8pt, top=4pt, bottom=4pt, + fontupper=\ttfamily\small +} + +%% ── Tables ─────────────────────────────────────────────────────────────────── +\usepackage{booktabs} +\usepackage{tabularx} +\usepackage{array} +\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1}} +\newcolumntype{C}[1]{>{\centering\arraybackslash}p{#1}} + +%% ── Lists ──────────────────────────────────────────────────────────────────── +\usepackage{enumitem} +\setlist[itemize]{itemsep=2pt, topsep=4pt} +\setlist[enumerate]{itemsep=2pt, topsep=4pt} + +%% ── Section styling ────────────────────────────────────────────────────────── +\usepackage{titlesec} +\titleformat{\section}{\large\bfseries\sffamily\color{optblue}}{\thesection}{0.7em}{}[\color{optblue}\titlerule] +\titleformat{\subsection}{\normalsize\bfseries\sffamily\color{optblue}}{\thesubsection}{0.6em}{} +\titleformat{\subsubsection}{\normalsize\itshape\sffamily}{\thesubsubsection}{0.5em}{} + +%% ── Header / Footer ────────────────────────────────────────────────────────── +\usepackage{fancyhdr} +\pagestyle{fancy} +\fancyhf{} +\fancyhead[L]{\sffamily\small\color{gray} Optimiz-rs — Mathematical Foundations} +\fancyhead[R]{\sffamily\small\color{gray} \today} +\fancyfoot[C]{\sffamily\small\color{gray}\thepage} +\renewcommand{\headrulewidth}{0.4pt} + +%% ── Hyperlinks ─────────────────────────────────────────────────────────────── +\usepackage[unicode, colorlinks=true, linkcolor=optblue, urlcolor=optblue, citecolor=optgold]{hyperref} +\usepackage{bookmark} + +%% ── Listings (pseudocode) ──────────────────────────────────────────────────── +\usepackage{listings} +\lstset{ + backgroundcolor=\color{codebg}, + basicstyle=\ttfamily\small, + breaklines=true, + frame=single, framerule=0.4pt, rulecolor=\color{gray!40}, + xleftmargin=8pt, xrightmargin=8pt, + aboveskip=6pt, belowskip=6pt +} + +%% ── Misc macros ────────────────────────────────────────────────────────────── +\newcommand{\R}{\mathbb{R}} +\newcommand{\E}{\mathbb{E}} +\newcommand{\PP}{\mathbb{P}} +\newcommand{\KL}[2]{D_{\mathrm{KL}}\!\left(#1\,\|\,#2\right)} +\newcommand{\tr}{\operatorname{Tr}} +\newcommand{\N}{\mathcal{N}} + +%% ───────────────────────────────────────────────────────────────────────────── +\begin{document} + +\begin{titlepage} + \centering + \vspace*{2cm} + {\Huge\bfseries\sffamily\color{optblue} Mathematical Foundations\par} + \vspace{0.6cm} + {\large\sffamily Optimiz-rs — High-Performance Optimization in Rust\par} + \vspace{0.4cm} + {\large\sffamily\color{gray} Stochastic Processes · Jump Processes · Optimal Control\\ + Mean Field Games · Information Theory · Differential Geometry\par} + \vspace{1cm} + \textcolor{optgold}{\rule{0.5\linewidth}{1.5pt}} + \vspace{1cm} + + \begin{tabular}{rl} + \textbf{Version} & 0.1 \\ + \textbf{Date} & \today \\ + \textbf{Docs} & \url{https://optimiz-r.readthedocs.io} \\ + \textbf{Repo} & \url{https://github.com/ThotDjehuty/optimiz-rs} \\ + \end{tabular} + + \vfill + \textit{This document is auto-generated from \texttt{docs/source/theory/mathematical\_foundations.md}.} +\end{titlepage} + +\tableofcontents +\newpage + +%% ═══════════════════════════════════════════════════════════════════════════ +\section{Differential Evolution (DE)} +%% ═══════════════════════════════════════════════════════════════════════════ + +\subsection{Background} + +DE is a gradient-free population-based optimizer for $f: \R^d \to \R$, +not required to be smooth or convex. At generation $g$ we maintain $N$ candidate +solutions $\{\mathbf{x}_{i,g}\} \subset \R^d$. + +\textbf{Key insight:} The difference vector $\mathbf{x}_{r_2}-\mathbf{x}_{r_3}$ is an +unbiased directional finite-difference of $f$, so DE implicitly estimates curvature +without Jacobians. + +\subsection{Operators} + +\begin{center} +\begin{tabular}{L{3cm} L{7cm} L{3cm}} +\toprule +\textbf{Step} & \textbf{Formula} & \textbf{Role} \\ +\midrule +Mutation (rand/1) & + $\mathbf{v}_{i,g} = \mathbf{x}_{r_1} + F(\mathbf{x}_{r_2}-\mathbf{x}_{r_3})$ & + Explore \\[3pt] +Binomial crossover & + $u_{i,j} = v_{i,j}$ if $U(0,1)s$. + \item $W_t - W_s \sim \N(0, t-s)$ for all $0\le s2$). + \item \textbf{Self-similarity:} $c^{-1/2}W_{ct} \overset{d}{=} W_t$ (Hurst exponent $H=\tfrac12$). +\end{itemize} + +\textbf{Example — Geometric BM:} +$S_t = S_0 \exp\!\bigl((\mu-\tfrac12\sigma^2)t + \sigma W_t\bigr)$ +is the Black--Scholes price model (log-normal marginals, nowhere-differentiable paths). + +\subsection{Itô Calculus} + +\begin{defbox}{Itô Integral} +For adapted $f \in \mathcal{L}^2$ (i.e.\ $\E\!\int_0^T f_t^2\,dt < \infty$): +\[ + \int_0^T f_t\,dW_t \;=\; L^2\text{-}\lim_{|\pi|\to 0} \sum_{k} f_{t_k}(W_{t_{k+1}}-W_{t_k}). +\] +The Itô integral is a \textbf{martingale} with zero mean and \textbf{Itô isometry} +\[ + \E\!\left[\left(\int_0^T f_t\,dW_t\right)^{\!2}\right] = \E\int_0^T f_t^2\,dt. +\] +\end{defbox} + +\begin{thmbox}{Itô's Lemma} +For $dX_t = \mu_t\,dt + \sigma_t\,dW_t$ and $F \in C^{1,2}([0,T]\times\R)$: +\begin{equation} + dF(t,X_t) = \partial_t F\,dt + \partial_x F\,dX_t + \tfrac{1}{2}\partial_{xx}F\,\sigma_t^2\,dt. +\end{equation} +The correction term $\tfrac12\sigma^2\partial_{xx}F$ (absent in ordinary calculus) arises +from the non-zero quadratic variation $d[W]_t = dt$. +\end{thmbox} + +\textbf{Example:} Let $X_t = \log S_t$ with $dS_t = \mu S_t\,dt + \sigma S_t\,dW_t$. +Itô's Lemma gives +\[dX_t = \bigl(\mu - \tfrac12\sigma^2\bigr)\,dt + \sigma\,dW_t.\] + +\subsection{General Itô SDEs} + +\begin{equation} + dX_t = b(t, X_t)\,dt + \boldsymbol{\sigma}(t, X_t)\,dW_t,\quad X_0 = x_0. +\end{equation} + +\textbf{Existence \& uniqueness (Picard--Lindelöf):} If $b, \boldsymbol{\sigma}$ are +globally Lipschitz with linear growth, there exists a unique strong solution with +$\E[\sup_{t\le T}\|X_t\|^2]<\infty$. + +\medskip +\begin{center} +\begin{tabular}{L{3.5cm} L{6cm} L{4cm}} +\toprule +\textbf{Process} & \textbf{SDE} & \textbf{Stationary distribution} \\ +\midrule +Brownian motion & $dX = \sigma\,dW$ & — \\[3pt] +Geometric BM & $dX = \mu X\,dt + \sigma X\,dW$ & Log-normal \\[3pt] +Ornstein--Uhlenbeck & $dX = \kappa(\theta-X)\,dt + \sigma\,dW$ & $\mathcal{N}(\theta,\,\sigma^2/2\kappa)$ \\[3pt] +CIR & $dX = \kappa(\theta-X)\,dt + \sigma\sqrt{X}\,dW$ & Gamma$(2\kappa\theta/\sigma^2,\,\sigma^2/2\kappa)$ \\ +\bottomrule +\end{tabular} +\end{center} + +\subsection{Ornstein--Uhlenbeck Process (Mean-Reversion)} + +Used in Optimiz-rs's \texttt{sparse\_mean\_reversion} and \texttt{ou\_estimator} modules: +\begin{equation} + dX_t = \kappa(\theta - X_t)\,dt + \sigma\,dW_t. +\end{equation} + +\textbf{Closed-form solution:} +\begin{equation} + X_t = \theta + (X_0 - \theta)e^{-\kappa t} + \sigma\int_0^t e^{-\kappa(t-s)}\,dW_s. +\end{equation} + +\textbf{Half-life:} $\tau_{1/2} = \ln 2/\kappa$. With $\kappa=0.2$/day, half-life $\approx 3.5$ days. + +\textbf{MLE log-likelihood} (discrete observations at spacing $\Delta t$): +\begin{equation} + \ell(\kappa,\theta,\sigma) = -\frac{1}{2}\sum_{i=1}^{n}\left[ + \log(2\pi\hat\sigma_i^2) + \frac{(X_{t_i} - \hat\mu_i)^2}{\hat\sigma_i^2} + \right], +\end{equation} +where +$\hat\mu_i = \theta + (X_{t_{i-1}}-\theta)e^{-\kappa\Delta t}$ and +$\hat\sigma_i^2 = \dfrac{\sigma^2}{2\kappa}(1-e^{-2\kappa\Delta t})$. + +%% ═══════════════════════════════════════════════════════════════════════════ +\section{Jump Processes} +%% ═══════════════════════════════════════════════════════════════════════════ + +Many financial time series exhibit sudden large moves that Brownian motion cannot capture. + +\subsection{Poisson Process} + +\begin{defbox}{Poisson Process} +A counting process $N = (N_t)_{t\ge 0}$ is a \emph{Poisson process with intensity} +$\lambda > 0$ if: +\begin{enumerate} + \item $N_0 = 0$. + \item Independent, stationary increments. + \item $\PP(N_{t+h}-N_t=1) = \lambda h + o(h)$ and $\PP(\Delta N > 1) = o(h)$. +\end{enumerate} +Equivalently, $N_t \sim \text{Poisson}(\lambda t)$ and inter-arrival times are $\text{Exp}(\lambda)$. +The \emph{compensated} process $\tilde{N}_t = N_t - \lambda t$ is a martingale. +\end{defbox} + +\subsection{Compound Poisson Jump-Diffusion (Merton 1976)} + +\begin{equation} + \frac{dS_t}{S_{t^-}} = \mu\,dt + \sigma\,dW_t + + d\!\left(\sum_{k=1}^{N_t}(e^{J_k}-1)\right), +\end{equation} +with $N_t \sim \text{Poisson}(\lambda)$ and $J_k \sim \mathcal{N}(\mu_J, \sigma_J^2)$. + +\textbf{Merton option price} — a Poisson mixture of Black--Scholes prices: +\begin{equation} + C_{\text{Merton}} = \sum_{n=0}^\infty \frac{e^{-\lambda' T}(\lambda' T)^n}{n!} + \cdot C_{\text{BS}}\!\left(S_0, K, T, r_n, \sigma_n^2\right), +\end{equation} +where +\begin{align*} + \lambda' &= \lambda\, e^{\mu_J+\frac12\sigma_J^2},\\ + r_n &= r - \lambda\bigl(e^{\mu_J+\frac12\sigma_J^2}-1\bigr) + \frac{n(\mu_J+\tfrac12\sigma_J^2)}{T},\\ + \sigma_n^2 &= \sigma^2 + \frac{n\sigma_J^2}{T}. +\end{align*} + +\subsection{Lévy Processes and the Lévy--Khintchine Representation} + +\begin{thmbox}{Lévy--Khintchine} +Every Lévy process (independent, stationary increments) has characteristic function +\begin{equation} + \E[e^{i\xi X_t}] = \exp\!\left(t\left[ + ib\xi - \tfrac{1}{2}\sigma^2\xi^2 + + \int_{\R\setminus\{0\}} \bigl(e^{i\xi z}-1-i\xi z\,\mathbf{1}_{|z|\le1}\bigr)\nu(dz) + \right]\right), +\end{equation} +where $(b, \sigma^2, \nu)$ is the \emph{Lévy triplet} and $\nu$ the \emph{Lévy measure}, +satisfying $\int(1\wedge z^2)\nu(dz)<\infty$. +\end{thmbox} + +\begin{center} +\begin{tabular}{L{3.5cm} L{5.5cm} L{4cm}} +\toprule +\textbf{Process} & \textbf{Lévy measure $\nu$} & \textbf{Use case} \\ +\midrule +Brownian motion & $\nu=0$ & Continuous diffusion \\[3pt] +Compound Poisson & Finite measure & Rare large jumps \\[3pt] +Variance Gamma & $\nu(dz)\propto e^{-c|z|}/|z|$ & Equity returns \\[3pt] +CGMY & $e^{-G|z|}/|z|^{1+Y}$ (neg), $e^{-Mx}/x^{1+Y}$ (pos) & Heavy tails, $Y\in(0,2)$ \\[3pt] +$\alpha$-stable & $c|z|^{-1-\alpha}$ & Infinite-variance regimes \\ +\bottomrule +\end{tabular} +\end{center} + +\subsection{SDEs with Jumps — Generator and Itô Formula} + +\begin{equation} + dX_t = b(X_{t^-})\,dt + \sigma(X_{t^-})\,dW_t + + \int_{\R} c(X_{t^-}, z)\,\widetilde{N}(dt, dz), +\end{equation} +where $\widetilde{N}(dt,dz) = N(dt,dz) - \nu(dz)\,dt$ is the \emph{compensated jump measure}. + +\textbf{Itô formula for jump-diffusions:} +\begin{equation} + dF(X_t) = \mathcal{L}F\,dt + \partial_x F\,\sigma\,dW_t + + \int\bigl[F(X_{t^-}+c)-F(X_{t^-})\bigr]\widetilde{N}(dt,dz), +\end{equation} +where the \emph{generator} is +\begin{equation} + \mathcal{L}F = b\,\partial_x F + \tfrac12\sigma^2\partial_{xx}F + + \int\bigl[F(x+c)-F(x)-c\,\partial_x F\bigr]\nu(dz). +\end{equation} + +%% ═══════════════════════════════════════════════════════════════════════════ +\section{Optimal Control (HJB, PMP, Jumps)} +%% ═══════════════════════════════════════════════════════════════════════════ + +\textbf{Big picture.} Optimal control asks: \textit{given a stochastic system we can steer +with a control $u_t$, what policy minimises expected cost?} Three complementary tools +answer this: + +\medskip +\begin{center} +\begin{tabular}{L{2.5cm} L{4cm} L{3cm} L{4cm}} +\toprule +\textbf{Tool} & \textbf{Solves} & \textbf{Scales to} & \textbf{Intuition} \\ +\midrule +HJB PDE & Value function $V(t,x)$ & Low dim (PDE grid) & Dynamic programming \\ +PMP & Optimal paths $(X_t,p_t)$ & High dim (ODE) & Adjoint sensitivity \\ +HJBI & Same as HJB + jumps & Low dim & Non-local integral term \\ +\bottomrule +\end{tabular} +\end{center} + +\subsection{Stochastic Hamilton--Jacobi--Bellman Equation} + +\textbf{Setup.} The state $X_t \in \R^d$ evolves as +$dX_t = b(X_t,u_t)\,dt + \sigma(X_t,u_t)\,dW_t$, +and we minimise the total expected cost +\[ + J(t,x;u) = \E\!\left[\int_t^T \ell(X_s,u_s)\,ds + g(X_T)\,\Big|\,X_t=x\right]. +\] + +The \textbf{value function} $V(t,x) = \inf_u J(t,x;u)$ satisfies: +\begin{equation} + \boxed{ + -\partial_t V = \inf_{u\in\mathcal{U}}\Bigl[ + \underbrace{\ell(x,u)}_{\text{running cost}} + + \underbrace{\nabla_x V^{\!\top} b(x,u)}_{\text{1st-order drift}} + + \underbrace{\tfrac12\tr\!\bigl(\sigma\sigma^{\!\top}(x,u)\,\nabla_x^2 V\bigr)}_{\text{curvature correction}} + \Bigr],\quad V(T,\cdot)=g. + } +\end{equation} + +Under smooth $V$, the \textbf{feedback law} is +$u^\star(t,x) = \arg\min_u[\ell(x,u)+\nabla_x V^\top b(x,u)]$. + +%% ── Example: Merton portfolio ──────────────────────────────────────────── +\begin{tcolorbox}[breakable, enhanced, colback=green!5, colframe=green!40!black, + title={\sffamily\bfseries Example — Optimal Portfolio Allocation (Merton 1969)}, + arc=3pt, boxrule=0.6pt] +Investor wealth $X_t$ follows +$dX_t = (r + u_t(\mu-r))X_t\,dt + u_t\sigma X_t\,dW_t$, +with $u_t$ the fraction in the risky asset. Maximise $\E[\log X_T]$. + +\textbf{Ansatz} $V(t,x) = \ln x + f(t)$ substituted into HJB gives: +\[ + f'(t) = -r - \frac{(\mu-r)^2}{2\sigma^2}, \qquad f(T)=0. +\] +\textbf{Optimal Merton rule} (constant, independent of wealth and time): +\begin{equation} + u^\star = \frac{\mu - r}{\sigma^2}. +\end{equation} +Invest a fraction proportional to the Sharpe ratio and inversely to variance. +\end{tcolorbox} + +\textbf{LQR special case} ($\ell = x^\top Q x + u^\top R u$, $b=Ax+Bu$): +$V(t,x)=x^\top P(t)x + v(t)$ with $P$ solving the \emph{matrix Riccati ODE}: +\begin{equation} + -\dot{P} = A^\top P + PA - PBR^{-1}B^\top P + Q,\quad P(T)=Q_T. +\end{equation} +The optimal control is \textbf{linear feedback}: $u^\star_t = -R^{-1}B^\top P(t)X_t$. + +%% ── Example: Almgren-Chriss ────────────────────────────────────────────── +\begin{tcolorbox}[breakable, enhanced, colback=green!5, colframe=green!40!black, + title={\sffamily\bfseries Example — Optimal Inventory Liquidation (Almgren--Chriss)}, + arc=3pt, boxrule=0.6pt] +Trader liquidates $X_0$ shares by $T$. Inventory $X_t$, rate $u_t < 0$: +\[ + dX_t = u_t\,dt,\qquad \ell(x,u) = \alpha x^2 + \beta u^2. +\] +Deterministic LQR ($\sigma=0$), $A=0$, $B=1$, $Q=\alpha$, $R=\beta$. +Riccati solution gives the optimal TWAP-like schedule: +\begin{equation} + u^\star(t) = -\frac{\kappa}{\sinh(\kappa T)}\cosh(\kappa(T-t))\,X_0, + \qquad \kappa=\sqrt{\alpha/\beta}. +\end{equation} +Large $\kappa$ (high risk aversion, low impact) $\to$ aggressive front-loaded selling. +\end{tcolorbox} + +\subsection{Pontryagin Maximum Principle (PMP)} + +The PMP converts the HJB PDE into a \textbf{two-point boundary-value ODE}, +feasible in high dimensions where a grid is intractable. + +\begin{thmbox}{Pontryagin Maximum Principle} +Define the \textbf{Hamiltonian} $\mathcal{H}(x,u,p) = \ell(x,u)+p^\top b(x,u)$. +If $(X^\star, u^\star)$ is optimal, there exists a \textbf{costate} (adjoint) process +$p_t$ satisfying: +\begin{equation} + \dot{p}_t = -\nabla_x \mathcal{H}(X_t^\star, u_t^\star, p_t), + \quad p_T = \nabla_x g(X_T^\star), +\end{equation} +with the optimality condition +$u_t^\star = \arg\min_u \mathcal{H}(X_t^\star, u, p_t)$ holding a.e. +\end{thmbox} + +\textbf{Costate intuition.} $p_t$ is the \emph{shadow price} of state $X_t$: +\[ + p_t = \nabla_x V(t, X_t^\star) + = \frac{\partial(\text{optimal cost-to-go})}{\partial x}. +\] +Increasing the current state by $dx$ changes future cost by $p_t^\top dx$. +This is the continuous-time analogue of \textbf{backpropagation} through a +dynamical system — the costate = gradient of the loss w.r.t.\ state. + +\textbf{Shooting algorithm:} +\begin{codebox} +1. Guess costate p_0 +2. Integrate forward: dX = b(X, u*(X,p)) dt [state ODE] +3. Integrate backward: dp = -grad_x H(X, u*, p) dt [costate ODE] +4. Check boundary: p_T = grad g(X_T) +5. Not satisfied -> update p_0 (Newton/gradient) -> back to 2 +\end{codebox} + +%% ── Example: PMP for Merton ────────────────────────────────────────────── +\begin{tcolorbox}[breakable, enhanced, colback=green!5, colframe=green!40!black, + title={\sffamily\bfseries Example — PMP Costate for the Merton Problem}, + arc=3pt, boxrule=0.6pt] +With $g(x) = -\!\ln x$, the terminal costate is $p_T = -1/X_T^\star$. +The costate ODE $\dot{p}_t = -p_t(r+u^\star(\mu-r))$ integrates to +\[ + p_t = -\frac{e^{-(T-t)(r+u^\star(\mu-r))}}{X_t^\star}, +\] +confirming $p_t = \partial_x V = 1/x$ (log-utility shadow price is inverse wealth). +Optimality $\partial_u\mathcal{H}=0$ recovers $u^\star = (\mu-r)/\sigma^2$. +\end{tcolorbox} + +The costate pair $(X_t^\star, p_t)$ moves along Hamiltonian geodesics on +$T^\star\R^d$ — a direct link to symplectic geometry (\S\ref{sec:symplectic}). + +\subsection{HJB with Jumps (HJBI)} + +When the state can jump (\S3.4), the HJB equation gains a +\textbf{non-local integral operator}: +\begin{equation} + -\partial_t V = \inf_{u}\Bigl[ + \ell + \nabla V^\top b + \tfrac12\tr(\sigma\sigma^\top\nabla^2 V) + + \underbrace{\int\bigl[V(x+c)-V(x)-\nabla V^\top c\bigr]\nu(dz)}_{\text{expected value change from jumps}} + \Bigr]. +\end{equation} + +\textbf{Intuition for the integral term.} A jump of size $c$ moves the state from $x$ +to $x+c$, changing the value function by $V(x+c)-V(x)$. The compensator +$\nabla V^\top c$ subtracts the linear part already counted by the drift, +following Itô's formula for jump processes. + +%% ── Example: jumps in inventory ───────────────────────────────────────── +\begin{tcolorbox}[breakable, enhanced, colback=green!5, colframe=green!40!black, + title={\sffamily\bfseries Example — Optimal Execution with Jump Risk}, + arc=3pt, boxrule=0.6pt] +Extend the inventory model with Poisson order-flow shocks: +\[ + dX_t = u_t\,dt + d\!\left(\sum_{k=1}^{N_t} Z_k\right), + \quad Z_k \sim \mathcal{N}(0,\sigma_J^2),\; N_t\sim\text{Poisson}(\lambda). +\] +The HJBI for $V(t,x)$ becomes: +\[ + -\partial_t V = \inf_u\Bigl[\alpha x^2 + \beta u^2 + \partial_x V\,u + + \lambda\,\E_z[V(x+z)-V(x)-z\,\partial_x V]\Bigr]. +\] +With Gaussian jumps the expectation evaluates to +$\tfrac12\lambda\sigma_J^2\,\partial_{xx}V$, so the HJBI reduces to the same Riccati +ODE but with \textbf{effective diffusion} $\sigma_{\rm eff}^2 = \lambda\sigma_J^2$: +order-flow risk acts like additional Brownian volatility, accelerating the sell schedule. +\end{tcolorbox} + +\subsection{Viscosity Solutions} + +When $V$ fails to be $C^{1,2}$ (degenerate diffusion, constraints, non-smooth terminal +payoff), classical solutions may not exist. \textbf{Viscosity solutions} +(Crandall--Lions 1983) provide a rigorous weak notion restoring existence and uniqueness. + +\textbf{Why they matter in practice:} HJB is solved on a grid where $V$ is only +piecewise smooth. Viscosity theory guarantees the numerical scheme converges to +the true solution. + +\begin{defbox}{Viscosity Subsolution} +A continuous $V$ is a viscosity \emph{subsolution} if for every smooth $\phi$ +touching $V$ \textbf{from above} at $(t_0,x_0)$ (i.e.\ $V-\phi$ has a local maximum): +\[ + -\partial_t\phi(t_0,x_0) \le + \inf_u\Bigl[\ell(x_0,u) + \nabla_x\phi^\top b + \tfrac12\tr(\sigma\sigma^\top\nabla^2\phi)\Bigr]. +\] +A \emph{supersolution} reverses the inequality with a test touching from \emph{below}. +The unique viscosity \textbf{solution} is simultaneously both. +\end{defbox} + +\textbf{Practical interpretation.} Classical calculus requires $V$ to satisfy the PDE +pointwise. Viscosity theory says $V$ satisfies it in an averaged sense via smooth test +functions — valid even at kinks and free boundaries. + +%% ── Example: American option ───────────────────────────────────────────── +\begin{tcolorbox}[breakable, enhanced, colback=green!5, colframe=green!40!black, + title={\sffamily\bfseries Example — American Option as a Viscosity Problem}, + arc=3pt, boxrule=0.6pt] +An American put with payoff $g(x)=(K-x)^+$ satisfies the \textbf{variational inequality}: +\[ + \min\Bigl(-\partial_t V - \mathcal{L}_{\rm BS}V,\; V - (K-x)^+\Bigr) = 0, +\] +where $\mathcal{L}_{\rm BS}V = rx\partial_x V + \tfrac12\sigma^2 x^2\partial_{xx}V - rV$. +\begin{itemize} + \item \textbf{Continuation region} ($V>(K-x)^+$): Black--Scholes PDE holds. + \item \textbf{Exercise region} ($V=(K-x)^+$): option exercised immediately. +\end{itemize} +At the free boundary, $\partial_x V$ is continuous (\emph{smooth-pasting}) but +$\partial_{xx}V$ is not — so $V\in C^1$ but $V\notin C^2$. +Viscosity theory handles this kink without modification. +\end{tcolorbox} + +The backward DP converges to the viscosity solution under the CFL condition +$\Delta t \le C\,(\Delta x)^2$. + +%% ═══════════════════════════════════════════════════════════════════════════ +\section{Mean Field Games (1D Solver)} +%% ═══════════════════════════════════════════════════════════════════════════ + +MFG couples a \textbf{backward HJB} (individual value) with a +\textbf{forward Fokker--Planck} (population density): + +\begin{align} + \text{HJB (backward):}\quad + &{-\partial_t u - \nu\partial_{xx}u + H(x,\partial_x u, m) = 0,} + &u(T,x)&=g(x),\\ + \text{Fokker--Planck (forward):}\quad + &{\partial_t m - \nu\partial_{xx}m - \partial_x(m\,\partial_p H) = 0,} + &m(0,x)&=m_0(x). +\end{align} + +\textbf{Coupling:} $H$ depends on $m$ (mean-field interaction), creating a fixed-point problem. + +\textbf{Fixed-point algorithm:} +\begin{codebox} +1. Initialise m^0 = m_0 (e.g. Gaussian) +2. Solve HJB backward -> u^{k+1} +3. Extract optimal drift: alpha*(x,t) = -d_p H(x, d_x u^{k+1}, m^k) +4. Solve Fokker-Planck forward with alpha* -> m^{k+1} +5. Check ||m^{k+1} - m^k||_1 < eps; if not, k++ -> go to 2 +\end{codebox} + +\textbf{Convergence:} For monotone coupling (Lasry--Lions 2007), the system has a unique +solution and the fixed-point iteration contracts. Monitor both +$\|m^{k+1}-m^k\|_1$ and $\|u^{k+1}-u^k\|_\infty$. + +%% ═══════════════════════════════════════════════════════════════════════════ +\section{Kalman Filtering} +%% ═══════════════════════════════════════════════════════════════════════════ + +\subsection{Linear-Gaussian State Space} + +\begin{equation} + \mathbf{x}_t = F\mathbf{x}_{t-1} + \mathbf{w}_t,\quad + \mathbf{w}_t\sim\mathcal{N}(0,Q);\qquad + \mathbf{y}_t = H\mathbf{x}_t + \mathbf{v}_t,\quad + \mathbf{v}_t\sim\mathcal{N}(0,R). +\end{equation} + +\textbf{Predict:} +\begin{equation} + \hat{\mathbf{x}}^-_t = F\hat{\mathbf{x}}_{t-1},\qquad + P^-_t = FP_{t-1}F^\top+Q. +\end{equation} + +\textbf{Update:} +\begin{align} + K_t &= P^-_t H^\top(HP^-_t H^\top + R)^{-1},\\ + \hat{\mathbf{x}}_t &= \hat{\mathbf{x}}^-_t + K_t(\mathbf{y}_t - H\hat{\mathbf{x}}^-_t),\\ + P_t &= (I-K_t H)P^-_t. +\end{align} + +$K_t$ is the \emph{Kalman gain} — it interpolates between full prior trust ($K\to0$) +and full observation trust ($K\to H^{-1}$). + +\subsection{Information-Theoretic View} + +The Kalman filter computes the exact conditional mean +$\hat{\mathbf{x}}_t = \E[\mathbf{x}_t \mid \mathbf{y}_{1:t}]$ in Gaussian models +and minimises $\KL{p(\mathbf{x}_t|\mathbf{y}_{1:t})}{\mathcal{N}(\hat{\mathbf{x}}_t, P_t)}$ +over all Gaussian approximations. + +\subsection{Continuous-Time Limit (Kalman--Bucy)} + +For $d\mathbf{X}_t = A\mathbf{X}_t\,dt + B\,d\mathbf{W}_t$, +$d\mathbf{Y}_t = C\mathbf{X}_t\,dt + d\mathbf{V}_t$, the error covariance satisfies +the \emph{Riccati ODE}: +\begin{equation} + \dot{P} = AP + PA^\top + BQB^\top - PC^\top R^{-1}CP,\qquad P(0)=P_0. +\end{equation} + +%% ═══════════════════════════════════════════════════════════════════════════ +\section{MCMC (Metropolis--Hastings and Langevin)} +%% ═══════════════════════════════════════════════════════════════════════════ + +\subsection{Metropolis--Hastings} + +For target $\pi(x) \propto e^{-U(x)}$ and proposal $q(x'\mid x)$: +\begin{equation} + \alpha(x\to x') = \min\!\left(1, \frac{\pi(x')q(x\mid x')}{\pi(x)q(x'\mid x)}\right). +\end{equation} + +\textbf{Detailed balance} $\pi(x)\alpha(x\to x') = \pi(x')\alpha(x'\to x)$ +ensures $\pi$ is the unique stationary distribution. + +\textbf{Optimal scaling:} With Gaussian proposal $q(x'|x)=\mathcal{N}(x,h^2 I_d)$, +the step $h^\star \approx 2.38/\sqrt{d}$ (Roberts--Gelman--Gilks 1997) targets $\approx 23$--$45\%$ +acceptance. + +\subsection{Langevin Dynamics (MALA)} + +Metropolis-Adjusted Langevin proposal: +\begin{equation} + x' = x - \tfrac{h^2}{2}\nabla U(x) + h\,\xi, \quad \xi\sim\mathcal{N}(0,I_d), +\end{equation} +a discretisation of the \emph{overdamped Langevin SDE}: +\begin{equation} + dX_t = -\nabla U(X_t)\,dt + \sqrt{2}\,dW_t, +\end{equation} +whose stationary distribution is exactly $\pi \propto e^{-U}$ (Fokker--Planck analysis). + +MALA converges in $O(d^{1/3})$ steps vs $O(d)$ for RW-MH — a key advantage +for high-dimensional posteriors. + +%% ═══════════════════════════════════════════════════════════════════════════ +\section{Hidden Markov Models (HMM)} +%% ═══════════════════════════════════════════════════════════════════════════ + +\subsection{Model} + +Latent Markov chain $Z_t \in \{1,\ldots,K\}$ with transition matrix +$A_{ij}=\PP(Z_t=j\mid Z_{t-1}=i)$ generates observations +$Y_t \mid Z_t=k \sim B_k(y)$. + +\subsection{Baum--Welch (EM)} + +\textbf{E-step (forward--backward):} +\begin{align} + \alpha_t(k) &= B_k(y_t)\sum_j \alpha_{t-1}(j)A_{jk}, & + \beta_t(k) &= \sum_j A_{kj}B_j(y_{t+1})\beta_{t+1}(j).\\[4pt] + \gamma_t(k) &= \frac{\alpha_t(k)\beta_t(k)}{\sum_j \alpha_t(j)\beta_t(j)}, & + \xi_t(j,k) &= \frac{\alpha_t(j)A_{jk}B_k(y_{t+1})\beta_{t+1}(k)}{\mathcal{L}}. +\end{align} + +\textbf{M-step:} +\begin{equation} + \hat{A}_{jk} = \frac{\sum_t \xi_t(j,k)}{\sum_t\gamma_t(j)}, \qquad + \hat{\mu}_k = \frac{\sum_t \gamma_t(k)\,y_t}{\sum_t \gamma_t(k)}. +\end{equation} + +\textbf{Information-theoretic view:} Baum--Welch is EM on the complete-data log-likelihood; +each iteration monotonically increases $\mathcal{L}(\theta)$ by Jensen's inequality. + +\textbf{Viterbi (MAP path):} Replace sum-product with max-product: +$\delta_t(k) = \max_j \delta_{t-1}(j)A_{jk} \cdot B_k(y_t)$, runs in $O(TK^2)$. + +%% ═══════════════════════════════════════════════════════════════════════════ +\section{Information Theory} +%% ═══════════════════════════════════════════════════════════════════════════ + +\subsection{Entropy and KL Divergence} + +\begin{defbox}{KL Divergence} +For densities $p, q$: +\begin{equation} + \KL{p}{q} = \int p(x)\log\frac{p(x)}{q(x)}\,dx \;\ge\; 0, +\end{equation} +with equality iff $p=q$ a.e.\ (Gibbs' inequality). Non-symmetric. +\end{defbox} + +\textbf{Connection to model selection:} +AIC $= 2k - 2\ln\hat{\mathcal{L}}$ and BIC $= k\ln n - 2\ln\hat{\mathcal{L}}$ +bound $\KL{p_{\text{true}}}{p_\theta}$. + +\subsection{Fisher Information} + +\begin{defbox}{Fisher Information Matrix} +For parametric model $p(x;\theta)$: +\begin{equation} + \mathcal{I}(\theta)_{ij} + = \E_{x\sim p}\!\left[\partial_{\theta_i}\log p\;\partial_{\theta_j}\log p\right] + = -\E\!\left[\partial^2_{\theta_i\theta_j}\log p\right]. +\end{equation} +\end{defbox} + +\textbf{Cramér--Rao bound:} Any unbiased estimator $\hat{\theta}$ satisfies +$\operatorname{Cov}(\hat{\theta}) \succeq \mathcal{I}(\theta)^{-1}$. +MLE achieves equality asymptotically. + +\textbf{Example — Gaussian emission} $B_k = \mathcal{N}(\mu_k,\sigma_k^2)$: +$\mathcal{I}(\mu_k)=\sigma_k^{-2}$,\quad $\mathcal{I}(\sigma_k^2)=(2\sigma_k^4)^{-1}$. + +\subsection{Mutual Information and Feature Relevance} + +\begin{equation} + I(X;Y) = \KL{p(X,Y)}{p(X)p(Y)} = H(X) - H(X\mid Y) \ge 0. +\end{equation} + +\textbf{mRMR criterion} (minimum redundancy, maximum relevance): +\begin{equation} + \max_{Y_i} \Bigl[I(Y_i;\text{target}) - \frac{1}{|S|}\sum_{Y_j\in S}I(Y_i;Y_j)\Bigr]. +\end{equation} + +\subsection{Natural Gradient (Preview)} + +Classical gradient descent ignores the geometry of parameter space. The \emph{natural gradient} +replaces $\nabla_\theta\mathcal{L}$ with $\mathcal{I}(\theta)^{-1}\nabla_\theta\mathcal{L}$, +giving a reparametrisation-invariant update — see \S\ref{sec:infogeo} for the full development. + +%% ═══════════════════════════════════════════════════════════════════════════ +\section{Differential Geometry} +%% ═══════════════════════════════════════════════════════════════════════════ + +\subsection{Riemannian Manifolds} + +\begin{defbox}{Riemannian Manifold} +A \emph{Riemannian manifold} $(M, g)$ is a smooth manifold $M$ with a +\emph{metric tensor} $g_p$: a symmetric, positive-definite bilinear form on each +tangent space $T_p M$. +\end{defbox} + +\textbf{Geodesics} (locally shortest paths) satisfy: +\begin{equation} + \ddot\gamma^k + \sum_{i,j}\Gamma^k_{ij}\,\dot\gamma^i\dot\gamma^j = 0, +\end{equation} +where +$\Gamma^k_{ij} = \tfrac12 g^{kl}(\partial_i g_{jl}+\partial_j g_{il}-\partial_l g_{ij})$ +are the \emph{Christoffel symbols} encoding intrinsic curvature. + +\subsection{Information Geometry and Fisher--Rao Metric} +\label{sec:infogeo} + +The statistical manifold $\mathcal{M} = \{p(\cdot;\theta)\}$ carries the +\textbf{Fisher--Rao metric} $g_{ij}(\theta) = \mathcal{I}(\theta)_{ij}$. + +\textbf{Natural gradient (Amari 1998):} Steepest descent on $(\mathcal{M}, g)$: +\begin{equation} + \theta \leftarrow \theta - \eta\,\mathcal{I}(\theta)^{-1}\nabla_\theta\mathcal{L}. +\end{equation} + +This is \emph{invariant to reparametrisation} and achieves quadratic convergence +on convex objectives — equivalent to Fisher scoring. + +\textbf{KL geometry:} +\begin{equation} + \KL{p_\theta}{p_{\theta+d\theta}} + = \tfrac12\,d\theta^\top\mathcal{I}(\theta)\,d\theta + O(\|d\theta\|^3), +\end{equation} +confirming Fisher--Rao as the intrinsic KL metric. + +\textbf{Dually flat structure:} Exponential families +$p(x;\theta)=h(x)\exp(\theta^\top T(x)-A(\theta))$ +are $e$-flat in natural parameters and $m$-flat in mean parameters +$\eta=\nabla A(\theta)$, with vanishing sectional curvature $K=0$ — +explaining exact Newton/natural-gradient convergence on these models. + +\subsection{Lie Groups and Geometric Control} + +\begin{defbox}{Lie Group} +A \emph{Lie group} $G$ is a smooth manifold with a group structure where +multiplication and inversion are smooth. The \emph{Lie algebra} $\mathfrak{g} = T_e G$ +linearises the group at the identity. +\end{defbox} + +\textbf{Examples:} $SO(d)$ (rotation group), $GL(d)$ (invertible matrices), +Heisenberg group (path-signature features). + +\textbf{Left-invariant control system on $G$:} +\begin{equation} + \dot{g}(t) = g(t)\,\xi(t), \quad g\in G,\; \xi(t)\in\mathfrak{g}. +\end{equation} + +PMP on Lie groups yields the \emph{Lie--Poisson (Euler--Poincaré) equations} +(Holm--Marsden--Ratiu), providing structure-preserving optimal trajectories. + +\subsection{Symplectic Geometry and Hamiltonian Structure} +\label{sec:symplectic} + +The phase space $(T^\star M, \omega)$ carries the symplectic 2-form +$\omega = \sum_i dp_i \wedge dq_i$. Hamilton's equations preserve $\omega$ +(\emph{Liouville's theorem} — phase-space volume conserved). + +\textbf{Connection to PMP:} The costate pair $(X_t^\star, p_t)$ solves +Hamilton's equations, i.e., the PMP is a symplectic flow on $T^\star\R^d$. + +\textbf{Symplectic integrators} (Störmer--Verlet, Ruth--Forest) preserve $\omega$ +discretely, keeping the Hamiltonian nearly constant over long horizons. + +\subsection{Sectional Curvature and Landscape Geometry} + +The sectional curvature $K(\sigma)$ governs how quickly nearby geodesics diverge: + +\begin{center} +\begin{tabular}{L{3cm} L{5cm} L{5cm}} +\toprule +$K>0$ (sphere) & Geodesics converge & Compact optimiser trajectories \\ +$K=0$ (flat) & Euclidean behaviour & Newton / natural gradient exact \\ +$K<0$ (hyperbolic) & Exponential spread & Efficient landscape exploration \\ +\bottomrule +\end{tabular} +\end{center} + +For exponential families in natural/mean parameters, $K=0$ — explaining exact +Newton convergence without curvature correction. + +%% ═══════════════════════════════════════════════════════════════════════════ +\section*{Quick Reference} +%% ═══════════════════════════════════════════════════════════════════════════ +\addcontentsline{toc}{section}{Quick Reference} + +\begin{center} +\small +\begin{tabularx}{\linewidth}{L{3.8cm} X L{3.2cm}} +\toprule +\textbf{Concept} & \textbf{Key equation / object} & \textbf{Module} \\ +\midrule +Brownian motion & $W_t - W_s \sim \mathcal{N}(0,t-s)$ & \texttt{point\_processes} \\ +Itô SDE & $dX=b\,dt+\sigma\,dW$ & \texttt{ou\_estimator} \\ +Poisson / Compound Poisson& $N_t\sim\text{Poisson}(\lambda t)$ & \texttt{point\_processes} \\ +Lévy process & triplet $(b,\sigma^2,\nu)$ & \texttt{point\_processes} \\ +HJB PDE & $-\partial_t V = \inf_u[\ell + \nabla V^\top b + \tfrac12\tr\sigma\sigma^\top\nabla^2 V]$ & \texttt{optimal\_control} \\ +HJBI (jumps) & $+\int[V(\cdot+c)-V-\nabla V^\top c]\nu\,dz$ & \texttt{optimal\_control} \\ +PMP costate & $\dot{p} = -\nabla_x\mathcal{H}$,\; $u^\star=\arg\min_u\mathcal{H}$ & \texttt{optimal\_control} \\ +MFG (HJB + KFP) & fixed-point $u,m$ & \texttt{mean\_field\_games} \\ +Kalman filter & $K_t = P^-H^\top(HP^-H^\top+R)^{-1}$ & \texttt{optimal\_control} \\ +MALA & $x'=x-\tfrac{h^2}{2}\nabla U+h\xi$ & \texttt{mcmc} \\ +HMM & Baum--Welch EM + Viterbi & \texttt{hmm} \\ +Fisher information & $\mathcal{I}_{ij}=\E[\partial_i\ell\,\partial_j\ell]$ & \texttt{hmm}, \texttt{sparse} \\ +Natural gradient & $\mathcal{I}^{-1}\nabla_\theta\mathcal{L}$ & \texttt{differential\_evolution} \\ +Riemannian / Lie geometry & Christoffel symbols, Lie--Poisson eqs & experimental \\ +DE (jDE) & mutation + crossover + selection & \texttt{differential\_evolution} \\ +\bottomrule +\end{tabularx} +\end{center} + +%% ═══════════════════════════════════════════════════════════════════════════ +\section*{References} +%% ═══════════════════════════════════════════════════════════════════════════ +\addcontentsline{toc}{section}{References} + +\begin{enumerate}[label={[\arabic*]}, leftmargin=2em] + \item Øksendal, B. \textit{Stochastic Differential Equations}, 6th ed. Springer, 2003. + \item Cont, R. \& Tankov, P. \textit{Financial Modelling with Jump Processes}. CRC Press, 2004. + \item Fleming, W.H. \& Soner, H.M. \textit{Controlled Markov Processes and Viscosity Solutions}. Springer, 2006. + \item Lasry, J.-M. \& Lions, P.-L. ``Mean field games.'' \textit{Jpn.\ J.\ Math.}\ \textbf{2} (2007) 229--260. + \item Amari, S. \textit{Information Geometry and Its Applications}. Springer, 2016. + \item do Carmo, M.P. \textit{Riemannian Geometry}. Birkhäuser, 1992. + \item Holm, D.D., Marsden, J.E. \& Ratiu, T.S. ``The Euler--Poincaré equations.'' \textit{Adv.\ Math.}\ \textbf{137} (1998). + \item Price, K.V., Storn, R.M. \& Lampinen, J.A. \textit{Differential Evolution}. Springer, 2005. + \item Roberts, G.O., Gelman, A. \& Gilks, W.R. ``Weak convergence of Metropolis algorithms.'' (1997). + \item Merton, R.C. ``Option pricing when underlying stock returns are discontinuous.'' \textit{JFE}\ \textbf{3} (1976). + \item Crandall, M.G. \& Lions, P.-L. ``Viscosity solutions of Hamilton--Jacobi equations.'' \textit{Trans.\ AMS} (1983). +\end{enumerate} + +\end{document} diff --git a/docs/source/theory/mathematical_foundations.md b/docs/source/theory/mathematical_foundations.md index b0e0e16..2db0ac3 100644 --- a/docs/source/theory/mathematical_foundations.md +++ b/docs/source/theory/mathematical_foundations.md @@ -235,69 +235,248 @@ $$\mathcal{L}F = b\,\partial_x F + \tfrac12\sigma^2\partial_{xx}F ## 4 · Optimal Control (HJB, PMP, Jumps) +**Big picture.** Optimal control asks: *given a stochastic system we can steer with a +control $u_t$, what policy minimises expected cost?* Three complementary tools answer this: + +| Tool | Solves | Scales to | Intuition | +|------|--------|-----------|-----------| +| HJB PDE | Value function $V(t,x)$ | Low dim (PDE grid) | Dynamic programming | +| PMP | Optimal paths $(X_t,p_t)$ | High dim (ODE) | Adjoint sensitivity | +| HJBI | Same as HJB + jumps | Low dim | Non-local integral term | + +--- + ### 4.1 Stochastic HJB -For $dX_t = b(X_t,u_t)\,dt + \sigma(X_t,u_t)\,dW_t$, minimising -$J = \mathbb{E}[\int_0^T \ell\,dt + g(X_T)]$, the value function -$V(t,x) = \inf_u J$ satisfies: +**Setup.** The state $X_t \in \mathbb{R}^d$ evolves as + +$$dX_t = b(X_t,u_t)\,dt + \sigma(X_t,u_t)\,dW_t,$$ + +and we minimise the total expected cost + +$$J(t,x;u) = \mathbb{E}\!\left[\int_t^T \ell(X_s,u_s)\,ds + g(X_T)\,\Big|\,X_t=x\right].$$ + +The **value function** $V(t,x) = \inf_u J(t,x;u)$ satisfies: $$-\partial_t V = \inf_{u\in\mathcal{U}}\Bigl[\ell(x,u) + \nabla_x V^{\!\top} b(x,u) + \tfrac12\operatorname{Tr}\bigl(\sigma\sigma^{\!\top}(x,u)\,\nabla_x^2 V\bigr)\Bigr], \quad V(T,\cdot)=g.$$ -Under smooth $V$, the feedback law is -$u^\star(t,x) = \arg\min_u[\ell(x,u)+\nabla_x V^\top b(x,u)]$. +**Intuition.** The three terms inside the infimum are: +- $\ell(x,u)$ — instantaneous running cost (pay now), +- $\nabla_x V^\top b$ — drift of the value (first-order) +- $\tfrac12\operatorname{Tr}(\sigma\sigma^\top\nabla^2 V)$ — curvature correction due to noise + (the stochastic analogue of a second-order Taylor term). -**LQR special case** ($\ell = x^\top Q x + u^\top R u$, $b=Ax+Bu$): +Under smooth $V$, the **feedback law** is +$u^\star(t,x) = \arg\min_u[\ell(x,u)+\nabla_x V^\top b(x,u)].$ + +--- + +::::{admonition} Example — Optimal Portfolio Allocation +:class: note + +Investor wealth $X_t$ follows +$dX_t = (r + u_t(\mu-r))X_t\,dt + u_t\sigma X_t\,dW_t$, +where $u_t\in\mathbb{R}$ is the fraction invested in the risky asset. + +Minimise $-\mathbb{E}[\log X_T]$ (maximise expected log-utility). + +**Ansatz:** $V(t,x) = \ln x + f(t)$. Substituting into HJB: + +$$f'(t) = -r - \frac{(\mu-r)^2}{2\sigma^2},\qquad f(T)=0.$$ + +The **optimal Merton rule** is constant: + +$$u^\star = \frac{\mu-r}{\sigma^2} \quad (\text{fraction in risky asset}).$$ + +This is the classic Merton (1969) result: invest a fixed fraction proportional to +the Sharpe ratio and inversely to variance — independent of wealth and time. +:::: + +--- + +**LQR special case** ($\ell = x^\top Q x + u^\top R u$, $b=Ax+Bu$, +$\sigma$ constant): $V(t,x)=x^\top P(t)x + v(t)$ with $P$ solving the *matrix Riccati ODE*: $$-\dot P = A^\top P + PA - PBR^{-1}B^\top P + Q,\quad P(T)=Q_T.$$ +The optimal control is **linear feedback**: $u^\star_t = -R^{-1}B^\top P(t)X_t$. + +--- + +::::{admonition} Example — Optimal Inventory (Almgren–Chriss liquidation) +:class: note + +A trader must liquidate $X_0$ shares by time $T$. Inventory $X_t$, trading rate $u_t<0$: + +$$dX_t = u_t\,dt, \quad +\ell(x,u) = \underbrace{\alpha x^2}_{\text{risk}} + \underbrace{\beta u^2}_{\text{impact}}.$$ + +This is a **deterministic LQR** ($\sigma=0$) with +$A=0$, $B=1$, $Q=\alpha$, $R=\beta$. +The Riccati solution gives the TWAP-like schedule + +$$u^\star(t,x) = -\frac{\alpha}{\beta}\cdot\frac{\sinh(\kappa(T-t))}{\sinh(\kappa T)}\cdot X_0, +\quad \kappa=\sqrt{\alpha/\beta}.$$ + +Large $\kappa$ (high risk aversion or low impact cost) → aggressive front-loaded selling. +:::: + +--- + ### 4.2 Pontryagin Maximum Principle The PMP avoids the curse of dimensionality — it converts the HJB PDE into a -two-point boundary-value problem in $(X_t, p_t)$. +**two-point boundary-value ODE** in $(X_t, p_t)$, making it feasible in high dimensions +where a PDE grid is intractable. ::::{admonition} Theorem (PMP) :class: tip -Define the Hamiltonian $\mathcal{H}(x,u,p) = \ell(x,u)+p^\top b(x,u)$. -If $(X^\star, u^\star)$ is optimal, there exists a costate process $p_t$ with: +Define the **Hamiltonian** $\mathcal{H}(x,u,p) = \ell(x,u)+p^\top b(x,u)$. +If $(X^\star, u^\star)$ is optimal, there exists a **costate** (adjoint) process $p_t$ with: $$\dot p_t = -\nabla_x \mathcal{H}(X_t^\star, u_t^\star, p_t),\quad p_T = \nabla_x g(X_T^\star),$$ and the optimality condition $u_t^\star = \arg\min_u \mathcal{H}(X_t^\star, u, p_t)$ holds a.e. :::: +**Costate intuition.** $p_t$ is the *shadow price* of state $X_t$: + +$$p_t = \nabla_x V(t, X_t^\star) = \frac{\partial (\text{optimal cost-to-go})}{\partial x}.$$ + +Increasing the current state by $dx$ changes future cost by $p_t^\top dx$. +This is exactly the adjoint/backpropagation equation of deep learning — PMP is the +continuous-time version of gradient backpropagation through a dynamical system. + +**Algorithm (shooting method):** + +``` +1. Guess costate p_0 +2. Integrate forward: dX = b(X, u*(X,p)) dt (state ODE) +3. Integrate backward: dp = -∇_x H(X, u*, p) dt (costate ODE) +4. Check boundary condition: p_T = ∇g(X_T) +5. If not satisfied -> update p_0 (Newton / gradient) -> go to 2 +``` + +--- + +::::{admonition} Example — PMP for the Merton Problem +:class: note + +With $\ell = 0$, $g(x) = -\ln x$, $b = (r+u(\mu-r))x$, $\sigma^\top\sigma = u^2\sigma^2 x^2$, +the Hamiltonian is $\mathcal{H}(x,u,p) = p(r+u(\mu-r))x$. + +**Costate ODE:** +$\dot p_t = -\partial_x \mathcal{H} = -p_t(r+u^\star(\mu-r))$, +with terminal $p_T = -1/X_T^\star$. + +**Optimality condition** $\partial_u\mathcal{H}=0$ gives +$p_t(\mu-r)x + \partial_u(\tfrac12\sigma^2 u^2 x^2 \partial_{xx}V)=0$, +recovering $u^\star = (\mu-r)/\sigma^2$ as before. + +The costate path $p_t = -e^{-(T-t)(r+(\mu-r)u^\star)}/X_t^\star$ confirms that the +shadow price scales inversely with wealth. +:::: + +--- + The costate pair $(X_t^\star, p_t)$ moves along Hamiltonian geodesics on $T^\star\mathbb{R}^d$ — a direct link to symplectic geometry (§10.4). +--- + ### 4.3 HJB with Jumps (HJBI) -Adding the jump term from §3.4, the HJB equation gains a non-local integral operator: +When the state can jump (§3.4), the HJB equation gains a **non-local integral operator**: $$-\partial_t V = \inf_{u}\Bigl[\ell + \nabla V^\top b + \tfrac12\operatorname{Tr}(\sigma\sigma^\top\nabla^2 V) -+ \int\bigl[V(x+c)-V(x)-\nabla V^\top c\bigr]\nu(dz)\Bigr].$$ ++ \underbrace{\int\bigl[V(x+c(x,u,z))-V(x)-\nabla V^\top c(x,u,z)\bigr]\nu(dz)}_{\text{expected value change from jumps}}\Bigr].$$ + +**Intuition for the integral term.** A jump of size $c$ moves the state from $x$ to +$x+c$, changing the value function by $V(x+c)-V(x)$. The compensator $\nabla V^\top c$ +subtracts the linear part already counted in the drift, following Itô's formula for +jump processes (§3.4). The `optimal_control` module discretises the integral on a truncated support $[-z_{\max}, z_{\max}]$ using Gaussian quadrature. +--- + +::::{admonition} Example — Optimal Execution with Jump Risk +:class: note + +Extend the inventory model with Poisson order-flow shocks: + +$$dX_t = u_t\,dt + \Delta J_t,\quad \Delta J_t \sim \text{Compound Poisson}(\lambda, \mathcal{N}(0,\sigma_J^2)).$$ + +The HJBI becomes: + +$$-\partial_t V = \inf_u\Bigl[\alpha x^2 + \beta u^2 + \partial_x V\,u ++ \lambda\,\mathbb{E}_z[V(x+z)-V(x)-z\,\partial_x V]\Bigr].$$ + +With Gaussian jumps, the expectation computes as +$\lambda(\tfrac12\sigma_J^2\,\partial_{xx}V)$, so the HJBI reduces to the same LQR +Riccati ODE but with **effective diffusion** $\sigma_{\text{eff}}^2 = \lambda\sigma_J^2$. + +Key insight: order-flow risk acts like additional Brownian volatility, accelerating +the optimal sell schedule. +:::: + +--- + ### 4.4 Viscosity Solutions -When $V$ fails to be $C^{1,2}$ (degenerate $\sigma$, state constraints), -viscosity solutions (Crandall–Lions 1983) restore uniqueness. +When $V$ fails to be $C^{1,2}$ — which happens with degenerate diffusion ($\sigma \approx 0$), +state/control constraints, or non-smooth terminal conditions — classical solutions +may not exist. **Viscosity solutions** (Crandall–Lions 1983) provide a rigorous +weak notion that restores existence and uniqueness. + +**Why they matter:** In practice, HJB is solved on a grid and $V$ is only piecewise +smooth. Viscosity theory guarantees the numerical scheme converges to the true solution. ::::{admonition} Definition — Viscosity Subsolution :class: definition A continuous $V$ is a viscosity *subsolution* if for every smooth $\phi$ -touching $V$ from above at $(t_0,x_0)$: -$-\partial_t\phi(t_0,x_0) \le \inf_u[\ldots]$ evaluated at $\phi$. +touching $V$ **from above** at $(t_0,x_0)$ (i.e., $V - \phi$ has a local maximum there): + +$$-\partial_t\phi(t_0,x_0) \le \inf_u\Bigl[\ell(x_0,u) + \nabla_x\phi^\top b + \tfrac12\operatorname{Tr}(\sigma\sigma^\top\nabla^2\phi)\Bigr].$$ + +A *supersolution* reverses the inequality with a smooth test touching from *below*. +The unique viscosity **solution** is simultaneously both. :::: +**Practical interpretation.** Classical calculus says "$V$ satisfies the PDE pointwise." +Viscosity theory says "$V$ satisfies the PDE in an averaged sense via test functions — +even at kinks." The condition prevents $V$ from being arbitrarily steep or flat at +non-smooth points. + Optimiz-rs's backward DP converges to the viscosity solution under the CFL condition $\Delta t \le C\,(\Delta x)^2$. +--- + +::::{admonition} Example — American Option as a Viscosity Problem +:class: note + +An American put has early-exercise payoff $g(x) = (K-x)^+$. The value function satisfies +the **variational inequality** (a two-region HJB): + +$$\min\Bigl(-\partial_t V - \mathcal{L}_{\text{BS}}V,\; V - (K-x)^+\Bigr) = 0,$$ + +where $\mathcal{L}_{\text{BS}}V = rx\partial_x V + \tfrac12\sigma^2 x^2\partial_{xx}V - rV$. + +- **Continuation region** ($V > (K-x)^+$): the Black–Scholes PDE holds. +- **Exercise region** ($V = (K-x)^+$): the option is exercised immediately. + +At the free boundary the gradient $\partial_x V$ is continuous +(*smooth-pasting*) but $\partial_{xx}V$ is not — so $V$ is only $C^1$, +not $C^2$. Viscosity theory handles this kink rigorously. +:::: + **Backward DP grid schema:** ```