国内目前5家期货交易所都在官网公开了各自期货品种的历史数据。从技术上,它们各自的实现方式都不相同。在抓取数据的时候,会用到解析json,解析xml,解析html和解析tsv这几种不同的方式。爬取这几家的数据对于学习网络爬虫特别是数据解析方法是一个很好的练习题目。

接下来把5家交易所的日统计数据都抓取一遍,这里先从上海期货交易所日统计数据开始。

在浏览器按F12能看到,上海期货交易所的数据获取接口是:

GET  http://www.shfe.com.cn/data/dailydata/kx/kx20210826.dat

返回的数据格式是json。

具体的实现还是沿用这个系列一直使用的框架,按全量获取和增量获取分别实现,用线程池提高访问速度。本系列之前的文章都有说明,这里就不重复了。

json能取代其它数据格式,当前这么流行是有原因的,它不仅一定程度上满足了可读性,且对程序解析非常友好,基本就是一句话就转成了map数据结构。当然python中是dict。

json_value = json.loads(r.content.decode())

剩下唯一值得一提的问题是,具体测试的时候,发现新旧数据不完全兼容,比较新的数据增加了一个turnover字段(表示成交额),而在老数据中没有这个字段。

为了程序不出错,且能保存到同一张数据库表中,这里用最简单的方式处理一下,如果发现服务器没有返回turnover字段,就补一个None把位置填充上。

                if 'TURNOVER' in data:turnover = data['TURNOVER']else:turnover = None

完整的代码如下:

class ShfeDaily(AbstractDataRetriever):def __init__(self):super().__init__('futures_shfe_daily')def _full(self, **kwargs):self._get_data_list('20110101', today())def _delta(self, **kwargs):df_origin = self.query(fields='max(report_date)')if df_origin.empty or df_origin.iat[0, 0] is None:self._get_data_list('20110101', today())else:self._get_data_list(df_origin.iat[0, 0], today())def _get_data_list(self, start_date, end_date, max_worker=multiprocessing.cpu_count() * 2):df_cal_date = StockCalendar().query(fields='cal_date',where=f'`exchange`=\'shfe\' and is_open=\'1\' and cal_date >\'{start_date}\' and cal_date <= \'{end_date}\'',order_by='cal_date')with ThreadPoolExecutor(max_worker) as executor:future_to_date = \{executor.submit(self._get_daily_data, trade_date=row['cal_date']): rowfor index, row in df_cal_date.iterrows()}for future in as_completed(future_to_date):row = future_to_date[future]try:data = future.result()except Exception as ex:self.logger.error(f"failed to retrieve {row['cal_date']}")self.logger.exception(ex)def _get_daily_data(self, trade_date):shfe_url = f'http://www.shfe.com.cn/data/dailydata/kx/kx{trade_date}.dat'headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:89.0) Gecko/20100101 Firefox/89.0','Accept': '*/*','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2'}r = requests.get(shfe_url, headers=headers)json_value = json.loads(r.content.decode())df = pd.DataFrame(columns=['productid', 'name', 'deliverymonth', 'open', 'high', 'low', 'close', 'settlement', 'zd1_chg','zd2_chg', 'volume', 'turnover', 'openinterest', 'openinterestchg', 'report_date'])for data in json_value['o_curinstrument']:if data['OPENPRICE'] != '':if 'TURNOVER' in data:turnover = data['TURNOVER']else:turnover = Nonedf = df.append({'productid':data['PRODUCTID'].strip(), 'name':data['PRODUCTNAME'].strip(),'deliverymonth':data['DELIVERYMONTH'],'open':data['OPENPRICE'], 'high':data['HIGHESTPRICE'], 'low':data['LOWESTPRICE'],'close':data['CLOSEPRICE'],'settlement':data['SETTLEMENTPRICE'],'zd1_chg':data['ZD1_CHG'],'zd2_chg':data['ZD2_CHG'],'volume':data['VOLUME'],  'turnover':turnover,'openinterest':data['OPENINTEREST'],'openinterestchg':data['OPENINTERESTCHG'],'report_date':trade_date},ignore_index=True)self._save(df)if __name__ == '__main__':ShfeDaily().retrieve()

上海国际能源交易中心和上海期货交易所比较,除了网址域名不同,其它从数据格式到命名风格都如出一辙。这两家应该用的完全相同的后台系统。所以爬取数据的处理方式也完全相同,就不重复了。

量化投资从0开始系列 ---- 12. 上期所日统计数据相关推荐

  1. 量化投资从0开始系列 ---- 15. 郑商所日统计数据

    前面已经提取了其它期货交易所的数据,最后还剩下郑商所.相比而言,郑商所的数据获取比其它几个交易所更麻烦一点.因为郑商所的系统接口有两个,在2015年11月11日前后发生了切换,这个日期之前是老系统的a ...

  2. ExtJs2.0学习系列(12)--Ext.TreePanel之第一式

    今天开始,我们就开始一起学习TreePanel了,道个歉,上篇的代码很乱阿. 我总是喜欢用最简单的例子开始,去理解最基本的使用方法,减少对i后面高级使用的干扰! TreePanel是继承自Panel, ...

  3. 量化投资之多因子选股(一):数据准备与单因子检验

    文章目录 前言 系列文章 矢量化选股回测概述 要点1:数据格式 要点2:股票池 要点3:剔除ST股.停盘股.涨跌停 要点4: 仓位构建 要点5:回测 数据准备 单因子检测 样例 前言 本菜狗现在是哈工 ...

  4. eeglab教程系列(12)-使用ICA分解数据

    ICA分解数据 第一步:导入数据eeglab教程系列(2)-加载.显示数据 第二步:根据教程eeglab教程系列(3)-绘制脑电头皮图中导入位置信息. 做完上两步操作后,可以进行ICA数据分解. 第三 ...

  5. 物联网LoRa系列-12:LoRa终端--数据发送和接收的整个过程

    在上文<全面拆解和构建5G物联网-11:LoRa终端--基于物理层协议的PingPong应用程序的软件架构>中,我们已经通过开发板提供商提供的软件工程文件,在两个LoRa节点之间进行了点对 ...

  6. 冯永昌:云计算与大数据时代的量化投资

    转载自:http://www.dataguru.cn/article-5413-1.html 量化投资元年之后,相对于有限的资产管理机构和产品需求,人才和策略出现了阶段性过剩.另外一方面,有一个庞大的 ...

  7. python量化投资数据类型_python量化投资(二):如何得到数据

    在python量化投资(一)中我们写到,我们计算的前提是有数据,但是如何得到数据?上次也说了几种途径,今天主要讲解怎样提取数据,有一个前提条件 安装了python,笔者还安装了pychramIDE 一 ...

  8. alpha模型:打开量化投资的黑箱;附创业板布林带策略代码:年化15%。

    原创文章第108篇,专注"个人成长与财富自由.世界运作的逻辑, AI量化投资". 关于量化投资,我们写了不少文章.从数据准备,预处理,因子特征工程,因子分析,规则策略,模型,回测, ...

  9. 量化投资和主观投资到底有什么区别?

    摘要:量化投资作为一个新兴行业,在中国近几年得到长足发展,但由于时间较短,很多从业者和机构投资者都没有对这个行业有着充分的理解,本文会试图对量化投资是什么,超额收益的来源,量化投资和主观调研型投资的区 ...

最新文章

  1. 朴素、Select、Poll和Epoll网络编程模型实现和分析——Poll、Epoll模型处理长连接性能比较
  2. Linux RAR 安装和使用
  3. 搜索重复代码_通过MappedByteBuffer搜索大文件
  4. spark知识点八万字长文最全汇总和高频面试题目
  5. 将Windows文件挂在到Linux上
  6. 【learning】中国剩余定理
  7. 【安全】This base cannot be created with PLA.
  8. java多线程基础(synchronize关键字)
  9. (附源码)基于Android的订餐app 毕业设计 190711
  10. 如何下载省市县行政区划及乡镇边界
  11. 通过谷歌搜索指定大小的图片
  12. 互联网巨头争先入局智能汽车,盛世昊通董车长运筹帷幄
  13. Web前端之jQuery 一
  14. [ERROR][logstash.agent] Failed to execute action {:action=>LogStash
  15. 羊了个羊微信小游戏开发技术解析
  16. Logstash系列之--JAVA自定义插件
  17. html背景音乐自动播放embed,怎样在网页中插入背景音乐(自动播放代码).doc
  18. python基础——数据类型
  19. 预训练模型应用工具 PaddleHub情感分析、对话情绪识别文本相似度
  20. 安装禅道系统(开源)和配置RDS数据库

热门文章

  1. java中子类能否继承 重写父类的静态方法
  2. 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇
  3. Google Earth Engine(GEE)——全球哥白尼数字高程模型(GLO-30 DEM)
  4. 6个座位办公室最佳位置_办公室座位风水
  5. MATLAB 基础笔记(三):二维图像绘图
  6. 国内八大网络硬盘对比分析
  7. xp系统怎么启动任务计划服务器,xp怎么设置计划任务
  8. kindle电子书分享网 - 技术栈
  9. Unity3D 飞碟游戏改进版
  10. 【正则表达式并且关系】