龙听期货论坛's Archiver

龙听 发表于 2024-11-13 19:26

鼎元C++期货量化/程序化教程【方差(variance)、标准差(standard deviation,sdev)计算方法及调用方法】

鼎元C++期货量化/程序化教程【方差(variance)、标准差(standard deviation,sdev)计算方法及调用方法】
1、方差的介绍参考:[url]http://www.qhlt.cn/thread-160294-1-1.html[/url];

2、重点写法:

(1)、先求平均值。
(2)、再求方差。
(3)、再求标准差。
(4)、再求平均标准差。

3、先在头文件中声明变量:[code]double Variance(string period, string inst, int num);//方差计算公式变量
        double StandardDev(string period, string inst, int num);//标准差计算公式变量
        double StdDev(string period, string inst, int num);//标准差平均计算公式变量[/code]4、在源文件中标准模块增加方差和标准差的模块:[code]//方差计算公式开始
double test::Variance(string period, string inst, int num)
{
        double avg1 = avg(sPeriod, sInst, num);//中间均线
        int n = 0;
        double sumdev = 0;
        double madev = 0;
        if (mapK[period][inst].size() < num) return 0;
        map<string, TKVALUE>::reverse_iterator it;
        for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
        {
                sumdev += pow(it->second.dClose - avg1, 2); //偏离平方加总
                n++;
                if (n >= num)break;
        }
        return sumdev / n;
}
// 方差计算公式结束
//标准差计算公式开始
double test::StandardDev(string period, string inst, int num)
{
        double value1;
        if (mapK[period][inst].size() < num) return 0;
        value1 = Variance(sPeriod, sInst, num);
        return sqrt(value1);
}
// 标准差计算公式结束
//标准差平均计算公式开始
double test::StdDev(string period, string inst, int num)
{
        double value2;
        if (mapK[period][inst].size() < num) return 0;
        value2 = StandardDev(sPeriod, sInst, num);
        return value2;
}
// 标准差平均计算公式结束[/code]

龙听 发表于 2024-11-13 20:37

说明,有了上面的标准差计算公式函数后,在前面的boll带指标上面就可以很方便的计算boll的公式了,不用在 公式中现自己算标准差了。直接在求均线后直接加差标准差就行了。[code]//布林带(bollingerbands)开始
double test::bollingerbands(string period, string inst, int num, int ref)
{
         if (mapK[period][inst].size() < num) return 0;
        double avg1 = avg(sPeriod, sInst,num);//中间均线
        double stdma = StdDev(sPeriod, sInst,num);//求平均标准差

     return avg1 + stdma*ref*2; //布林带 = 均线 +- 2倍标准差
}

//布林带(bollingerbands)结束[/code]

龙听 发表于 2024-11-16 19:24

今天优化了一下标准差平均的公式,下周一试试效果,然后 在这里做修正。

程式码如下:[code]//标准差平均计算公式开始
double test::StdDev(string period, string inst, int num)
{
        double value2 = 0;
        double value3 = 0;
        value2 = StandardDev(sPeriod, sInst, num);
        if (mapK[period][inst].size() < num) return 0;
        map<string, TKVALUE>::reverse_iterator it;
        for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
        {
                value3 += value2; //标准差加总
                n++;
                if (n >= num)break;
        }
        return value3 / n;

        return value3;
}
// 标准差平均计算公式结束[/code]因为我发现上面的标准差平均好像没有平均,仅调用到了标准差。

龙听 发表于 2024-11-16 19:25

下周一我将在交易中检查一下效果。

页: [1]