C ++期权定价功能......单独工作正常但不适用于股票价格范围(矢量)

C++ option pricing function...works fine individually but not for a range (vector) of stock prices

我正在通过以下方式计算期权价格(看涨期权):

#ifndef GLOBAL_H
#define GLOBAL_H

#include "NormDistFunctions.h"

struct OptionData
{
    double X;
    double b;
    double r;
    double T;
    double sigma;
};

double EuroCall(OptionData o, double S);
double EuroPut(OptionData o, double S);
#endif

EuroCall() 的输入是 OptionData o 和 S(股票价格)。这是我的实现。

#include "Global.h"
#include "EuroOption.h"
#include <boost/math/distributions/normal.hpp>
#include <boost/math/distributions.hpp> // For non-member functions of distributions
#include <cmath>


double EuroCall(OptionData o, double S)
{
    double d1 = (log(S/o.X) + (o.b + (o.sigma * o.sigma) / 2) * o.T) / (o.sigma * sqrt(o.T));
    double d2 = d1 - o.sigma * sqrt(o.T);
    double callPrice = S * exp((o.b - o.r) * o.T) * N(d1) - o.X * exp(-o.r * o.T) * N(d2);
    return callPrice;
}

这本身就很好,但我需要根据一系列股票价格为这个选项定价。我为这些股票价格范围创建了一个全局向量:

vector<double> MeshArray(double start, double end, double h)
{
    vector<double> mesh;
    mesh.reserve(100);
    for (double i = start; i <= end; i += h)
        mesh.push_back(i);
    return mesh;
}

最后,在 main() 中我有:

vector<double> MA = MeshArray(50.0, 100.0, 2.0);
    for (auto &i : MA)
        cout << EuroCall(o1,MA[i]) << " ";

输出应该是每个标的股票价格从 50、52、54...到 100 的看涨期权价格向量。但我的输出是“0 0 0 0 0 0”等。我将不胜感激任何人关于如何解决这个问题的建议,它让我连续两天。

您的问题在于使用向量元素(即取消引用的迭代器)而不是迭代器调用 EuroCall 函数

for (auto &i : MA)
    cout << EuroCall(o1,MA[i]) << " ";

这里i是向量(std::vector<double>::value_type)的一个元素,即double,不是iterator/index。因此,将 EuroCall(o1,MA[i]) 替换为 EuroCall(o1,i) 就可以了。

有趣的是,您的代码在没有警告的情况下编译,因为 MA[i] 引用了 MA 中由值 i 指定的某个偏移量,这是越界的(可能有 catch这是通过使用 MA.at(i) 代替的,它会抛出越界访问的异常),所以你走在未定义行为的土地上。这就是为什么在使用基于范围的 for 时最好选择一个更好的名称,例如 elem,而不是 i,所以当您看到 MA[elem] 时,您会意识到某些东西是不对。