本文介绍了股票1分钟数据常见的一些问题,比如时间少于240分钟,数据不准确,时间格式不一致等等,之后展示用Python找出这些问题的思路和代码。

网上教学量化交易的文章很多,但是在我自己从事量化的这两年多里面,第一年我50%的工作量都花在了数据处理上面,其中预处理中的股票数据清洗工作在最初阶段占用了我大量的时间。一开始我就没有用手工的方式去做,我用python去做清洗的。但是股票1分钟数据里面各种奇奇怪怪的错误层出不穷,我只能不断地打补丁,直到一年后才开始稳定下来。本文分享我处理这些问题的经验。

1分钟数据结构

原始的一分钟数据往往是csv文件格式。这个文件没有head,用逗号“,”分割,每一列数据依次是日期,时间,开盘价,最高价,最低价,收盘价,量能,金额

我们要把这种原始的csv1分钟文件转换成hdf5格式才能在系统中使用。但是在转换过程中经常遇到错误,原因在于csv文件中有很多问题,导致转换失败,或者转换出来的数据有错误。所以我们需要在源头先做一次检查,把“脏”数据清洗一遍。csv转为hdf5的格式可以看下面这篇文章。

1分钟数据文件中可能出现的各种错误

我在处理过程中发现过以下几种问题:

1. 含有不等于240分钟的交易日的股票文件。即文件行数无法整除240

2. 含有连续25分钟无量的文件,即可能盘中停牌,或者数据来源中断的情况。

3. 价格<=0 或者 价格>=1000的情况

4. 量能>=1亿手的情况(一般不太可能出现)

5. 时间格式问题

6. 如果是指数,还要与沪市大盘做交易日比较。

接下去分别详细描述每一个问题,并给出解法。

1. 含有不等于240分钟的交易日的股票文件。即文件行数无法整除240

我们知道,交易日一天是4个小时,也就是240分钟,所以正常情况下应该有240行数据,但是早期数据往往少于240分钟。在回测中遇到这种情况,就会出问题。所以应该事先找出这部分数据。

思路:如果一天有240分钟,那么一个文件中无论包含多少天,这个文件的行数应该能够整除240

解决:

f = open(fullpath, 'r')chunks = f.read()f.close()lines = chunks.rstrip().split(os.linesep)len_of_lines = len(lines)# 检查行数if len_of_lines%240 != 0: rec.log_imcompletefile( fullpath, len_of_lines ) # 这一行没关系,是我自己做的log类。

思路2:也有可能正巧有些数据,有2个或多个交易日不足240行数据,但是加起来正好是240行,所以可以躲过第一种检测。

解决方法: 一个个交易日去检查,设定一个指针firstmin指向每一个交易日的第一行数据,另一个指针pos遍历这一个交易日的每一天。# 开始一行行读查看问题 firstmin = 0 # 始终指向某一天的开始 pos = 0 #指向当前航 count_no_vol = 0 min_list = [ line.rstrip().split(',') for line in lines] while pos < len_of_lines: if min_list[pos][0] != min_list[firstmin][0]: # 一天读完 rec.total_tradeday += 1 # 总交易日增加1天,因为样本单位常常以天为处理单位,因此想知道总的交易日中有问题的比例。 date = min_list[firstmin][0] if pos < firstmin + 240: # 这一天不完整 rec.log_imcompleteday( fullpath, date, pos-firstmin) check_novol(min_list, firstmin, pos, fullpath, date, rec) check_line(stock, min_list, firstmin, pos, fullpath, date, rec) # 一天处理完,因为此时pos已经在下一天的第一分钟了,所以把firstmin指向pos。 firstmin = pos pos += 1 # 因为最后一天的日期都是一样的,所以上面while循环完成后这一天不会做处理。 if pos != firstmin: # 处理最后一天 if pos < firstmin + 240: # 这一天不完整 rec.log_imcompleteday( fullpath, date, pos-firstmin) check_novol(min_list, firstmin, pos, fullpath, date, rec) check_line(stock, min_list, firstmin, pos, fullpath, date, rec) min_list.clear()

2. 含有连续25分钟无量的文件,即可能盘中停牌,或者数据来源中断的情况。

这种问题在新股和停牌的股票中很常见,这几年数据稳定多了,但是以前的数据这种情况经常出现。需要记录下来以后可以有其他数据后补充进去。

def check_novol( min_list, firstmin, pos, fullpath, date, rec): ''' 不管是否完整,统计当天无量的分钟数,为了性能考虑, 只要这一天出现超过25分钟无量的情况,就记录下来,然后跳出循环开始检查下一天。 ''' i = j = firstmin while i < pos: if min_list[i][6].startswith('0.0'): j = i while j=25: # 有超过连续25分钟没有成交 rec.log_novolday( fullpath , date, min_list[j-1][1], j-i) break i = j else: i+=1

3. 价格<=0 或者 价格>=1000的情况

4. 量能>=1亿手的情况(一般不太可能出现)

这两个问题放一起检查,这种问题看起来匪夷所思,但是在我处理过程中确实出现过。def check_line(stock_code, min_list, firstmin, pos, fullpath, date, rec): ''' 检查价格问题 检查量能问题 ''' i = firstmin zero = Decimal('0.0') while i < pos: print(stock_code, '\t',i) open = Decimal(min_list[i][2]) high = Decimal(min_list[i][3]) low = Decimal(min_list[i][4]) close = Decimal(min_list[i][5]) vol = Decimal(min_list[i][6]) if open <= zero or high <= zero or low<=zero or close<=zero or vol >= Decimal('1000000000'): rec.log_wrong_price(fullpath, ','.join(min_list[i])) i+=1

5. 时间格式问题

我们要求的时间格式是YYYY/MM/DD,但是有可能出现MM/DD/YYYY,YYYY-MM-DD,DD/MM/YYYY等格式,这会导致在之后转换成hdf文件时出错。

思路:用正则表达式匹配

解决:

把这个功能添加进上面的check_line函数中。

def check_line(stock_code, min_list, firstmin, pos, fullpath, date, rec): ''' 检查日期问题 检查价格问题 检查量能问题 ''' i = firstmin zero = Decimal('0.0') wrong_datefmt = False while i < pos: print(stock_code, '\t',i) open = Decimal(min_list[i][2]) high = Decimal(min_list[i][3]) low = Decimal(min_list[i][4]) close = Decimal(min_list[i][5]) vol = Decimal(min_list[i][6]) if open <= zero or high <= zero or low<=zero or close<=zero or vol >= Decimal('1000000000'): rec.log_wrong_price(fullpath, ','.join(min_list[i])) if not wrong_datefmt and re.match('\d{4}\/\d\d\/\d\d', min_list[i][0]) : rec.log_wrong_datefmt(fullpath, ','.join(min_list[i])) wrong_datefmt = True # 一天记录一次就够了。 i+=1

这个check_line比上面的多了几行,代码很简单。主要是注意一天只要记录一次就够了,否则记录240次,看log会发现满屏的时间错误,时间错误。

6. 如果是指数,还要与沪市大盘做交易日比较。

很幸运,一般来说,大盘的数据总是完整,准确的。

不幸的是,其他的指数就经常有很多问题了,比如缺失交易日,数据错误等等。

解决:这个功能我是把csv转换成hdf5之后再做的,用pandas的index比较很方便。首先要保证sh000001没有交易日缺失,然后用下面这一句话就可以判断指数sz399300是否有交易日缺失。df_sh000001.index.equals(df_sz399300.index)

log展示

对沪市主板,深市主板,中小板,创业板,指数各自单独做记录,有利于之后分批做处理。

下面的文件名分前缀和后缀,前缀代表板块,后缀代表问题。sh6代表沪市主板,sz000代表深市主板,sz002代表中小板,sz300代表创业板。后缀imcomp代表有交易日不满240分钟,novol代表有连续25分钟以上无量,wrong_price代表有价格错误,datefmt代表日期格式不一致。

下面展示一些记录。

汇总

无量日

不完整日

问题找出来了,怎么解决呢?

大多数情况只能再去寻找其他数据,把多份不完整的数据补完成一份完整的数据。

数据错误我是手动去一个个检查,然后对照通达信等看盘软件去修正。但是这个只能修正近期的数据,过去的数据还是没办法。只能去找其他数据源来对照修复。

时间格式错误最简单,写个python脚本替换一下就行了。

好了,今天的分享就到这里,大家有什么问题可以留言。

up主写文花了不少时间,觉得好的话,请帮忙点个赞,给up主一点鼓励,谢谢啦~

python股票数据清洗,量化交易股票数据清洗工作不用愁,Python帮你解忧愁相关推荐

  1. python 股票自动交易助手_hikyuu: 基于C++/Python的开源量化交易研究框架

    Hikyuu Quant Framework是一款基于C++/Python的开源量化交易研究框架,用于策略分析及回测(仅受限于数据,如有数据也可用于期货等).其核心思想基于当前成熟的系统化交易方法,将 ...

  2. 股票实盘量化交易之所以受普通投资者欢迎有哪两大原因?

    股票实盘量化交易之所以如此受普通投资者欢迎,还有以下2个原因: 1.零成本试错,全市场捕捉赚钱机会 一般来说,大家都是拿真金白银去股票市场冒险的,风险极高,但如果你会量化交易,大可不必拿自己的血汗钱去 ...

  3. 浅析股票网格量化交易的不同优势以及具备什么条件限制

    在股市的长期走势中,震荡市场占比超过70%,真正连续涨跌的股票很少,而网格量化交易方法是一种专门针对震荡的交易策略,它利用市场在一定范围内的波动来赚取差价收入. 网格交易最初诞生于外汇交易市场,因为有 ...

  4. 股票数据量化交易接口是什么?

    股票数据量化交易接口是什么?量化交易接口是一款股票交易接口货交易接口全自动智能量化接口,兼容全球主流平台,全自动交易,无需人工干涉,即可自动炒交易接口赚钱,核心智能量化技术+核心算法,云大数据计算补仓 ...

  5. python量化投资必背代码-基于python的开源量化交易,量化投资架构

    原标题:基于python的开源量化交易,量化投资架构 github地址:https://github.com/bbfamily/abu abu能够帮助用户自动完善策略,主动分析策略产生的交易行为,智能 ...

  6. python 量化交易 框架 开源_Hikyuu首页、文档和下载 - 基于 C++/Python 的开源量化交易研究框架 - OSCHINA - 中文开源技术交流社区...

    Hikyuu Quant Framework是一款基于C++/Python的开源量化交易研究框架,用于策略分析及回测.其核心思想基于当前成熟的系统化交易方法,将整个系统化交易抽象为由市场环境判断策略. ...

  7. 4天掌握python量化交易_【量化】4天学会python机器学习与量化交易-笔记1(p6~p10)

    文章目录 p6 获取板块.交易行情数据 p7 获取财务数据与定时器 p8 投资组合与交易 p9 策略的收益指标 p10 策略风险指标 视频:4天学会python机器学习与量化交易 平台:米筐 4天学会 ...

  8. python量化交易开源框架_hikyuu: 基于C++/Python的开源量化交易研究框架

    Hikyuu Quant Framework是一款基于C++/Python的开源量化交易研究框架,用于策略分析及回测(仅受限于数据,如有数据也可用于期货等).其核心思想基于当前成熟的系统化交易方法,将 ...

  9. 用Python写一个量化交易策略

    好的,这是一个关于如何用 Python 写一个量化交易策略的简单示例. 首先,需要准备好所需的数据.这可以通过使用量化交易软件或者第三方数据源来获取.接下来,你可以使用 Python 的 pandas ...

最新文章

  1. eclipse怎样在线安装hibernate tools插件并使用
  2. 电脑卡得厉害,得采取一些措施了
  3. Python机器学习类库常见问题及解决
  4. 如何在servlet刚启动时候获取服务器根目录?
  5. Segment公司--整合数据进行分析
  6. 【Python学习笔记】Coursera之PY4E学习笔记——String
  7. PYTHON网络爬虫大数据朱炯明
  8. 开发工具-压力测试工具 ab
  9. python logging日志分割_Python3测井曲线切割,python3logging,日志
  10. hdb3编码规则波形_求HDB3码编码后波形,编码后功率谱密度图形,求解啊
  11. PIXHAWK飞行模式
  12. C predefined macros __FILE__,__LINE__,__func__
  13. 一种崭新的长尾分布下分类问题的通用算法|NeurIPS 2020
  14. java不能连接mysql_java无法连接数据库问题(急)
  15. 并发-FutureTask
  16. 自动追频超声波塑料焊接发生器电源设计
  17. 区块链软件公司 区块链怎样在各个职业里担任小程序的人物?
  18. how to know a new word's meaning
  19. 操作系统无法识别声卡的解决方法
  20. 为bib文件中文参考文献的key域添加排序用拼音

热门文章

  1. 群晖docker下安装mysql
  2. 海绵城市建设理念下市政道路的设计
  3. 概率统计18——再看大数定律
  4. U盘的资料删除了还能恢复吗?U盘误删除文件恢复技巧分享
  5. 头插法建立单链表(带头结点和不带头结点)
  6. 国产系统UOS与office完成适配后的使用亲测体验
  7. 工业相机(三)(转)
  8. 计算机电缆和屏蔽线的区别,DJVVRP计算机电缆带屏蔽线
  9. js读取远程图片成为base64
  10. mysql er 图_数据库ER图基础概念整理