鼎元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] 说明,有了上面的标准差计算公式函数后,在前面的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] 今天优化了一下标准差平均的公式,下周一试试效果,然后 在这里做修正。
程式码如下:[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]因为我发现上面的标准差平均好像没有平均,仅调用到了标准差。 下周一我将在交易中检查一下效果。
页:
[1]