最近开始玩股票量化,由于想要做完整的股票回测,因此股票的上市和退市信息就必不可少。因为我们回测的时候必须要知道某一日期沪深股票的成分包含哪些对吧。所以我们要把沪深全部股票的上市时间、退市时间全部都爬下来(保存到本地以后检索会更快)。

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量化之路:获取历史某一时刻沪深上市公司股票代码及上市时间的更多相关文章

  1. [python]数据整理,将取得的众多的沪深龙虎榜数据整一整

    将昨日取得的众多的沪深龙虎榜数据整一整 提取文件夹内所有抓取下来的沪深龙虎榜数据,整理出沪深两市(含中小创)涨幅榜股票及前5大买入卖出资金净值,保存到csv文件 再手动使用数据透视表进行统计 原始数据 ...

  2. python量化分析系列之---5行代码实现1秒内获取一次所有股票的实时分笔数据

    python量化分析系列之---5行代码实现1秒内获取一次所有股票的实时分笔数据 最近工作太忙了,有一个星期没有更新文章了,本来这一期打算分享一些对龙虎榜数据的分析结果的,现在还没有把数据内的价值很好 ...

  3. 金融量化分析-python量化分析系列之---使用python获取股票历史数据和实时分笔数据

    财经数据接口包tushare的使用(一) Tushare是一款开源免费的金融数据接口包,可以用于获取股票的历史数据.年度季度报表数据.实时分笔数据.历史分笔数据,本文对tushare的用法,已经存在的 ...

  4. 目前比较流行的Python量化开源框架汇总(交易+风险分析工具)

     注:点击框架名称通往Github talib talib的简称是Technical Analysis Library,主要功能是计算行情数据的技术分析指标 numpy 介绍:一个用python实现的 ...

  5. python学习之路-day2-pyth基础2

    一.        模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,第三方库存放位置:site-packages sys模块简介 导入模块 import sys 3 sys模 ...

  6. Python学习之路-Day2-Python基础2

    Python学习之路第二天 学习内容: 1.模块初识 2.pyc是什么 3.python数据类型 4.数据运算 5.bytes/str之别 6.列表 7.元组 8.字典 9.字符串常用操作 1.模块初 ...

  7. Python学习之路-Day1-Python基础

    学习python的过程: 在茫茫的编程语言中我选择了python,因为感觉python很强大,能用到很多领域.我自己也学过一些编程语言,比如:C,java,php,html,css等.但是我感觉自己都 ...

  8. Python量化交易

    资料整理: 1.python量化的一个github 代码 2.原理 + python基础 讲解 3.目前发现不错的两个量化交易 学习平台: 聚宽和优矿在量化交易都是在15年线上布局的,聚宽是15年的新 ...

  9. 中国的 Python 量化交易工具链有哪些

    摘抄自知乎:https://www.zhihu.com/question/28557233 如题,提问的范围限于适合中国大陆金融市场使用的工具链,所以IbPy和Quotopian之类主要面向欧美市场的 ...

随机推荐

  1. MSSQL 自定义函数详解

    自定义函数分为:标量值函数或表值函数 如果 RETURNS 子句指定一种标量数据类型,则函数为标量值函数.可以使用多条 Transact-SQL 语句定义标量值函数. 如果 RETURNS 子句指定 ...

  2. SqlServer和Oracle中一些常用的sql语句4 局部/全局变量

    --把wh1仓库号中姓名含有"平"字的职工工资在原来的基础上加288 update 职工备份 set 工资=工资+288 where 仓库号='wh1' and 姓名 like ' ...

  3. 索引节点inode详解

    Inode(index node),索引节点.Linux系统中,分区要进行格式化,创建文件系统.在每个Linux存储设备或存储设备的分区(可以是硬盘,软盘,U盘等)被格式化为ext3文件系统后,一般分 ...

  4. scala配置intellij IDEA15.0.3环境及hello world!

    1. Intellij IDEA Scala开发环境搭建 Intellij IDEA 15.0.3 默认配置里面没有Scala插件,需要手动安装,在Intellij IDEA 15.0.3 第一次运行 ...

  5. git学习整理(1)git clone 理解

    1.git clone 的理解 git clone默认会把远程仓库整个给clone下来 ,只能clone远程库的master分支并在本地默认创建一个master分支 ,无法clone所有分支,若想要其 ...

  6. Delphi实现电脑端微信图片文件解密

    电脑端微信收到图片后是存在了“C:\Users\系统用户名\Documents\WeChat Files\微信帐号\Data”目录下的,但文件不能直接使用图片浏览器打开的,因为做了一些加密,之前有个朋 ...

  7. JS代码中!!的用法,以及代码性能对比

    一.!!的理解 解释: !!的意思就是把一个任意类型的值转换为布尔类型的值,一个!是取非 再一个!又取非,相当于把这个数据转换为boolen类型了. 使用场景: 常常用在if(a).if(!!a)这样 ...

  8. RandomAccessFile类进行文件加密

    文件加密/解密示例. package io; import java.io.*; public class encrypt { private File file; //存储文件对象信息 byte[] ...

  9. C++继承(07)

    继承 通过特殊化已有的类来建立新类的过程,叫做“类的派生”,原来的类叫做“基类”,新建立的类则叫做“派生类”.另一方面,从类的成员角度看,派生类自动地将基类的所有成员作为自己的成员,这叫做“继承”.基 ...

  10. PHP基础入门详解(一)【世界上最好用的编程语言】

       简介 --------- PHP(超文本预处器)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域.PHP 独特的语法混合了C.Ja ...