分享

python量化之路:获取历史某一时刻沪深上市公司股票代码及上市时间

 yespon 2017-11-27

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

0.1.确认主要工具

  要用到的工具包括:

  (1)python:基本工具

  (2)pandas:格式化数据处理

  (3)通联数据接口:http://www.

  (4)通联接口API:https://api./docs/pages/viewpage.action?pageId=1867781

 

1.开始获取数据

  首先,我们先要获取全部上市公司的上市时间和退市时间(如果有)的列表,用通联数据的接口会发现我们的任务非常简单。

复制代码
from pandas import DataFramefrom dataapiclient import Clientimport jsonclient = 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 DataFramefrom datetime import datetimefrom dataapiclient import Clientimport pandasimport jsonimport osimport typesimport datetimeimport timedef 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_stocksd = get_a_stocks('2010-05-05')print(d)
复制代码
复制代码
data/ticker_and _day_of_(de)list_date.csv secShortName listDate delistDateticker 000001 平安银行 1991-04-03 NaT000002 万科A 1991-01-29 NaT000004 国农科技 1991-01-14 NaT000005 世纪星源 1990-12-10 NaT000006 深振业A 1992-04-27 NaT000007 全新好 1992-04-13 NaT000008 神州高铁 1992-05-07 NaT000009 中国宝安 1991-06-25 NaT000010 美丽生态 1995-10-27 NaT000011 深物业A 1992-03-30 NaT000012 南玻A 1992-02-28 NaT000014 沙河股份 1992-06-02 NaT000016 深康佳A 1992-03-27 NaT000017 深中华A 1992-03-31 NaT000018 神州长城 1992-06-16 NaT000019 深深宝A 1992-10-12 NaT000020 深华发A 1992-04-28 NaT000021 深科技 1994-02-02 NaT000022 深赤湾A 1993-05-05 NaT000023 深天地A 1993-04-29 NaT000025 特力A 1993-06-21 NaT000026 飞亚达A 1993-06-03 NaT000027 深圳能源 1993-09-03 NaT000028 国药一致 1993-08-09 NaT000029 深深房A 1993-09-15 NaT000030 富奥股份 1993-09-29 NaT000031 中粮地产 1993-10-08 NaT000032 深桑达A 1993-10-28 NaT000033 *ST新都 1994-01-03 NaT000034 神州数码 1994-05-09 NaT... ... ... ...601899 紫金矿业 2008-04-25 NaT601918 *ST新集 2007-12-19 NaT601919 中国远洋 2007-06-26 NaT601939 建设银行 2007-09-25 NaT601958 金钼股份 2008-04-17 NaT601988 中国银行 2006-07-05 NaT601989 中国重工 2009-12-16 NaT601991 大唐发电 2006-12-20 NaT601998 中信银行 2007-04-27 NaT601999 出版传媒 2007-12-21 NaT000024 招商地产 1993-06-07 2015-12-30000522 白云山A 1993-11-08 2013-04-26000527 美的电器 1993-11-12 2013-09-18000562 宏源证券 1994-02-02 2015-01-26000578 盐湖集团 1995-03-03 2011-03-22000594 国恒退 1996-03-20 2015-07-13000602 金马集团 1996-08-19 2013-08-14000787 *ST创智 1997-06-26 2013-02-08000805 *ST炎黄 1998-05-29 2013-03-27600087 退市长油 1997-06-12 2014-06-05600102 莱钢股份 1997-08-28 2012-02-28600253 天方药业 2000-12-27 2013-07-15600263 路桥建设 2000-07-25 2012-03-01600553 太行水泥 2002-08-22 2011-02-18600631 百联股份 1993-02-19 2011-08-23600656 退市博元 1990-12-19 2016-05-13600832 东方明珠 1994-02-24 2015-05-20600991 广汽长丰 2004-06-14 2012-03-20601268 *ST二重 2010-02-02 2015-05-21601299 中国北车 2009-12-29 2015-05-20[1815 rows x 3 columns]
复制代码

  还不错。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多