教科書:
Daniel J. Duffy, Financial Instrument Pricing Using C++ (2nd
Edition), Wiley Finance
補充教材:
本學期課程以 Modern C++ 與金融工程(Computational Finance) 為核心, 從現代 C++ 程式語言出發,逐步進入數值方法、金融商品評價,以及金融軟體系統設計。
本課程並不是單純學習 C++ 語法,也不是單純學習金融數學。
我們真正要處理的核心問題是:
如何將一個金融模型,轉換成可靠、可維護、可擴充,而且具有效率的 C++ 金融工程程式?
因此,本學期將同時處理四個彼此連結的層次:
\[ \text{Financial Model} \]
\[ \downarrow \]
\[ \text{Numerical Algorithm} \]
\[ \downarrow \]
\[ \text{Modern C++ Software Design} \]
\[ \downarrow \]
\[ \text{QuantLib Implementation} \]
亦即:
金融模型 → 數值方法 → C++ 程式設計 → QuantLib 金融工程實務
本課程希望建立的是一條完整的金融計算程式學習路徑,而不是彼此獨立的程式語法與金融公式。
完成本課程後,希望同學能夠:
本學期不把 C++ 僅僅視為:
「一個執行速度比較快的程式語言」
C++ 在金融工程中的價值還包括:
因此,我們會特別討論:
如何依照問題的特性,選擇適合的 programming paradigm。
Modern C++ 並不是只有 Object-Oriented Programming。
C++ 是一個 Multiparadigm Programming Language,可以同時支援:
在實際金融工程系統中,通常必須將這些方法適當組合,而不是完全依賴 class hierarchy。
std::unique_ptrstd::shared_ptrstd::weak_ptrautonullptrforstd::variant如何避免:
觀察 QuantLib 中:
std::functionstd::bind傳統 C++ 常利用:
inheritance
virtual functions
function pointers
來達成軟體彈性。
Modern C++ 則可以進一步利用:
std::function
lambda
template
建立更容易組合、低耦合的軟體架構。
討論:
decltypestd::declvalstd::enable_ifGeneric Programming 的目的並不只是減少重複程式碼。
它也提供:
但 template 並不自動代表程式一定比較快。
仍然必須考量:
std::pairstd::tuple例如,一個 Option Pricing Function 可以同時計算:
Price
Delta
Gamma
在 C++ 中可利用 std::tuple 將這些結果整合:
using ComputedData =
std::tuple<double, double, double>;
而不必為 Price、Delta 與 Gamma 建立彼此獨立的資料交換方式。
Black–Scholes 將作為本學期的重要示範模型。
除了金融公式本身之外,我們會進一步研究:
因此,我們不只問:
Black–Scholes 的公式是什麼?
還要進一步思考:
Black–Scholes Pricing Engine 應該如何設計?
例如:
Market / Option Data
↓
Pricing Algorithm
↓
Price + Greeks
主要內容:
主要內容:
Monte Carlo Simulation 為本學期重要的金融數值方法之一。
主要內容:
現代 CPU 普遍採用 multicore architecture。
因此,在金融計算中除了演算法正確性之外,也需要進一步考慮平行運算。
主要內容:
std::threadstd::asyncstd::future並以 Monte Carlo Simulation 作為重要案例。
我們真正要思考的並不是:
如何建立很多 threads?
而是:
一個金融計算問題中,哪些工作可以安全且有效率地 parallelize?
本課程另一個重要目標,是理解:
數學公式正確,不代表金融軟體就是好的。
金融軟體還必須考量:
因此我們會討論:
傳統 Gang of Four Design Patterns 主要建立於:
Modern C++ 提供更多設計工具,例如:
std::function因此我們會比較傳統與 Modern C++ 的設計方法。
Base Class
/ \
/ \
Derived A Derived B
Interface / Function Signature
↓
Callable Object
↓
Algorithm
並討論下列 Design Patterns:
我們也會思考:
哪些 Design Pattern 仍然適合直接使用?
以及:
哪些 Design Pattern 可以利用 Modern C++ 重新設計?
課程後半段將逐步把前面學習的 C++ 與金融模型帶入 QuantLib。
QuantLib 不只是金融公式的集合。
它同時是一個大型的:
Financial Engineering Software Framework
我們會逐步研究其主要概念,例如:
Instrument
↓
PricingEngine
↓
Model
↓
Market Data
以及:
學習 QuantLib 的重點不只是:
QuantLib::Bond
或:
QuantLib::VanillaOption
怎麼呼叫。
更重要的是理解:
QuantLib 為什麼要這樣設計?
主要內容:
將前面所學的:
Financial Model
+
Numerical Method
+
C++ Architecture
與 QuantLib 的實際實作進行比較。
主要內容:
核心問題仍然是:
QuantLib 如何把金融模型、數值演算法與軟體架構結合?
| 週次 | 主題 | 主要閱讀 | 程式實作 |
|---|---|---|---|
| 1 | 課程介紹、Modern C++ 與金融工程 | Ch.1 | C++ 環境確認、Black–Scholes 初步案例 |
| 2 | Smart Pointer、RAII、Ownership | Ch.2 | unique_ptr / shared_ptr |
| 3 | Move Semantics 與 Modern C++ Fundamentals | Ch.2 | Copy vs Move 實驗 |
| 4 | std::function、Lambda 與 Callable Objects |
Ch.3 | Pricing Function |
| 5 | Template 與 decltype |
Ch.4 | Generic Numerical Function |
| 6 | Tuple 與 Multiple Return Values | Ch.5 | Price / Delta / Gamma |
| 7 | Type Traits 與 Generic Lambda | Ch.6 | Compile-Time Type Analysis |
| 8 | Multiparadigm Design | Ch.7 | Strategy Pattern Modernization |
| 9 | STL Algorithms 與金融資料 | Ch.17–18 | STL Financial Data Processing |
| 10 | Lattice Models | Ch.11–12 | Binomial Option Pricing |
| 11 | Random Number Generation | Ch.26 | Normal Random Number Generator |
| 12 | Monte Carlo I | Ch.31 | GBM + European Option |
| 13 | Monte Carlo II | Ch.31–32 | Asian / Barrier Option |
| 14 | C++ Concurrency | Ch.28–29 | thread / async / future |
| 15 | QuantLib 基礎架構 | 補充講義 | Instrument / PricingEngine |
| 16 | QuantLib 固定收益 | 補充講義 | Bond / Yield / Duration / DV01 |
| 17 | QuantLib Option 與 Design Pattern | 補充講義 | VanillaOption / PricingEngine |
| 18 | 綜合案例與期末專題 | 綜合 | Pricing / Risk System |
期末專題的目標不是完成一套大型金融系統,而是實際整合:
Financial Model
↓
Numerical Method
↓
Modern C++
↓
Software Architecture
↓
Pricing / Risk Result
以下為可能的專題方向。
實作:
最後將自行開發的結果與 QuantLib 比較。
實作:
並比較不同方法的:
支援:
並利用:
std::thread
std::async
std::future
進行 parallelization。
比較:
三種方法的執行效率。
選擇一個 QuantLib 模組:
Instrument
PricingEngine
CashFlow
TermStructure
Option
Bond
分析:
並嘗試進行小型功能擴充。
本學期可以歸納為五個核心主題。
不只是學習 C++ 語法,而是理解:
RAII
Smart Pointer
Move Semantics
Lambda
Template
Type Traits
STL
以及這些語言工具背後的設計思想。
理解:
Financial Model
↓
Numerical Algorithm
↓
Computer Implementation
金融計算不是只有公式。
我們還必須理解:
除了:
「算得出答案」
還要求程式具備:
Correctness
Maintainability
Extensibility
Reliability
Performance
不只學習:
QuantLib::Bond
QuantLib::VanillaOption
QuantLib::PricingEngine
如何使用。
更重要的是理解:
QuantLib 如何把金融理論轉換成大型 C++ 金融工程架構?
最終希望建立完整的思考方式:
金融理論
↓
數學模型
↓
數值方法
↓
C++ Algorithm
↓
Software Architecture
↓
QuantLib
↓
Pricing / Risk Management System
C++ 是一門需要實際撰寫程式才能真正掌握的語言。
因此,本學期的學習方式將以:
Concept → Code → Experiment → Financial Application
為主要流程。
每一個重要觀念都希望經過:
同學不應只閱讀程式碼,而應實際:
Compile
Run
Modify
Test
Debug
Measure
Compare
才能真正理解 Modern C++ 與金融計算程式。
這學期我們不是單純學 C++,也不是單純學金融數學;我們要學的是如何使用 Modern C++,把金融模型真正做成可以工作的金融工程軟體。
因此,本學期真正希望培養的並不是:
「記住多少 C++ 語法」
而是:
面對一個金融問題時,知道如何把 Financial Model、Numerical Method、C++ 與 Software Design 組合成一個可靠的解決方案。