量化投资从0开始系列 ---- 15. 郑商所日统计数据
前面已经提取了其它期货交易所的数据,最后还剩下郑商所。相比而言,郑商所的数据获取比其它几个交易所更麻烦一点。因为郑商所的系统接口有两个,在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. 郑商所日统计数据相关推荐
- 量化投资从0开始系列 ---- 12. 上期所日统计数据
国内目前5家期货交易所都在官网公开了各自期货品种的历史数据.从技术上,它们各自的实现方式都不相同.在抓取数据的时候,会用到解析json,解析xml,解析html和解析tsv这几种不同的方式.爬取这几家 ...
- 2020年必知的15个中小型企业网络安全统计数据
2020年全球COVID-19大流行正改变着世界各地中小型企业.虽然中小型企业目前不是网络犯罪分子的头号目标(大型公司,政府和关键基础设施是犯罪分子的首要目标),但是这并不意味着中小型企业就可以对网络 ...
- ExtJs2.0学习系列(15)--extjs换肤
extjs的默认皮肤很好看,但是我们还可以变换样式切换其他皮肤. 1.直接添加其他css文件换肤. 皮肤文件:xtheme-olive.zip下载 把皮肤文件解压,把css文件(如xtheme-oli ...
- python 量化交易 库_量化投资的Python库——Tushare
本来想用python自带的help命令和dir命令,来写一个关于Tushare库的使用手册呢,但是后来发现了Tushare的官方网站, ̄□ ̄||,网址如下: http://tushare.org/ 把 ...
- 2019穿越熊市最佳攻略,聪明人都选择量化投资!
量化投资策略可以帮我们在大熊市中依然获益,不至于死的很惨. 文 | 火星公开课 出品 | 火星财经(ID:hxcj24h) 火星财经(微信:hxcj24h)一线报道,3月1日晚,量化投资学会理事长丁鹏 ...
- 冯永昌:云计算与大数据时代的量化投资
转载自:http://www.dataguru.cn/article-5413-1.html 量化投资元年之后,相对于有限的资产管理机构和产品需求,人才和策略出现了阶段性过剩.另外一方面,有一个庞大的 ...
- 李斌:中国量化投资踏上快速发展期
转载自:http://www.dataguru.cn/article-5414-1.html 量化资产配置的核心思想是,通过定量分析,制定优化的资产配置方案,分散投资到多个相互关联较弱,具有正的预期回 ...
- 量化投资发展史上的那些“决定性瞬间”
如果从1952年哈里·马科维茨发表<投资组合选择>论文那一刻算起,量化投资至今已经走过了六十多年的发展历程.从量化投资理论肇始到经过"黑色星期一"这场金融风暴的洗礼再到 ...
- 【方法论述】量化投资——神话、黑箱与真谛
编者语:文艺复兴基金的创始人西蒙斯(Jim Simons)是数学教授,他领导的量化对冲基金长期超越市场,是世界上最成功的对冲基金之一.旗下的"大奖章基金"(Medallion Fu ...
最新文章
- AI视觉组仙人一步之高级玩法——从Python回归C语言
- 51CTO,什么情况?
- 现代JavaScript中的精美图案:制冰厂
- thinkphp-session与cookie
- C语言__builtin_choose_expr实现函数重载
- 华为云welink成像是反的_华为云Welink下载_华为云Welink 中文版 v6.6.6.0_Win10镜像官网...
- Oracle 数据类型 选择自 tjandy 的 Blog
- 如何用yolov5训练自己的图片
- 《深入理解计算机网络》读后小记 8、IP地址和子网
- 图像处理中的直方图与均衡化
- 2021-2027全球及中国LXP平台行业研究及十四五规划分析报告
- 阿里巴巴开放平台Oauth2.0协议获取access_token
- 县级外业调查及举证软件_MapGIS第三次国土调查系列产品
- python编程招生海报_怎么用ps做招生海报
- 创建LV报错/dev/vgdata/data: not found: device not cleared Aborting. Failed to wipe start of new LV.
- 复现 ASPCMS企业建站系统Cookies欺骗漏洞
- Error inflating class出现报错
- 小码哥教育Vuejs笔记
- ubuntu设置共享文件夹成功后却不显示找不到
- android 小米键盘输入法,Facemoji输入法小米版