鼎元C++期货量化/程序化教程【方差(variance)、标准差(standard deviation,sdev)计算方法及调用方法】
- UID
- 2
- 积分
- 2892507
- 威望
- 1396285 布
- 龙e币
- 1496222 刀
- 在线时间
- 13313 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-12-25
|
鼎元C++期货量化/程序化教程【方差(variance)、标准差(standard deviation,sdev)计算方法及调用方法】
鼎元C++期货量化/程序化教程【方差(variance)、标准差(standard deviation,sdev)计算方法及调用方法】
1、方差的介绍参考:http://www.qhlt.cn/thread-160294-1-1.html;
2、重点写法:
(1)、先求平均值。
(2)、再求方差。
(3)、再求标准差。
(4)、再求平均标准差。
3、先在头文件中声明变量:- double Variance(string period, string inst, int num);//方差计算公式变量
- double StandardDev(string period, string inst, int num);//标准差计算公式变量
- double StdDev(string period, string inst, int num);//标准差平均计算公式变量
复制代码 4、在源文件中标准模块增加方差和标准差的模块:- //方差计算公式开始
- 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;
- }
- // 标准差平均计算公式结束
复制代码 |
论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
|
|
|
|
|
|
- UID
- 2
- 积分
- 2892507
- 威望
- 1396285 布
- 龙e币
- 1496222 刀
- 在线时间
- 13313 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-12-25
|
说明,有了上面的标准差计算公式函数后,在前面的boll带指标上面就可以很方便的计算boll的公式了,不用在 公式中现自己算标准差了。直接在求均线后直接加差标准差就行了。- //布林带(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)结束
复制代码 |
|
|
|
|
|
|
- UID
- 2
- 积分
- 2892507
- 威望
- 1396285 布
- 龙e币
- 1496222 刀
- 在线时间
- 13313 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-12-25
|
今天优化了一下标准差平均的公式,下周一试试效果,然后 在这里做修正。
程式码如下:- //标准差平均计算公式开始
- 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;
- }
- // 标准差平均计算公式结束
复制代码 因为我发现上面的标准差平均好像没有平均,仅调用到了标准差。 |
|
|
|
|
|
|
- UID
- 2
- 积分
- 2892507
- 威望
- 1396285 布
- 龙e币
- 1496222 刀
- 在线时间
- 13313 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-12-25
|
|
|
|
|
|
|