历史数据的储存结构

Discussion in 'General Topics on Software and Data' started by protein, Jul 10, 2013.

  1. 有个问题:
    每只股票的real time 数据(秒级)算了算一天就一万多行了,1500只股票,一天得1500万行,一年的话 。。。五年的话。。。
    这么多数据用来回测也就罢了,如果用来分析的话,搜索起来也太慢了吧?
    大家是怎么存这么多数据的?sql吗?搜索起来速度怎么样?
     
  2. 如果是秒级的数据回测的话,几个月数据就够了吧。问题是秒级的策略利润都很低啊。你的手续费是多少?如果不是在机构里的话很难盈利吧。
     
  3. 我就用MySQL存几个月的数据,再久远的就归档了,如果有需要再拿出来。用MySQL模拟超级慢,一般我把数据读到内存中要一个晚上吧。然后就让数据呆在内存里了哈哈。

    我另外把每日的数据按报价时间先后生成一个Tape(一天一个文件),模拟的时候直接读取这个Tape文件,一天一天模拟。我的模拟器与真实交易是同一个程序,只不过将报价源切换成硬盘上的Tape。如果天数多就用几个虚拟机一起模拟。

    关键是秒级数据Execution很难做到与实际一致(或接近)啊,你打算怎么做?
     
  4. 用MSSQL 2008企业版,每个股票一天的数据放一条记录,加索引,1年的股票1分钟数据,20G,访问起来挺快的,难点不在这里,而在于数据的除权处理,策略的高效计算设计
     
  5. 我还没有完成交易系统的开发,目前只是在数据这一步上,计划用IB. 不做A股。
    数据这边解决的越快,以后系统的自由度会更大,毕竟眼睛好了,可以练更快的剑。
     
  6. 这样的tape模拟方法对于每日市场结束后完全平仓的日内交易比较好。如果做日间交易的话第二天遇到除权,分红什么的,会不会让机器判断错误?

    秒级数据的execution 的确非常难与实际一致,必须考虑滑点,在模拟的时候,那就怎么让自己不舒服怎么来,尽量考虑做最差的情况呗。
     
  7. 好的,我去试试看。
    关于除权,假设你已经存好了过去一年的数据,今天某只股票突然除权了,那么,对这只股票过去一年的数据都要除权,问题是,上千只股票,怎么能知道这里面某只股票除权或分红了?
    你有好的方法吗?
     


  8. 如果策略要隔夜,一般1分钟数据就够了吧。标准时间的数据我有专门的函数在读取出来以后自动复权复息(是这么说吧?)。我大多用MATLAB分析,然后稍微估计一下交易成本。我觉得策略隔夜的话用tick data意义不大吧。
     
  9. 我有一张表格专门存储权息数据。举个例子:

    首先读取证券数据:SELECT * FROM GS_NYS WHERE ...;
    然后读取权息数据:SELECT * FROM SPLIT_AND_DIVIDEND WHERE SYMBOL="GS" AND EXCHANGE="NYSE";
    然后用权息信息调整读取的证券数据
     
  10. 喔,这是个好办法:)
     
  11. 数据库的读写处理都比txt慢,所以我一直都用txt储存数据。
    因为一直做的是日内交易,必须获取多市场的实时数据,3年前构思解决方案的时候被数据吓傻了。所以后来选了一个折中的方案来处理。
    因为我的日内交易策略基本上都是在一个股票池里运作,所以针对特别的股票池,我设定的更新数据时间为3秒,而同一个市场的其它数据更新时间设定为10秒。遇到同一时间多市场同时交易的时候,我监控的股票池品种大约一共不到1000种。配合我的SSD硬盘+64G内存,基本上没问题。
    历史数据日线就不说了。分钟线数据,对我来说1分钟太短没意义,所以我只保留5分钟的数据,而且不超过20年,否则数据太多文件太大。
    我保存的数据有日线数据、复权日线数据,和5分钟数据。
    另外,我每年都更新一块SSD硬盘。