C++选项定价函数..单独工作很好,但对于股票价格的范围(向量)来说不行

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

本文关键字:向量 范围 单独 函数 选项 工作 很好 C++ 于股票      更新时间:2023-10-16

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

#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"等。我非常感谢任何人关于如何解决这个问题的建议,这让我连续两天都没有问题。

您的问题是用向量的一个元素(即去引用迭代器)而不是迭代器调用EuroCall函数

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

这里,i是向量(std::vector<double>::value_type)的元素,即double,而不是迭代器/索引。所以用EuroCall(o1,i)替换EuroCall(o1,MA[i]),你应该可以离开了。

有趣的是,您的代码在编译时没有发出警告,因为MA[i]引用了值i指定的MA中的某个偏移量,该偏移量超出了界限(本可以通过使用MA.at(i)来实现,这会为越界访问抛出一个异常),所以您正处于未定义行为的领域。这就是为什么在使用基于范围的for时,最好选择一个更好的名称,例如elem,而不是i,所以当您看到MA[elem]时,您会意识到有些地方不对。