全部 智大领峰 TBQuant功能 TBL语言 TB开户 问答专区 高手圈 其他
StandardDev函数
2022-06-10 06:22

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

qdyxr0001

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

2022-06-10 06:51
kyover

函数不支持用变量作为参数

currentbar这种变化的数值会引起计算错误

具体你可以看看系统函数算法

 

2022-06-11 07:13
qdyxr0001
@kyover

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的平均值
    }

这样改为常量数值也错误。

2022-06-11 08:43
kyover
@qdyxr0001

请指出具体错在哪里

2022-06-11 08:54
qdyxr0001
@kyover

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

2022-06-11 10:03
kyover
@qdyxr0001

std是什么东西?

2022-06-11 17:24
kyover

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。

2022-06-11 17:38
kyover
@kyover

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

2022-06-11 17:38
qdyxr0001
@kyover

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

2022-06-11 18:14
kyover

上图是文华上图是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函数算法上有很大区别

回答这个问题,纯粹浪费时间

2022-06-11 19:25
qdyxr0001
@kyover

我要计算当前k线以前所有lndiff值的标准差,如果我的其他开仓条件同时满足lndiff在lndiff标准差的两倍范围内则开仓,超过则不开仓。发现的这个问题,文华财经上没问题,代码移植到TBQUANT出现不开仓情况。检查发现的。那就不浪费你时间了,继续用文华财经就是了。再就是STANDARDERD不能用变量做参数,也不好实现。其实我也是在浪费时间。

你的图STANDARDDEV(LNDIFF,5000,2),参数是这么设的吗?k线总数是50000吗?你的图形STANDARDDEV函数的第二个参数值一定很小或者k线总数很少。我没说算法上有什么不同,我是说可能调用函数时代入的数据总数少。

 

 

2022-06-11 19:57
kyover
@qdyxr0001

你自己用5000试试上面代码就知道了,参数就是5000, 函数没有问题

回复之前难道都自己不试一试么。。。做交易这么不细致不行的吧

2022-06-11 20:20
qdyxr0001
@kyover

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

2022-06-12 10:53
qdyxr0001
@kyover

2022-06-11 21:05
kyover
@qdyxr0001

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

 

2022-06-12 09:02
qdyxr0001
@kyover

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

2022-06-12 10:56
kyover

你可以把excel文件的测算数据发到我邮箱 404851506@qq.com 我来检查一下 如果确实有问题 我来转发给开发人员

excel文件需要csv格式 需要tb能读取的形式

2022-06-12 09:16
qdyxr0001
@kyover

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

2022-06-12 11:02
kyover

今天开发的同事上班了,确认过,序列变量的最大回溯bar数默认是10000,这主要是为了防止占用太多内存所采用的自动释放机制,一般普通用户不会使用超过10000根的回溯算法。

所以如果回溯计算的数量超过10000,那肯定就计算不对了,这个和standdev标准差无关,这个函数算法是准确的。

如果你需要超过10000根,可以用setbackbarmaxcount函数设置。

2022-06-13 15:35
qdyxr0001
@kyover

谢谢您的解答。

2022-06-13 17:11
您未登录,请先 登录注册 后发表评论
顶部