Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions 05_option_pricing/涂家俊/.clang-format
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
BasedOnStyle: LLVM
IndentWidth: 4
ContinuationIndentWidth: 4
60 changes: 60 additions & 0 deletions 05_option_pricing/涂家俊/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# CMake build directories (including build-* / cmake-build-* at any level)
/build/
build-*/
/out/
cmake-build-*/

# CMake generated files
CMakeCache.txt
CMakeFiles/
cmake_install.cmake
CTestTestfile.cmake
Makefile
compile_commands.json
install_manifest.txt

# Compiled binaries and CUDA artifacts
*.a
*.dll
*.exe
*.exp
*.ilk
*.lib
*.obj
*.o
*.pdb
*.ptx
*.cubin
*.fatbin

# IDE and editor settings
.vs/
.vscode/
.idea/
*.suo
*.user
*.userosscache
*.sln.docstates

# Generated experiment and profiling output
/results/*
!/results/.gitkeep
*.nsys-rep
*.ncu-rep
*.sqlite

# Temporary files
*.log
*.tmp
*.py[cod]
__pycache__/
*.swp
*~
.DS_Store
Thumbs.db

# Agent-managed isolated workspaces
/.worktrees/
/.superpowers/

/.workbuddy
107 changes: 107 additions & 0 deletions 05_option_pricing/涂家俊/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
# 配置 CUDA 定价器的构建目标、可选分析能力和自动化测试。
cmake_minimum_required(VERSION 3.24)

project(cuda_pricer LANGUAGES CXX CUDA)

# CUDA Toolkit 提供运行时、cuRAND 和 CUB。
find_package(CUDAToolkit REQUIRED)

if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES OR CMAKE_CUDA_ARCHITECTURES STREQUAL "")
message(FATAL_ERROR "Set CMAKE_CUDA_ARCHITECTURES to the target GPU architecture.")
endif()

# 将分析能力和性能模式显式设为独立开关。
option(PRICER_ENABLE_NVTX "Enable NVTX performance markers" OFF)
option(PRICER_ENABLE_FAST_MATH "Enable CUDA fast math" OFF)

# 固定第三方库版本,保证干净环境能重复配置。
include(FetchContent)

FetchContent_Declare(
nlohmann_json
GIT_REPOSITORY https://github.com/nlohmann/json.git
GIT_TAG v3.11.3
GIT_SHALLOW TRUE
)
FetchContent_MakeAvailable(nlohmann_json)

# 与设备无关的金融模型、配置、统计和输出代码。
add_library(pricer_core STATIC
src/black_scholes.cpp
src/config.cpp
src/cpu_pricer.cpp
src/measurement.cpp
src/output.cpp
src/payoff.cpp
src/statistics.cpp
src/version.cpp
)
add_library(pricer::core ALIAS pricer_core)
target_compile_features(pricer_core PUBLIC cxx_std_17)
target_include_directories(pricer_core
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)
target_link_libraries(pricer_core PUBLIC nlohmann_json::nlohmann_json)

# 单独构建设备端后端,避免 CPU 测试依赖 CUDA 内核实现细节。
add_library(pricer_cuda_backend STATIC src/cuda_backend.cu)
add_library(pricer::cuda_backend ALIAS pricer_cuda_backend)
target_compile_features(pricer_cuda_backend PUBLIC cxx_std_17)
target_include_directories(pricer_cuda_backend
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)
target_link_libraries(pricer_cuda_backend PUBLIC pricer::core CUDA::cudart)
if(MSVC)
target_compile_options(pricer_cuda_backend PRIVATE
$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=/Zc:preprocessor>
)
endif()
set_target_properties(pricer_cuda_backend PROPERTIES CUDA_SEPARABLE_COMPILATION ON)

# 快速数学只用于明确请求的性能实验,不能作为正确性默认值。
if(PRICER_ENABLE_FAST_MATH)
target_compile_options(pricer_cuda_backend PRIVATE
$<$<COMPILE_LANGUAGE:CUDA>:--use_fast_math>
)
endif()

# NVTX 标记仅为剖析提供时间线语义,常规构建不依赖它。
if(PRICER_ENABLE_NVTX)
set(PRICER_NVTX_INCLUDE_DIR "" CACHE PATH
"Directory containing nvtx3/nvToolsExt.h")
if(NOT PRICER_NVTX_INCLUDE_DIR)
unset(PRICER_NVTX_INCLUDE_DIR CACHE)
find_path(PRICER_NVTX_INCLUDE_DIR nvtx3/nvToolsExt.h
HINTS ${CUDAToolkit_INCLUDE_DIRS} "$ENV{NVTX_PATH}"
PATH_SUFFIXES include)
endif()
if(NOT PRICER_NVTX_INCLUDE_DIR)
message(FATAL_ERROR
"PRICER_ENABLE_NVTX requires nvtx3/nvToolsExt.h; set PRICER_NVTX_INCLUDE_DIR.")
endif()
target_compile_definitions(pricer_cuda_backend PRIVATE PRICER_ENABLE_NVTX=1)
target_include_directories(pricer_cuda_backend PRIVATE
"${PRICER_NVTX_INCLUDE_DIR}")
target_link_libraries(pricer_cuda_backend PRIVATE CUDA::nvtx3)
endif()

# CLI 负责把配置、定价后端和文件输出串成完整一次运行。
add_executable(pricer_cli src/main.cpp)
target_compile_features(pricer_cli PRIVATE cxx_std_17)
target_link_libraries(pricer_cli PRIVATE pricer::core pricer::cuda_backend)
execute_process(
COMMAND git rev-parse --short HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE PRICER_GIT_COMMIT
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
if(PRICER_GIT_COMMIT STREQUAL "")
set(PRICER_GIT_COMMIT "unknown")
endif()
target_compile_definitions(pricer_cli PRIVATE
PRICER_BUILD_TYPE="$<CONFIG>"
PRICER_GIT_COMMIT="${PRICER_GIT_COMMIT}"
)
149 changes: 149 additions & 0 deletions 05_option_pricing/涂家俊/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
# CUDA 金融衍生品定价器

这是一个使用 C++17 和 CUDA C++ 实现的蒙特卡洛定价命令行项目。它以 CPU 单线程实现作为基线,并提供 GPU 加速路径,用于定价欧式看涨期权和离散算术平均亚式看涨期权。

项目不是无参数可执行程序:运行 `pricer_cli` 时必须同时提供期权配置和模拟配置。下面的命令可从克隆仓库开始完成配置、构建、测试与一次实际定价。

## 功能范围

- 欧式看涨与离散算术平均亚式看涨期权;
- Black-Scholes 欧式看涨解析参考价;
- CPU 单线程蒙特卡洛基线;
- CUDA 蒙特卡洛路径,使用 cuRAND Philox 和 CUB 归约;
- FP32 / FP64 GPU 路径、FP64 统计量、标准误与 95% 置信区间;
- 每次运行输出 JSON 结果,并向性能 CSV 追加记录。

## 环境要求

- CMake 3.24 或更高版本;
- 支持 C++17 的主机编译器;
- CUDA Toolkit 12.x(含 cuRAND 与 CUB)及可用的 NVIDIA GPU;
- Ninja;
- 配置阶段能访问 GitHub:CMake 会获取固定版本的 nlohmann/json 3.11.3。

构建前需要按实际显卡指定 `CMAKE_CUDA_ARCHITECTURES`。例如,RTX 4060 Laptop 的计算能力为 8.9,对应 CMake 值 `89`。Linux/WSL 中可先查看:

```bash
nvidia-smi --query-gpu=compute_cap --format=csv,noheader
```

去掉小数点后填入构建命令;例如 `8.6` 使用 `86`,`8.9` 使用 `89`。

## 构建

以下命令适用于 Linux 和 WSL。Windows 请在已初始化 MSVC 与 CUDA Toolkit 的开发者终端中执行同样的 CMake 命令;若使用 Ninja,Windows 可执行文件扩展名为 `.exe`。

```bash
cmake -S . -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CUDA_ARCHITECTURES=89

cmake --build build -j
```

`89` 只是 RTX 4060 Laptop 的示例,不应照搬到其他显卡。正确性构建默认关闭 `PRICER_ENABLE_FAST_MATH`;性能测量也应使用 Release 构建。

## 运行定价器

先查看本机构建产物支持的参数:

```bash
./build/pricer_cli --help
```

运行欧式看涨期权,并同时执行 CPU 与 GPU 后端:

```bash
./build/pricer_cli \
--option configs/option_european_call.ini \
--simulation configs/simulation.ini \
--output-dir results/european \
--backend both \
--repetitions 1
```

运行亚式看涨期权:

```bash
./build/pricer_cli \
--option configs/option_asian_call.ini \
--simulation configs/simulation.ini \
--output-dir results/asian \
--backend both \
--repetitions 1
```

Windows + Ninja 时将可执行文件写为 `build\\pricer_cli.exe`,路径分隔符可使用 `\\`。若使用 Visual Studio 多配置生成器,则通常从 `build\\Release\\pricer_cli.exe` 启动。

`configs/simulation.ini` 默认配置为 1,000 万条路径、256 个时间步,适合作为完整实验输入,运行时间可能较长。需要快速调试时,请复制该文件到新的 INI,再降低 `num_paths` 与 `num_steps`;不要改写仓库提供的示例配置。

### 常用 CLI 参数

| 参数 | 说明 |
| --- | --- |
| `--option <path>` | 必填。欧式或亚式期权 INI 文件。 |
| `--simulation <path>` | 必填。路径数、步数、随机数、精度、block size 等模拟 INI 文件。 |
| `--output-dir <path>` | 输出目录,默认是 `results`。 |
| `--backend <cpu|gpu|both>` | 选择 CPU、GPU 或同时运行两者,默认 `both`。 |
| `--device <id>` | CUDA 设备编号,默认 `0`。 |
| `--warmup <n>` | GPU 非计量预热次数,默认 `1`。 |
| `--repetitions <n>` | 正式计量重复次数,默认 `1`。 |

## 配置与输出

`configs/` 中提供两类配置:

- `option_european_call.ini` 与 `option_asian_call.ini`:期权类型、现价、行权价、利率、波动率和到期时间;
- `simulation.ini`:FP32 GPU 默认实验配置;
- `simulation_fp64.ini`:FP64 GPU 配置,适合与 CPU FP64 基线进行同精度性能对比。

每个后端会在输出目录写入一份:

```text
<timestamp>-<option_type>-<backend>-result.json
```

性能数据会追加到同目录的 `performance.csv`。JSON 中价格、标准误、置信区间、运行时间和环境信息使用结构化字段记录;不可用统计值以 `null` 表示。

CPU 与 GPU 使用不同随机序列,验证时应比较统计一致性,而不是比较逐路径结果。性能结论应使用 CPU 与 GPU 的 `total_runtime_ms`,不要将 CPU 总时间与 GPU `compute_runtime_ms` 混用。

## 项目结构

```text
include/pricer/ 公共 C++ 接口
src/ CPU、CUDA、CLI、统计与输出实现
configs/ 示例期权与模拟 INI
results/ 运行生成的 JSON、CSV 与实验产物(默认不提交)
```

## 常见问题

### CMake 提示未设置 CUDA 架构

本项目要求显式传入 `CMAKE_CUDA_ARCHITECTURES`。确认 GPU 的计算能力后重新配置,例如:

```bash
cmake -S . -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CUDA_ARCHITECTURES=89
```

不要复用由其他操作系统、其他 CUDA 版本或其他 GPU 生成的 CMake 缓存。

### FetchContent 下载依赖失败

检查 GitHub 网络与 Git 是否可用后重新配置。若所在环境已经有固定版本的依赖源码,也可以显式指定它们,避免 CMake 联网下载:

```bash
cmake -S . -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CUDA_ARCHITECTURES=89 \
-DFETCHCONTENT_SOURCE_DIR_NLOHMANN_JSON=/path/to/nlohmann_json \
-DFETCHCONTENT_SOURCE_DIR_GOOGLETEST=/path/to/googletest
```

这些目录必须分别包含对应依赖的顶层 `CMakeLists.txt`。不要将下载缓存、`_deps` 或构建目录提交到仓库。

### 无参数运行 `pricer_cli` 报错

这是预期行为。`--option` 与 `--simulation` 都是必填参数;请使用“运行定价器”章节中的完整命令。
6 changes: 6 additions & 0 deletions 05_option_pricing/涂家俊/configs/option_asian_call.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
option_type = asian_call
spot = 100.0
strike = 100.0
risk_free_rate = 0.03
volatility = 0.2
maturity = 1.0
6 changes: 6 additions & 0 deletions 05_option_pricing/涂家俊/configs/option_european_call.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
option_type = european_call
spot = 100.0
strike = 100.0
risk_free_rate = 0.03
volatility = 0.2
maturity = 1.0
8 changes: 8 additions & 0 deletions 05_option_pricing/涂家俊/configs/simulation.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
num_paths = 10000000
num_steps = 256
seed = 1234
rng = curand_philox
variance_reduction = none
precision = fp32
block_size = 256
batch_size = 0
8 changes: 8 additions & 0 deletions 05_option_pricing/涂家俊/configs/simulation_fp64.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
num_paths = 10000000
num_steps = 256
seed = 1234
rng = curand_philox
variance_reduction = none
precision = fp64
block_size = 256
batch_size = 0
12 changes: 12 additions & 0 deletions 05_option_pricing/涂家俊/include/pricer/black_scholes.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#pragma once

// 提供欧式看涨期权的 Black-Scholes 解析参考值。

#include "pricer/config.hpp"

namespace pricer {

// 返回欧式看涨的解析价格,用于校验蒙特卡洛估计。
double black_scholes_call(const OptionParams &option);

} // namespace pricer
Loading