# C++和Python计算金融数学方程算法模型

<details>

<summary>关键词</summary>

C++ | Python | 蒙特卡罗 | 模拟 | 算法伴随微分 | 计算图 | 复合模式 | 有向无环图 | 节点 | 懒惰评估 | 算法 | 金融 | 方程式 | 遍历 | 模型 | 并行计算 | 检查点 | 风险 | 价值回报 | 市场波动 | 利率 | 傅里叶变换

</details>

{% embed url="https://viadean.notion.site/C-Python-19872283bec04ec3a18a08219603a773" %}

{% content-ref url="../zhi-dian-mi-jin-brief" %}
[zhi-dian-mi-jin-brief](../zhi-dian-mi-jin-brief)
{% endcontent-ref %}

### 要点

1. C++代码蒙特卡罗模拟金融产品估值，开发C++并行计算模拟库。
2. 算法伴随微分计算图及C++代码实现释义：C++应用经典的复合模式构建有向无环图，遍历有向无环图节点C++实现，C++使用懒惰评估计算次序，遍历代码实现，C++代码实现伴随数学形式，伴随传播的遍历策略C++代码。
3. C++规划金融产品计算节点，存储，运算符和计算模块逻辑。
4. C++算法伴随微分计算价格与模型参数的差异，串行和并行模拟整个蒙特卡罗评估的伴随物累积到模型参数中。
5. C++使用检查点算法校准微分，从模型获取敏感性风险报告。
6. C++算法伴随微分作为多维函数的有效微分，测试结果
7. 依据数学方程或定律，Python绘制金融市场产品价值曲线：计算价值回报，预测市场波动，利率变化。
8. Python概率密度函数和累计密度函数等数学计算进行不同产品估值，价值到期
9. Python快速傅里叶和离散傅里叶变换从不同数学模型，计算金融品价值。
10. Python使用蒙特卡罗和不同算法模拟金融产品价值

### C++蒙特卡罗方法定价模拟

分析模型如下：

$$C(S, t)=S N\left(d_1\right)-K e^{-r T} N\left(d_2\right)$$\


其中，$$S$$ 是标的资产价格，$$K$$ 是执行价格，$$r$$ 是利率（或“无风险利率”），$$T$$ 是到期时间，$$\sigma$$ 是（常数）标的资产的波动性。

$$d_1$$ 和 $$d_2$$ 定义如下：

$$\begin{aligned} & d_1=\frac{\log (S / K)+\left(r+\frac{\sigma^2}{2}\right) T}{\sigma \sqrt{T}} \\ & d_2=d_1-\sigma \sqrt{T} \end{aligned}$$\


N 的公式由下式给出：

$$N(x)=\frac{1}{\sqrt{2 \pi}} \int_{-\infty}^x e^{-t^2 / 2} d t$$\


为了计算这些敏感性，我们需要标准正态分布的概率密度函数公式，如下所示：

$$f(x)=\frac{1}{\sqrt{2 \pi}} e^{-x^2 / 2}$$\


在此阶段，该代码将不包含任何面向对象或通用编程技术。 现在的目标是帮助您了解定价引擎的基本 C++ 实现，而不需要所有额外的对象机制来封装数学函数。 我已经完整地写出了该程序，然后下面我将解释每个组件如何工作：

```cpp
 #define USE MATH DEFINES
 ​
 #include <iostream>
 #include <cmath>
  
 double norm_pdf(const double & x) {
   return (1.0 / (pow(2∗ M_PI, 0.5)))∗ exp( −0.5∗x∗x);
 }
 ​
 double norm_cdf(const double &x) {
   double k = 1.0 / (1.0 + 0.2316419∗ x);
   double k sum = k∗(0.319381530 + k∗(−0.356563782 + k∗(1.781477937 +
     k∗(−1.821255978 + 1.330274429∗ k))));
   i f(x >= 0.0) {
     return (1.0−(1.0 / (pow(2∗M_PI, 0.5)))∗ exp(−0.5∗ x∗ x)∗ k sum);
   }
   else {
     return 1.0− norm_cdf(−x);
   }
 }
 ​
 double d_j(const int & j,
   const double & S,
     const double & K,
       const double & r,
         const double & v,
           const double & T) {
   return (log(S/K) + (r + (pow(−1, j−1))∗ 0.5∗ v∗ v)∗ T) / (v∗(pow(T, 0 .5)));
 }
 ​
 double call-price(const double & S,
   const double & K,
     const double & r,
       const double & v,
         const double & T) {
   return S∗ norm_cdf(d j(1,S,K,r,v,T))− K∗ exp(−r∗T)∗
   norm_cdf(d j(2, S, K, r, v, T));
 }
 ​
 double put_price(const double & S,
   const double & K,
     const double & r,
       const double & v,
         const double & T) {
   return −S∗ norm_cdf(−d_j(1,S,K,r,v,T)) + K∗exp(−r∗T)∗
   norm_cdf(−d_j(2, S, K, r, v, T));
 }
 int main(int argc, char∗∗ argv) {
 ​
   double S = 1 0 0 .0; 
   double K = 1 0 0 .0; 
   double r = 0 .0 5; 
   double v = 0 .2; 
   double T = 1 .0; 
   
   double call = call_price(S,K,r,v,T);
   double put = put_price(S,K,r,v,T);
 ​
   std:: cout << ”Underlying: ” << S <<std::endl;
   std:: cout << ”Strike: ” << K <<std::endl;
   std:: cout << ”Risk−FreeRate: ” << r <<std::endl;
   std:: cout << ”Volatility: ” << v <<std::endl;
   std:: cout << ”Maturity: ” << T <<std::endl;
   std:: cout << ”Call Price: ” <<call <<std::endl;
   std:: cout << ”Put Price: ” << put << std::endl;
   return 0;
 }
```

代码释义

第一行是一个预处理器宏，它告诉 C++ 编译器使用 C 标准数学常量。 请注意，某些编译器可能不完全支持这些常量。 请务必先测试它们！

```
 #def ine USE MATH DEFINES
```

下一部分导入 iostream 和 cmath 库。 这使得我们可以使用std::cout命令来输出代码。 此外，我们现在可以访问 C 数学函数，例如 exp、pow、log 和 sqrt：

```
 #include <iostream>
 #include <cmath>
```

一旦我们导入了正确的库，我们就需要创建核心统计函数，这些函数构成了价格的大部分计算。 这是标准正态概率密度函数。 M\_PI 是 π 的 C 标准数学常数。
