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,请老师们指教

今天开发的同事上班了,确认过,序列变量的最大回溯bar数默认是10000,这主要是为了防止占用太多内存所采用的自动释放机制,一般普通用户不会使用超过10000根的回溯算法。 所以如果回溯计算的数量超过10000,那肯定就计算不对了,这个和standdev标准差无关,这个函数算法是准确的。 如果你需要超过10000根,可以用setbackbarmaxcount函数设置。

回复:谢谢您的解答。

你可以把excel文件的测算数据发到我邮箱 404851506@qq.com 我来检查一下 如果确实有问题 我来转发给开发人员 excel文件需要csv格式 需要tb能读取的形式

回复:别人指出软件有问题,与别的软件不一样,到底有没有问题,是你们要检查的,不是我需要给你们检查。

上图是文华上图是tb 两张图都是计算5000根bar的收盘价的标准差,都是白银主连15分钟 图线没有明显的不同 这是文华的计算结果 174.42 这是tb的运算结果 173.43 文华174.42 tb 173.43 由于两个软件的k线编制机制略有区别,有不到0.5%的误差也是属于正情况,并没有相差到很大的数量级。 代码在这里 VALUE:STD(CLOSE,N1);// 文华 PlotNumeric("value",StandardDev(close,n1,2));//tb 我不知道你测的是什么东西,但是我并没有发现文华的std函数和tb的standarddev函数算法上有很大区别 回答这个问题,纯粹浪费时间

回复:我要计算当前k线以前所有lndiff值的标准差,如果我的其他开仓条件同时满足lndiff在lndiff标准差的两倍范围内则开仓,超过则不开仓。发现的这个问题,文华财经上没问题,代码移植到TBQUANT出现不开仓情况。检查发现的。那就不浪费你时间了,继续用文华财经就是了。再就是STANDARDERD不能用变量做参数,也不好实现。其实我也是在浪费时间。 你的图STANDARDDEV(LNDIFF,5000,2),参数是这么设的吗?k线总数是50000吗?你的图形STANDARDDEV函数的第二个参数值一定很小或者k线总数很少。我没说算法上有什么不同,我是说可能调用函数时代入的数据总数少。

回复:你自己用5000试试上面代码就知道了,参数就是5000, 函数没有问题 回复之前难道都自己不试一试么。。。做交易这么不细致不行的吧

回复:

回复:你贴的图,只能说明tb和文华不一样吧?所以你先认定文华是对的,只要个文华不一样,就都错了,对吧?

回复:有点基本的统计学知识就知道TBQUANT是错的

回复:只要有点统计学知识就知道TBquant是错的。我并没有假定文华是对的。我没必要跟你浪费时间了,一批固步自封的家伙。

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,10,2)),LOW);//当前K线以前所有k线的LNDIFF样本标准差 PlotString(" LNDIFF",text(LNDIFF),high); //PlotString("LNDIFF",TEXT(LNDIFF),LOW); PlotString("AVGLNDIF",TEXT(Averagefc(LNDIFF,10)),LOW-40);//当前K线以前所有k线的LNDIFF的平均值 } 因为参数是10000 难以手工进行验算,于是将参数缩小为10,然后用excel进行验算,得到的结果是相符的。 不知道你说标准差函数有问题,到底怎么有问题,并且有没有做过验算就得出这个结论。如果没有验算就得出这种结论,非常不负责任。 建议你用其他软件试试同样的算法得到的结果,起码做好一次仔细严谨的验算工作再来报告bug。

回复:另外,你给的代码里std不知道是什么东西,用系统函数standarddev代替了

回复:我用系统提供的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.

函数不支持用变量作为参数 currentbar这种变化的数值会引起计算错误 具体你可以看看系统函数算法

回复: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的平均值 } 这样改为常量数值也错误。

回复:请指出具体错在哪里

回复:可以把上面的公式加载到沪深300的15分钟k线上,总k线数为50000,观察一下样本标准差的值,在20根k线之内标准差有的15,有的30以上,明显是错误。1个10000数据的样本只变化20个数据标准差应该变化很小。标准差在很小的范围由22变为14。

回复:std是什么东西?

K线数量在48000,STANDARDEV AVERAGE等函数的数值个数有没有限制?,可以加载到000300的15分钟线看一下,标准差、平均值起伏很大。