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

具体的地址在哪里,还是依靠在浏览器中按F12来确定,最后发现的地址是:

        if trade_date > '20151111':czce_url = f'http://www.czce.com.cn/cn/DFSStaticFiles/Future/{trade_date[0:4]}/{trade_date}/FutureDataDaily.htm'else:czce_url = f'http://www.czce.com.cn/cn/exchange/{trade_date[0:4]}/datadaily/{trade_date}.htm'

数据格式方面,郑商所的情况跟大商所有些类似,都是返回一个html子页面,然后也提供txt和excel文件下载。因为之前已经处理过txt的格式,这里我们就来直接用http的格式处理一次。

其实http数据的处理也有很多方式,下面的代码就用python自带的HTMLParser来做这件事。这样做最大的优点是不用引入其它第三方的库了。

r = requests.get(czce_url, headers=headers)
parser = CzceHtmlParser()
parser.feed(r.content.decode())
data_origin = parser.data

这里的CsceHtmlParser要自己实现:

class CzceHtmlParser(HTMLParser):def __init__(self):super().__init__()self.in_table = Falseself.in_tr = Falseself.in_td = Falseself.last_tag = Noneself.data = []def handle_starttag(self, tag, attrs):self.last_tag = tagif tag == 'table' and (('id', 'senfe') in attrs or ('id', 'tab1') in attrs):self.in_table = Trueif self.in_table and tag == 'tr':self.data.append([])self.in_tr = Trueif self.in_tr and tag == 'td':self.in_td = Truedef handle_endtag(self, tag):if self.in_table and tag == 'table':self.in_table = Falseif self.in_tr and tag == 'tr':self.in_tr = Falseif self.in_tr and tag == 'td':self.in_td = Falsedef handle_data(self, data):if self.in_tr and self.in_td:self.data[-1].append(data.strip().replace(',', ''))def error(self, message):print(message)

为了执行效率考虑,HTMLParser是按流式进行解析的,所以当进入某个tag节点的时候,要记录一下状态,这样到子节点才可以根据上下文进行定制化的处理。这个解析器最核心的逻辑就是当进入ID为senfe或者tab1之后(新旧两套系统的id不同),将每个tr都作为二维表的一行保存到输出的数据list中。

当然还是要对数据做必要的清洗,包括删除表头,去掉小计和总计行,补全部分数据格式不整齐的情况:

        del data_origin[0]for item in data_origin:if item[0] != '小计' and item[0] != '总计':data_list.append(item)if len(item) == 13:item.append('')

完整代码如下:

import multiprocessing
from concurrent.futures import ThreadPoolExecutor, as_completed
from html.parser import HTMLParserimport pandas as pd
import requestsfrom common.utils import *
from tushare_client.base import AbstractDataRetriever
from tushare_client.stock_calendar import StockCalendarclass CzceDaily(AbstractDataRetriever):def __init__(self):super().__init__('futures_czce_daily')def _full(self, **kwargs):self._get_data_list('20110101', today())def _delta(self, **kwargs):df_origin = self.query(fields='max(trade_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`=\'czce\' 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):if trade_date > '20151111':czce_url = f'http://www.czce.com.cn/cn/DFSStaticFiles/Future/{trade_date[0:4]}/{trade_date}/FutureDataDaily.htm'else:czce_url = f'http://www.czce.com.cn/cn/exchange/{trade_date[0:4]}/datadaily/{trade_date}.htm'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(czce_url, headers=headers)data_list = []columns = ['instrumentid', 'presettlement', 'open', 'high', 'low', 'close', 'settlement', 'zd1_chg', 'zd2_chg','volume', 'openinterest', 'openinterestchg', 'turnover', 'deliveryprice']parser = CzceHtmlParser()parser.feed(r.content.decode())data_origin = parser.datadel data_origin[0]for item in data_origin:if item[0] != '小计' and item[0] != '总计':data_list.append(item)if len(item) == 13:item.append('')df = pd.DataFrame(data=data_list, columns=columns)df['trade_date'] = trade_dateself._save(df)class CzceHtmlParser(HTMLParser):def __init__(self):super().__init__()self.in_table = Falseself.in_tr = Falseself.in_td = Falseself.last_tag = Noneself.data = []def handle_starttag(self, tag, attrs):self.last_tag = tagif tag == 'table' and (('id', 'senfe') in attrs or ('id', 'tab1') in attrs):self.in_table = Trueif self.in_table and tag == 'tr':self.data.append([])self.in_tr = Trueif self.in_tr and tag == 'td':self.in_td = Truedef handle_endtag(self, tag):if self.in_table and tag == 'table':self.in_table = Falseif self.in_tr and tag == 'tr':self.in_tr = Falseif self.in_tr and tag == 'td':self.in_td = Falsedef handle_data(self, data):if self.in_tr and self.in_td:self.data[-1].append(data.strip().replace(',', ''))def error(self, message):print(message)if __name__ == '__main__':CzceDaily().retrieve()

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

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

    国内目前5家期货交易所都在官网公开了各自期货品种的历史数据.从技术上,它们各自的实现方式都不相同.在抓取数据的时候,会用到解析json,解析xml,解析html和解析tsv这几种不同的方式.爬取这几家 ...

  2. 2020年必知的15个中小型企业网络安全统计数据

    2020年全球COVID-19大流行正改变着世界各地中小型企业.虽然中小型企业目前不是网络犯罪分子的头号目标(大型公司,政府和关键基础设施是犯罪分子的首要目标),但是这并不意味着中小型企业就可以对网络 ...

  3. ExtJs2.0学习系列(15)--extjs换肤

    extjs的默认皮肤很好看,但是我们还可以变换样式切换其他皮肤. 1.直接添加其他css文件换肤. 皮肤文件:xtheme-olive.zip下载 把皮肤文件解压,把css文件(如xtheme-oli ...

  4. python 量化交易 库_量化投资的Python库——Tushare

    本来想用python自带的help命令和dir命令,来写一个关于Tushare库的使用手册呢,但是后来发现了Tushare的官方网站, ̄□ ̄||,网址如下: http://tushare.org/ 把 ...

  5. 2019穿越熊市最佳攻略,聪明人都选择量化投资!

    量化投资策略可以帮我们在大熊市中依然获益,不至于死的很惨. 文 | 火星公开课 出品 | 火星财经(ID:hxcj24h) 火星财经(微信:hxcj24h)一线报道,3月1日晚,量化投资学会理事长丁鹏 ...

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

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

  7. 李斌:中国量化投资踏上快速发展期

    转载自:http://www.dataguru.cn/article-5414-1.html 量化资产配置的核心思想是,通过定量分析,制定优化的资产配置方案,分散投资到多个相互关联较弱,具有正的预期回 ...

  8. 量化投资发展史上的那些“决定性瞬间”

    如果从1952年哈里·马科维茨发表<投资组合选择>论文那一刻算起,量化投资至今已经走过了六十多年的发展历程.从量化投资理论肇始到经过"黑色星期一"这场金融风暴的洗礼再到 ...

  9. 【方法论述】量化投资——神话、黑箱与真谛

    编者语:文艺复兴基金的创始人西蒙斯(Jim Simons)是数学教授,他领导的量化对冲基金长期超越市场,是世界上最成功的对冲基金之一.旗下的"大奖章基金"(Medallion Fu ...

最新文章

  1. AI视觉组仙人一步之高级玩法——从Python回归C语言
  2. 51CTO,什么情况?
  3. 现代JavaScript中的精美图案:制冰厂
  4. thinkphp-session与cookie
  5. C语言__builtin_choose_expr实现函数重载
  6. 华为云welink成像是反的_华为云Welink下载_华为云Welink 中文版 v6.6.6.0_Win10镜像官网...
  7. Oracle 数据类型 选择自 tjandy 的 Blog
  8. 如何用yolov5训练自己的图片
  9. 《深入理解计算机网络》读后小记 8、IP地址和子网
  10. 图像处理中的直方图与均衡化
  11. 2021-2027全球及中国LXP平台行业研究及十四五规划分析报告
  12. 阿里巴巴开放平台Oauth2.0协议获取access_token
  13. 县级外业调查及举证软件_MapGIS第三次国土调查系列产品
  14. python编程招生海报_怎么用ps做招生海报
  15. 创建LV报错/dev/vgdata/data: not found: device not cleared Aborting. Failed to wipe start of new LV.
  16. 复现 ASPCMS企业建站系统Cookies欺骗漏洞
  17. Error inflating class出现报错
  18. 小码哥教育Vuejs笔记
  19. ubuntu设置共享文件夹成功后却不显示找不到
  20. android 小米键盘输入法,Facemoji输入法小米版

热门文章

  1. 【Halcon】Region特征详解
  2. 阿里确认布局自动驾驶,BAT再度聚首竞争白热化
  3. 树莓派语音交互--语音输入识别
  4. 大白话DDD-领域驱动设计实战教程
  5. 2021最新面试题出炉
  6. 晋中php培训,晋中php培训
  7. (转载)R14也称作子程序连接寄存器
  8. micropython入门(二)硬件入门及步进电机驱动(102+A4988板)
  9. SwitchHosts小工具
  10. 四大组件之Service(四)-Service的线程、工作线程、权限及系统Service