StandardDev函数
Params
//此处添加参数
Vars
//此处添加变量
Series<Numeric> LNDIFF;//DIFF对数值
Series<Numeric> LNDEA;
Series<Numeric> LNMACD;
Events
OnBar(ArrayRef<Integer> indexs)
{
LNDIFF= 10000*(XAverage(Ln(Close),12) - XAverage(Ln(Close), 26));//改造后的LNDIFF
LNDEA =XAverage(LNDIFF,9);//LNDIFF的M个周期指数平滑移
LNMACD= 2*(LNDIFF-LNDEA);
PlotString("K线数",TEXT(CurrentBar+1),LOW);
PlotString("标准差",TEXT(StandardDev(LNDIFF,(CurrentBar+1),2)),LOW);//当前K线以前所有k线的LNDIFF样本标准差
PlotString("LNDIFF",TEXT(LNDIFF),LOW);
PlotString("AVGLNDIF",TEXT(Averagefc(LNDIFF,(CurrentBar+1))),LOW);//当前K线以前所有k线的LNDIFF的平均值
}
不能正确输出样本标准差和AVGLNDIF,请老师们指教
谢谢您的解答。
别人指出软件有问题,与别的软件不一样,到底有没有问题,是你们要检查的,不是我需要给你们检查。
只要有点统计学知识就知道TBquant是错的。我并没有假定文华是对的。我没必要跟你浪费时间了,一批固步自封的家伙。
有点基本的统计学知识就知道TBQUANT是错的
我要计算当前k线以前所有lndiff值的标准差,如果我的其他开仓条件同时满足lndiff在lndiff标准差的两倍范围内则开仓,超过则不开仓。发现的这个问题,文华财经上没问题,代码移植到TBQUANT出现不开仓情况。检查发现的。那就不浪费你时间了,继续用文华财经就是了。再就是STANDARDERD不能用变量做参数,也不好实现。其实我也是在浪费时间。
你的图STANDARDDEV(LNDIFF,5000,2),参数是这么设的吗?k线总数是50000吗?你的图形STANDARDDEV函数的第二个参数值一定很小或者k线总数很少。我没说算法上有什么不同,我是说可能调用函数时代入的数据总数少。
我用系统提供的standarddev函数验算了,并且与文华财经做了对比,std是文华财经的一个函数,我也自编了递推函数做了对比,文华财经与我做的递推函数基本一致,而与tbquant差别很大,另外在参数比较小时确实正确。稍微有点统计学知识就能知道在一个10000数据的样本改变20个数据,并且数据离散性不大,样本标准差绝对不会改变那么大,这点我会负责任。另外函数的代码与文华财经没有区别,所以我一开始认为样本数量有限制。
BARNUMBER=BARNUMBER[1]+1;
AVGLNDIF=AVGLNDIF[1]+(LNDIFF-AVGLNDIF[1])/BARNUMBER;
LNDIFPF=LNDIFPF[1]+SQR(LNDIFF);
LNDIFSTD=IIF(BARNUMBER>=2,Sqrt((LNDIFPF-BARNUMBER*SQR(AVGLNDIF))/(BARNUMBER-1)),0);
编一个递推公式递推出沪深300指数15分钟线从指数开始推出时的数据计算每根k线的样本标准差,然后与调用函数计算出的标准差对比一下,就知道了。函数没问题。
你的验证方法有问题,这个问题不能用小样本验算,样本数量要超过5000.
可以把上面的公式加载到沪深300的15分钟k线上,总k线数为50000,观察一下样本标准差的值,在20根k线之内标准差有的15,有的30以上,明显是错误。1个10000数据的样本只变化20个数据标准差应该变化很小。标准差在很小的范围由22变为14。
Params
//此处添加参数
Vars
//此处添加变量
Series<Numeric> LNDIFF;//DIFF对数值
Series<Numeric> LNDEA;
Series<Numeric> LNMACD;
Events
OnBar(ArrayRef<Integer> indexs)
{
LNDIFF= 10000*(XAverage(Ln(Close),12) - XAverage(Ln(Close), 26));//改造后的LNDIFF
LNDEA =XAverage(LNDIFF,9);//LNDIFF的M个周期指数平滑移
LNMACD= 2*(LNDIFF-LNDEA);
//PlotString("K线数",TEXT(CurrentBar+1),LOW);
PlotString("标准差",TEXT(STD(LNDIFF,10000,2)),LOW);//当前K线以前所有k线的LNDIFF样本标准差
//PlotString("LNDIFF",TEXT(LNDIFF),LOW);
PlotString("AVGLNDIF",TEXT(Averagefc(LNDIFF,10000)),LOW-40);//当前K线以前所有k线的LNDIFF的平均值
}
这样改为常量数值也错误。
K线数量在48000,STANDARDEV AVERAGE等函数的数值个数有没有限制?,可以加载到000300的15分钟线看一下,标准差、平均值起伏很大。