精华内容
下载资源
问答
  • 直接告诉你如何呈现实况:使用99%精度的Tick数据。 什么是Tick数据 Tick数据就是交易所中最详尽的交易数据结构。包括:开盘价、最高价、最低价、最新价、成交量、成交额。如果把交易数据比喻成河流,...

     

    • 写在前面的话

      文字并不具备精确传递信息的能力。除了程序员和律师等少数群体,很少人能保证自己说的东西能在一句话中被清晰传递的。所以,带着思考阅读从而帮助完善你的知识体系,改变你的行为,这才是您耗费时间,阅读本篇文章的意义。

      因此,在阅读本篇文章之前,我希望您能放下心里已有的成见,否则就算您通篇读完,留下的也只是带有您个人偏见的理解。您获得的多少并不取决于读了多少,而取决于您以空杯的心态,思考了多少、多深。

    • 什么是Bar数据

      在讲之前,先讲一下Bar数据。所谓的Bar数据,泛指普通的 K 线。在单独的每个Bar上面包含开盘价、收盘 价、最高价、最低价、成交量及时间。所有的Bar按照不同周期组合,并按照时间从先到后进行排列,由此形成为序列数据,整个序列称之为Bar数据。

      如果交易策略是基于Bar数据回测。按照Bar数据的Bar数目,从第一个Bar到最后一个Bar,依次进行计算,如果公式中出现了调用Bar数据函数的,则取出当前Bar的相应值,进行运算。如下图箭头所示,公式执行从上至下,Bar从左到右执行。

      Bar数据应用于非即时发单策略,是没有问题的。比如:当前条件成立,那么就在下根Bar发单。由于Bar数据量往往不是很大,在上百种上千组合回测或优化时,速度非常快。

    • bar数据回测的弊端

      大多数量化软件中,调用那个级别的数据,就是哪个级别的Bar。5分钟周期级别的Bar就是5分钟时间序列的开高低收等。一般最小级别是1分钟,也就是回测时只能使用1分钟级别粒度的数据。

      那么问题来了,1分钟以下的数据变动是无法得知的。这种数据与当时的实际市况有所差别,一个个小的差异积累起来就造成了与真实结果的巨大差异。

      就拿上图中,箭头所指的Bar来说:这是根带上下影线的阴线,图表级别为60分钟,你认为在60分钟里,价格怎么运动,才最终形成这根Bar。

      答案是:有非常非常多种可能。它有可能开盘就先上涨,创造出一个上影线。然后转头向下,创造出一个下影线。然后再转头向上收盘;它也可能开盘就砸盘,直接创造出一个下影线。然后转头向上,创造出一个上影线。然后再转头向下收盘。总之,在这根Bar最终形成之前的60分钟内,价格的波动有很多种可能。

      如果即时策略用Bar数据回测,回测引擎只是根据Bar的开高低收等,做计算。因为回测引擎并不知道价格是如何跳动才形成最终的Bar。在Bar中,价格即有可能先上后下,也有可能先下后上。

      还有一个更为重要的弊端。在Bar回测中,并没有参考盘口数据,比如:买一价和卖一价。在Bar数据回测中,只要触发开平仓的价格在最高价与最低价之内,都能成交。但此时此刻如果恰好没有对手盘的话,那么Bar回测引擎在撮合的时候是检测不出来的。一次两次影响不大,但只要Bar的数据足够多,就足以产生以假乱真的虚假绩效报告。

    • 举个栗子

      我举一个很简单的例子做范例说明。策略描述:当均线往上时往上触碰现在K线高点时作多、当均线往下时往下触碰现在K线低点时放空,另外加上移动出场─当获利大于等于10点后,折返获利1%就出场。

      代码如下:

      回测如下:

      如果你在开发交易策略的时候看到这个现象就很兴奋的以为自己发现圣杯的话... 那么你就想错了。

      钱有这么好赚就好了啦=_=。这样的回测报表一整个就是垃圾!因为那些出场点位几乎可以说都是做不到的!!

      上面这图,空心三角形就是出场位置的标示,看看那个出场标示在哪边?没错,就是K线的最高点,请想一想这有没有问题?我们定下的出场除了多空翻单外,就是移动出场,既然移动出场要有折返才会出场,那出场点在K线的最高点有可能吗?

      如果使用99%精度的Tick数据,回测如下:

      这篇简单的范例不是想指出用很灵敏的移动出场是不可行的,而是说这种的即时策略,在真实运作时会是怎样的状况?至于,造成这个垃圾回测报表的原因,我就不多叙述了。直接告诉你如何呈现实况:使用99%精度的Tick数据。

    • 什么是Tick数据

      Tick数据就是交易所中最详尽的交易数据结构。包括:开盘价、最高价、最低价、最新价、成交量、成交额。如果把交易数据比喻成河流,Tick数据就是这个河流在某个横截面的数据。

      如上图所示,国外交易所每个动作都会实时推送到市场上来。而国内交易所,每秒两次进行检查,如果该时间段内有动作,则生成一次快照并且推送出来。相比较而言,数据的推送充其量只能算做 OnTime,而不能叫做OnTick。

    • BotVS的Tick数据

      尽管国内Tick数据并不是真正意义上的 Tick,但是使用这种数据进行回测,至少可以无限接近和还原了现实。每个Tick中显示着当时这个商品在市场中的主要参数,并且在实盘中我们的代码,就是跟着理论每秒 2 次的Tick在进行计算。

      不仅如此,在 BotVS 中即使加载的是1小时周期的数据,依然可以调整数据粒度,比如将数据粒度调整为 1 分钟。此时此刻的1小时K线就是用1分钟数据组成的。当然,粒度越小,精度越高。

      更为强大的是,如果将数据切换为实盘级Tick,就可以无缝还原真实的实盘环境。即1秒2次Tick交易所的真实数据。

    • 总结

      你不可能拿着玩具枪就上战场,不是吗?在开始实盘之前,我们都会慎之又慎。客观的压力检验,能帮你省下许多真金白银,而这些损失通常都是不必要的。

      那么历史数据的准确性就成了你的交易策略检验结果的关键因素之一,假如你的数据是不准确的,那么在这种数据下的优化和回测必然也是无法在市场中进行的。

      否则在Bar模式下看着很爽的模型,到最后变成一个很爽的陷阱......回测,就是要对自己狠一点......

    展开全文
  • C++高精度模板

    千次阅读 2018-08-29 17:16:03
    以下转自高精度算法——百度百科 真的太强了,必须爆!! #include<iostream> #include<sstream> #include<algorithm> #include<cstring> #include&...

    以下转自高精度算法——百度百科

    真的太强了,必须吹爆!!

    #include<iostream>
    #include<sstream>
    #include<algorithm>
    #include<cstring>
    #include<iomanip>
    #include<vector>
    #include<cmath>
    #include<ctime>
    #include<stack>
    using namespace std;
    struct Wint:vector<int>//用标准库vector做基类,完美解决位数问题,同时更易于实现
    {
        //将低精度转高精度的初始化,可以自动被编译器调用
        //因此无需单独写高精度数和低精度数的运算函数,十分方便
        Wint(int n=0)//默认初始化为0,但0的保存形式为空
        {
            push_back(n);
            check();
        }
        Wint& check()//在各类运算中经常用到的进位小函数,不妨内置
        {
            while(!empty()&&!back())pop_back();//去除最高位可能存在的0
            if(empty())return *this;
            for(int i=1; i<size(); ++i)//处理进位 
            {
                (*this)[i]+=(*this)[i-1]/10;
                (*this)[i-1]%=10;
            }
            while(back()>=10)
            {
                push_back(back()/10);
                (*this)[size()-2]%=10;
            }
            return *this;//为使用方便,将进位后的自身返回引用
        }
    };
    //输入输出
    istream& operator>>(istream &is,Wint &n)
    {
        string s;
        is>>s;
        n.clear();
        for(int i=s.size()-1; i>=0; --i)n.push_back(s[i]-'0');
        return is;
    }
    ostream& operator<<(ostream &os,const Wint &n)
    {
        if(n.empty())os<<0;
        for(int i=n.size()-1; i>=0; --i)os<<n[i];
        return os;
    }
    //比较,只需要写两个,其他的直接代入即可
    //常量引用当参数,避免拷贝更高效
    bool operator!=(const Wint &a,const Wint &b)
    {
        if(a.size()!=b.size())return 1;
        for(int i=a.size()-1; i>=0; --i)
            if(a[i]!=b[i])return 1;
        return 0;
    }
    bool operator==(const Wint &a,const Wint &b)
    {
        return !(a!=b);
    }
    bool operator<(const Wint &a,const Wint &b)
    {
        if(a.size()!=b.size())return a.size()<b.size();
        for(int i=a.size()-1; i>=0; --i)
            if(a[i]!=b[i])return a[i]<b[i];
        return 0;
    }
    bool operator>(const Wint &a,const Wint &b)
    {
        return b<a;
    }
    bool operator<=(const Wint &a,const Wint &b)
    {
        return !(a>b);
    }
    bool operator>=(const Wint &a,const Wint &b)
    {
        return !(a<b);
    }
    //加法,先实现+=,这样更简洁高效
    Wint& operator+=(Wint &a,const Wint &b)
    {
        if(a.size()<b.size())a.resize(b.size());
        for(int i=0; i!=b.size(); ++i)a[i]+=b[i];
        return a.check();
    }
    Wint operator+(Wint a,const Wint &b)
    {
        return a+=b;
    }
    //减法,返回差的绝对值,由于后面有交换,故参数不用引用
    Wint& operator-=(Wint &a,Wint b)
    {
        if(a<b)swap(a,b);
        for(int i=0; i!=b.size(); a[i]-=b[i],++i)
            if(a[i]<b[i])//需要借位
            {
                int j=i+1;
                while(!a[j])++j;
                while(j>i)
                {
                    --a[j];
                    a[--j]+=10;
                }
            }
        return a.check();
    }
    Wint operator-(Wint a,const Wint &b)
    {
        return a-=b;
    }
    //乘法不能先实现*=,原因自己想
    Wint operator*(const Wint &a,const Wint &b)
    {
        Wint n;
        n.assign(a.size()+b.size()-1,0);
        for(int i=0; i!=a.size(); ++i)
            for(int j=0; j!=b.size(); ++j)
                n[i+j]+=a[i]*b[j];
        return n.check();
    }
    Wint& operator*=(Wint &a,const Wint &b)
    {
        return a=a*b;
    }
    //除法和取模先实现一个带余除法函数
    Wint divmod(Wint &a,const Wint &b)
    {
        Wint ans;
        for(int t=a.size()-b.size(); a>=b; --t)
        {
            Wint d;
            d.assign(t+1,0);
            d.back()=1;
            Wint c=b*d;
            while(a>=c)
            {
                a-=c;
                ans+=d;
            }
        }
        return ans;
    }
    Wint operator/(Wint a,const Wint &b)
    {
        return divmod(a,b);
    }
    Wint& operator/=(Wint &a,const Wint &b)
    {
        return a=a/b;
    }
    Wint& operator%=(Wint &a,const Wint &b)
    {
        divmod(a,b);
        return a;
    }
    Wint operator%(Wint a,const Wint &b)
    {
        return a%=b;
    }
    //顺手实现一个快速幂,可以看到和普通快速幂几乎无异
    Wint pow(const Wint &n,const Wint &k)
    {
        if(k.empty())return 1;
        if(k==2)return n*n;
        if(k.back()%2)return n*pow(n,k-1);
        return pow(pow(n,k/2),2);
    }
    int main()
    {
    	
    }

     

    展开全文
  • 精度乘法

    2018-09-09 18:51:41
    本来不怎么会写,老师布置了一道求阶乘的作业,就实现了一波 直接上代码: #include #include #include int arr[100000]; int qrr[100000]; void fac(int n) { ...上述, 高精度乘法求阶乘

    本来不怎么会写,老师布置了一道求阶乘的作业,就实现了一波

    直接上代码:

    #include<iostream>
    #include<string>
    #include<cstring>
    
    
    int arr[100000];
    int qrr[100000];
    
    void fac(int n)
    {
    	if(n < 0)
    	{
    		std::cout << "ERROR" << std::endl;
    		return;
    	}
    	memset(arr, -1, sizeof arr);
    	arr[0] = 1;
    	int t = 1;
    	int temp = 0;
    	for(int i=2; i <= n; ++i)
    	{
    		int skip = t;
    		for(int j=0; j < skip; ++j)
    		{
    			arr[j] *= i;
    			arr[j] += temp;
    			if(arr[j] >= 10)
    			{
    				temp = arr[j] / 10;
    				if(arr[j + 1] == -1)
    				{
    					arr[j + 1] = temp;
    					++t;
    				}
    				arr[j] %= 10;
    				continue;
    			}
    			temp = 0;
    		}
    		temp = 0;
    	}
    	for(int i=t-1; i >= 0; --i)
    	{
    		std::cout << arr[i];
    	}
    	std::cout << std::endl;
    	return;
    }
    
    
    
    int main()
    {
    	int n;
    	std::cin >> n;
    	fac(n);
    	return 0;
    }
    
    
    
    

    上述, 高精度乘法求阶乘

    展开全文
  • iOS 解决相关的精度问题

    千次阅读 2016-07-29 10:47:26
    虽说这个问题不难,但是,解决起来十分的麻烦,其中就有一些相关的精度问题: 下面我就介绍一下我们遇到的问题 通过网络请求 直接得到一些数据Data ,通过iOS 系统自带的解析方式: NSDictionary *dic = ...

    最近在项目中遇到一些问题;虽说这个问题不难,但是,解决起来十分的麻烦,其中就有一些相关的精度问题:

    下面我就介绍一下我们遇到的问题


    通过网络请求 直接得到一些数据Data ,通过iOS 系统自带的解析方式:

    NSDictionary *dic = [NSJSONSerializationJSONObjectWithData:responseObject options:NSJSONReadingMutableContainers |NSJSONReadingMutableLeaves error:nil];

    把data 转换成dic 

    我通过断点的方式,可以查看所有的数据

    总共20条,下面我们查看第三条,然后查看如图这个字节


    我们把 这个字节打印出来(选中那个字节,右击一下,选择 printf Description of "value" 这一选项),这时候可以在控制台看到打印出来的结果

    Printing description of ((__NSCFNumber *)0x00007fe4850b46a0):

    9.369999999999999


    上面看的结果是 (doule)9.37 为什么打印的结果会不同呢,精度的缺失呀

    此上为其一


    下面还有一种情况 就是:

    NSArray *list = [resultobjectForKey:@"list"];

            for (NSDictionary * dicin list) {

                double testDouble = [dic[@"annualEarnings"]doubleValue]; 

                NSLog(@"%lf", [dic[@"annualEarnings"]doubleValue]);

            }


    通过这种方法遍历,打印的结果如下:

     跟上面图一的结果一样,但是当我

            NSLog(@"%@",result);


    打印整个字典的时候,看图:


    为什么会出现上述的如此情况,问题的出现在所难免,其中一部分是iOS 系统编译器的问题,那么,作为一个程序员,能做的就是去解决这类问题(因为编译器的问题你也解决不了),遇到问题要想办法去解决

    下面是我在项目中运用的方法去解决这个问题

    首先 我定义了一个方法:

    /*

     此方法把double ---> NSString

     

     */

    - (NSString *)decimalNumberWithDouble:(double)conversionValue

    {

       NSString *doubleString        = [NSStringstringWithFormat:@"%lf", conversionValue];

       NSDecimalNumber *decNumber    = [NSDecimalNumberdecimalNumberWithString:doubleString];

       return [decNumber stringValue];

    }



    然后我们可以在遍历字典

    NSArray *list = [resultobjectForKey:@"list"];

            for (NSDictionary * dicin list) {

            

               double testDouble = [dic[@"annualEarnings"]doubleValue]; 

               NSString *convertString = [selfdecimalNumberWithDouble:testDouble];

                NSLog(@"%@",convertString);

            }

    j结果如图

    看见了了没  精度没有缺失

    所以,遇到问题要解决:


    再如:

     NSString *convertString = [self decimalNumberWithDouble:9.3699999999];

        NSLog(@"%@",convertString);//9.37 方法在上面


     NSString *doubleString        = [NSString stringWithFormat:@"%lf", 9.3699999999];

        NSLog(@"%@",doubleString);//9.370000


      NSString *doubleString        = [NSString stringWithFormat:@"%lf", 9.3688889999];

        NSLog(@"%@",doubleString);//9.368889


    上面都是一些精度相关的问题

    附录:下面这个方法是字符串转化成double类型 解决精度问题

    /*

     *字符串转化成double类型

     */

    - (double)StringChangeToDoubleForJingdu:(NSString *)textString

    {

       if (textString == nil || [textString isEqualToString:@""]) {

           return 0.0;

        }

        NSNumberFormatter *formatter = [[NSNumberFormatteralloc]init];

        

        [formatter setNumberStyle:NSNumberFormatterDecimalStyle];

        

       return  [[formatter numberFromString:textString]doubleValue];

     

    }


    展开全文
  • 在开发中经常会遇到Double.parseDouble() 、Integer.parseInt()转换后与我们想要得到的值不一致的...双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。一般情
  • 【C语言】高精度小数

    2020-04-12 10:48:48
    中国大学MOOC平台浙江大学翁恺老师,“程序设计入门——C语言” 第6周编程练习 高精度小数
  • 精度?速度? 圆桌收录 · 基因解码 做相关研究的朋友测一次序大概需要2周左右的时间(http://news.zhenduan.org/?p=3971.html),我想问的是瓶颈主要在哪里? 精度: 现在测序的精度有没有问题? 速度: 测序的...
  • 蓝桥杯 基础练习 高精度加法 (vip) 代码: #include&lt;stdio.h&gt; #include&lt;string.h&gt; int main() { char a[110],b[110],c[110]; memset(c,0,sizeof(c));//防止出现乱码,清零 ...
  • 在开发中发现一个double赋值的went: Struct.Float32 a = 1.4; double b = a; a赋值给b后,调试发现b的值居然为1.3999999... 试过很多方法,最终解决方法如下: b = Double.valueOf(a+"");......
  • 大数,高精度计算---大数减法 大数是算法语言中的数据类型无法表示的数,其位数超过最大数据类型所能表示的范围,所以,在处理大数问题时首先要考虑的是怎样存储大数,然后是在这种存储方式下其处理的实现方法。 ...
  • SCAU 计算高精度加法(C Programming)

    千次阅读 2018-10-22 17:42:58
    Description ... /*反向输出,就可以得到高精度加法的计算结果*/ return 0; } 一双手 可以不求人 顽强面对 这世界 绝情又刻薄 照样无惧 当 天开眼 暖风 云雾会散开 ——《一双手》
  • (11)要对自己所使用的机床精度、刀具转动精度及加工误差有所了解,要和编程员密切沟通,使光刀时留足够多的余量。 (12)加工完成要在机床上对照编程图形进行测量。如不合格,要分析原因。要通过调整编程余量重新编程...
  • (11)要对自己所使用的机床精度、dao具转动精度及加工误差有所了解,要和编程员密切沟通,使光dao时留足够多的余量。 (12)加工完成要在机床上对照编程图形进行测量。如不合格,要分析原因。要通过调整编程余量...
  • //一定要注意精度啊,不加ceil((double))会WA啊。 } if(y>mid) return false; } return y; } int main() { // freopen("1.txt","r",stdin); scanf("%d",&n); int maxx=0; for(int i=0; i; ++i){ scanf("%d...
  • Description Now,given the equation 8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == Y,can you find its solution between 0 and 100; Now please try your lucky. Input The first line of the input contains an integer...
  • 百度地图高精度IP定位+手机定位js

    千次阅读 2017-09-01 13:49:19
    body,html,#allmap{width:100%;height:100%;overflow:hidden;margin:0;font-family:"微软雅黑";} http://ip.chinaz.com/getip.aspx">--> http://api.map.baidu.com/api?v=2.0&ak=你的密钥">
  • 最后小编推荐一款可以应用在空调领域中的温湿度传感器,由工采网从国外引进的高精度湿度测量传感器模块 - HTW-211,HTW-211是基于HumiChip®的精确可靠的湿度测量传感器。传感器的湿度输出已经温度补偿,并且是线性...
  • hdu2036改革春风满地

    2016-10-19 19:54:37
    改革春风满地 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 30566 Accepted Submission(s): 15736 Problem Description “ 改革春风满地, 不会...
  • 铜转炉炼终点预报是转炉生产的一个重要环节,直接影响转炉的生产效益。其炼工艺相当复杂,影响生产因素众多且因素之间相互...仿真结果表明,建立的预报模型具有较高的自学习及泛化能力,预报结果具有较高的精度
  • 很多人说:阿朱历年写了很多篇文章,说了很多观点,能否总结一下,看看他过的牛逼是否业界有实现,哪些被打脸了。嗯,那我就自己总结一下。一、先说一点无关的碎碎念:关于大时代、...
  • 近日,中国科学院深圳先进技术研究院副院长、香港...他表示,总结起来做人工智能的跟阿里的理念其实相似,阿里讲“让天下没有难做的生意”,做人工智能是讲“让天下没有难的牛”。 他还分享了商汤科技在计算...
  • 这篇 Java 基础,我不动了

    万次阅读 多人点赞 2021-09-13 10:53:00
    为什么 Java 能够出这种牛批的口号来?核心就是 JVM。我们知道,计算机应用程序和硬件之间会屏蔽很多细节,它们之间依靠操作系统完成调度和协调,大致的体系结构如下 那么加上 Java 应用、JVM 的体系结构会变为...
  • 给定目标硬件,如何确定最优的速度-精度折衷边界?换言之:给定推断延时的限制,模型能达到的最高精度是多少?给定精度要求,模型所需的最短延时是多少? 作者 |驭势科技 为此,驭势科技AI研究院联合...
  • 1.5)进行了数值模拟,计算域采用FNM(full non-matched)形式的蝶形结构化网格来模拟射流,计算格式采用了包括LU-SGS-GE(lower upper symmetric Gauss Seidel Gaussian Elimination method)隐式格式和改良型高精度、高...
  • 中空挤出塑型坯壁厚尺寸直接影响塑料容器的制造...仿真实验结果表明,壁厚数据编辑操作的方便性和灵活性得到改善,壁厚数据质量和壁厚控制精度得到提高。开发了型坯壁厚控制人机界面软件,并进行了应用验证,取得了
  • 采用人工神经元网络技术开发了转炉冶炼终点钢水温度预报模型.利用宝钢的实际生产数据对模型...软件运行结果表明,钢水温度预报模型验证精度误差在±12 ℃范围内的占60%以上,建立的模型精度可以满足现场工艺要求.
  • 改革春风满地   Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 30217 Accepted Submission(s): 15577     Problem Description “ 改革...
  • K - 改革春风满地

    2017-11-11 12:10:38
    #include #include #include #include #define max 100 ...K - 改革春风满地  HDU - 2036  #include #include #include #include #define max 100
  • 第一章为TensorRT综述,就是自有多牛逼。第四章为示例,介绍demo的代码结构及功能。开篇是目录,前三章每章为两到三篇,最后第四章示例,会拆分几个关键示例进行详细说明。  这是第二章最后一部分内容,关于...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,591
精华内容 1,036
关键字:

吹的精度