python量化之路:获取历史某一时刻沪深上市公司股票代码及上市时间
最近开始玩股票量化,由于想要做完整的股票回测,因此股票的上市和退市信息就必不可少。因为我们回测的时候必须要知道某一日期沪深股票的成分包含哪些对吧。所以我们要把沪深全部股票的上市时间、退市时间全部都爬下来(保存到本地以后检索会更快)。
0.1.确认主要工具
要用到的工具包括:
(1)python:基本工具
(2)pandas:格式化数据处理
(3)通联数据接口:http://www.datayes.com
(4)通联接口API:https://api.wmcloud.com/docs/pages/viewpage.action?pageId=1867781
1.开始获取数据
首先,我们先要获取全部上市公司的上市时间和退市时间(如果有)的列表,用通联数据的接口会发现我们的任务非常简单。
from pandas import DataFrame
from dataapiclient import Client
import json
client = Client()
client.init('cae5c4acc4ad4ccb93a8aaac4b8adb04363feaa9852c34d14ddd2248613b09b3')
url='/api/equity/getEqu.json?field=ticker,secShortName,listDate,delistDate&listStatusCD=L,S,DE,UN&secID=&ticker=&equTypeCD=A'
code, result = client.getData(url)
j = json.loads(result.decode())
d = DataFrame(j['data'])
d = d.set_index('ticker')
d = d[['secShortName','listDate','delistDate']]
d.to_csv('data/ticker_and _day_of_(de)list_date.csv')
如此一来,ticker_and _day_of_(de)list_date.csv文件中就保存了所需内容。需要注意的是数据中有个特例:DY600019
这是由于当时的重组并购导致主体变更,因此通联数据在股票代码前加上了DY前缀以示区别。
然后为了方便的获取历史某一时刻全部可交易的A股股票代码,我们定义一个函数,默认使用本地数据:get_a_stocks(date=None, update=False),date默认日期是系统当前日期,update表示是否需要更新本地数据。文件名beefinance.py
from pandas import DataFrame
from datetime import datetime
from dataapiclient import Client
import pandas
import json
import os
import types
import datetime
import time def get_a_stocks(date=None, update=False):
if date is None:
date = datetime.datetime.now()
if isinstance(date,str):
date = datetime.datetime.strptime(date, "%Y-%m-%d")
if not isinstance(date,datetime.datetime):
raise ValueError('date不接受此类型') if not isinstance(update, bool):
raise ValueError('update不接受此类型') data_dir = u'data'
data_filename = data_dir + u'/ticker_and _day_of_(de)list_date.csv' if not os.path.exists(data_dir):
os.mkdir(data_dir) if (not os.path.exists(data_filename)) or update:
client = Client()
client.init('cae5c4acc4ad4ccb93a8aaac4b8adb04363feaa9852c34d14ddd2248613b09b3')
url='/api/equity/getEqu.json?field=ticker,secShortName,listDate,delistDate&listStatusCD=L,S,DE,UN&secID=&ticker=&equTypeCD=A'
code, result = client.getData(url)
j = json.loads(result.decode())
d = DataFrame(j['data'])
d = d.set_index('ticker')
d = d[['secShortName','listDate','delistDate']]
d.to_csv(data_filename, encoding='utf-8')
d['listDate'] = pandas.to_datetime(d['listDate'])
d['delistDate'] = pandas.to_datetime(d['delistDate'])
d = d[d['listDate']<=date]
d1 = d[pandas.isnull(d['delistDate'])]
d2 = d[pandas.notnull(d['delistDate'])]
d2 = d2[d2['delistDate']>date]
d = d1.append(d2)
return d
else:
d = pandas.read_csv(data_filename, index_col='ticker', parse_dates=['listDate','delistDate'],encoding='utf-8')
d['listDate'] = pandas.to_datetime(d['listDate'])
d['delistDate'] = pandas.to_datetime(d['delistDate'])
d = d[d['listDate']<=date]
d1 = d[pandas.isnull(d['delistDate'])]
d2 = d[pandas.notnull(d['delistDate'])]
d2 = d2[d2['delistDate']>date]
d = d1.append(d2)
return d
下面测试效果:
from beefinance import get_a_stocks
d = get_a_stocks('2010-05-05')
print(d)
data/ticker_and _day_of_(de)list_date.csv
secShortName listDate delistDate
ticker
000001 平安银行 1991-04-03 NaT
000002 万科A 1991-01-29 NaT
000004 国农科技 1991-01-14 NaT
000005 世纪星源 1990-12-10 NaT
000006 深振业A 1992-04-27 NaT
000007 全新好 1992-04-13 NaT
000008 神州高铁 1992-05-07 NaT
000009 中国宝安 1991-06-25 NaT
000010 美丽生态 1995-10-27 NaT
000011 深物业A 1992-03-30 NaT
000012 南玻A 1992-02-28 NaT
000014 沙河股份 1992-06-02 NaT
000016 深康佳A 1992-03-27 NaT
000017 深中华A 1992-03-31 NaT
000018 神州长城 1992-06-16 NaT
000019 深深宝A 1992-10-12 NaT
000020 深华发A 1992-04-28 NaT
000021 深科技 1994-02-02 NaT
000022 深赤湾A 1993-05-05 NaT
000023 深天地A 1993-04-29 NaT
000025 特力A 1993-06-21 NaT
000026 飞亚达A 1993-06-03 NaT
000027 深圳能源 1993-09-03 NaT
000028 国药一致 1993-08-09 NaT
000029 深深房A 1993-09-15 NaT
000030 富奥股份 1993-09-29 NaT
000031 中粮地产 1993-10-08 NaT
000032 深桑达A 1993-10-28 NaT
000033 *ST新都 1994-01-03 NaT
000034 神州数码 1994-05-09 NaT
... ... ... ...
601899 紫金矿业 2008-04-25 NaT
601918 *ST新集 2007-12-19 NaT
601919 中国远洋 2007-06-26 NaT
601939 建设银行 2007-09-25 NaT
601958 金钼股份 2008-04-17 NaT
601988 中国银行 2006-07-05 NaT
601989 中国重工 2009-12-16 NaT
601991 大唐发电 2006-12-20 NaT
601998 中信银行 2007-04-27 NaT
601999 出版传媒 2007-12-21 NaT
000024 招商地产 1993-06-07 2015-12-30
000522 白云山A 1993-11-08 2013-04-26
000527 美的电器 1993-11-12 2013-09-18
000562 宏源证券 1994-02-02 2015-01-26578 盐湖集团 1995-03-03 2011-03-22594 国恒退 1996-03-20 2015-07-13
000602 金马集团 1996-08-19 2013-08-14787 *ST创智 1997-06-26 2013-02-08805 *ST炎黄 1998-05-29 2013-03-27
600087 退市长油 1997-06-12 2014-06-05
600102 莱钢股份 1997-08-28 2012-02-28
600253 天方药业 2000-12-27 2013-07-15
600263 路桥建设 2000-07-25 2012-03-01
600553 太行水泥 2002-08-22 2011-02-18
600631 百联股份 1993-02-19 2011-08-23
600656 退市博元 1990-12-19 2016-05-13
600832 东方明珠 1994-02-24 2015-05-20
600991 广汽长丰 2004-06-14 2012-03-20
601268 *ST二重 2010-02-02 2015-05-21
601299 中国北车 2009-12-29 2015-05-20 [1815 rows x 3 columns]
还不错。
python量化之路:获取历史某一时刻沪深上市公司股票代码及上市时间的更多相关文章
- [python]数据整理,将取得的众多的沪深龙虎榜数据整一整
将昨日取得的众多的沪深龙虎榜数据整一整 提取文件夹内所有抓取下来的沪深龙虎榜数据,整理出沪深两市(含中小创)涨幅榜股票及前5大买入卖出资金净值,保存到csv文件 再手动使用数据透视表进行统计 原始数据 ...
- python量化分析系列之---5行代码实现1秒内获取一次所有股票的实时分笔数据
python量化分析系列之---5行代码实现1秒内获取一次所有股票的实时分笔数据 最近工作太忙了,有一个星期没有更新文章了,本来这一期打算分享一些对龙虎榜数据的分析结果的,现在还没有把数据内的价值很好 ...
- 金融量化分析-python量化分析系列之---使用python获取股票历史数据和实时分笔数据
财经数据接口包tushare的使用(一) Tushare是一款开源免费的金融数据接口包,可以用于获取股票的历史数据.年度季度报表数据.实时分笔数据.历史分笔数据,本文对tushare的用法,已经存在的 ...
- 目前比较流行的Python量化开源框架汇总(交易+风险分析工具)
注:点击框架名称通往Github talib talib的简称是Technical Analysis Library,主要功能是计算行情数据的技术分析指标 numpy 介绍:一个用python实现的 ...
- python学习之路-day2-pyth基础2
一. 模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,第三方库存放位置:site-packages sys模块简介 导入模块 import sys 3 sys模 ...
- Python学习之路-Day2-Python基础2
Python学习之路第二天 学习内容: 1.模块初识 2.pyc是什么 3.python数据类型 4.数据运算 5.bytes/str之别 6.列表 7.元组 8.字典 9.字符串常用操作 1.模块初 ...
- Python学习之路-Day1-Python基础
学习python的过程: 在茫茫的编程语言中我选择了python,因为感觉python很强大,能用到很多领域.我自己也学过一些编程语言,比如:C,java,php,html,css等.但是我感觉自己都 ...
- Python量化交易
资料整理: 1.python量化的一个github 代码 2.原理 + python基础 讲解 3.目前发现不错的两个量化交易 学习平台: 聚宽和优矿在量化交易都是在15年线上布局的,聚宽是15年的新 ...
- 中国的 Python 量化交易工具链有哪些
摘抄自知乎:https://www.zhihu.com/question/28557233 如题,提问的范围限于适合中国大陆金融市场使用的工具链,所以IbPy和Quotopian之类主要面向欧美市场的 ...
随机推荐
- Java总结篇:Java多线程
Java总结篇系列:Java多线程 多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: ...
- 在CentOS 7 上安装docker
Docker CE Install yum-utils, which provides the yum-config-manager utility: $ sudo yum install -y yu ...
- PHP,Mysql根据经纬度计算距离并排序
网上给出的计算公式是这样的: Lng1表示A点纬度和经度,Lat2 Lng2 表示B点纬度和经度 a = Lat1 – Lat2为两点纬度之差 b = Lng1 -Lng2 为两点经度之差 6378. ...
- python之爬虫
一.从网页爬下字符串清除特殊字符 import re def validateTitle(title): rstr = r"[\/\\\:\*\?\"\<\>\|\t] ...
- RESTful API 架构解读
RESTful API 架构解读 首先我们还是先介绍下 RESTful api 的来龙去脉. 首先, RESTful (下文都简称 RESTful api 为 RESTful ) 1.RESTful ...
- win2003服务器定时自动重启命令
1. win2003可以这样自动重启: 新建一个命令行文件比如reboot.bat 内容如下:shutdown -r -t 30 在计划任务中新建一个任务,程序选择上面这个reboot.cmd文件,时 ...
- 【特效】手机端仿美团下拉菜单带遮罩层html+css+jquery
写了一个手机端的下拉菜单,类似美团,用相对单位rem写的. 效果截图: 代码很简单,原理有点类似嵌套的选项卡,其中的难点在于弹出下拉菜单后,出现黑色半透明遮罩层,而且下层列表页面禁止滚动了.关键就是给 ...
- IDoc 基础知识
Application Link Enabling ALE主要为了分布式业务系统而设计的.它可以使业务流程中的每个步骤分布在不同的SAP系统上,系统间可以通过IDoc交互数据.IDoc可以认为是个信封 ...
- 面试题:使用LinkedList来模拟一个堆栈或者队列数据结构
请使用LinkedList来模拟一个堆栈或者队列数据结构. 堆栈:先进后出 First In Last Out (FILO) 队列:先进先出 First In First Out (FIFO) 我 ...
- win10 uwp 访问解决方案文件
本文讲如何访问解决方案的资源. 我们经常会把一些图片资源放在我们的解决方案,那么从这里拿出来很简单. 我在 Assets 放了图片 1.jpg 那么我要把他拿出来可以 <Image Source ...