最近開始玩股票量化,因爲想要作完整的股票回測,所以股票的上市和退市信息就必不可少。由於咱們回測的時候必需要知道某一日期滬深股票的成分包含哪些對吧。因此咱們要把滬深所有股票的上市時間、退市時間所有都爬下來(保存到本地之後檢索會更快)。html
要用到的工具包括:python
(1)python:基本工具json
(2)pandas:格式化數據處理api
(3)通聯數據接口:http://www.datayes.comapp
(4)通聯接口API:https://api.wmcloud.com/docs/pages/viewpage.action?pageId=1867781函數
首先,咱們先要獲取所有上市公司的上市時間和退市時間(若是有)的列表,用通聯數據的接口會發現咱們的任務很是簡單。工具
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前綴以示區別。ui
而後爲了方便的獲取歷史某一時刻所有可交易的A股股票代碼,咱們定義一個函數,默認使用本地數據:get_a_stocks(date=None, update=False),date默認日期是系統當前日期,update表示是否須要更新本地數據。文件名beefinance.pyurl
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 平安銀行 1991-04-03 NaT 萬科A 1991-01-29 NaT 國農科技 1991-01-14 NaT 世紀星源 1990-12-10 NaT 深振業A 1992-04-27 NaT 全新好 1992-04-13 NaT 神州高鐵 1992-05-07 NaT 中國寶安 1991-06-25 NaT 美麗生態 1995-10-27 NaT 深物業A 1992-03-30 NaT 南玻A 1992-02-28 NaT 沙河股份 1992-06-02 NaT 深康佳A 1992-03-27 NaT 深中華A 1992-03-31 NaT 神州長城 1992-06-16 NaT 深深寶A 1992-10-12 NaT 深華髮A 1992-04-28 NaT 深科技 1994-02-02 NaT 深赤灣A 1993-05-05 NaT 深天地A 1993-04-29 NaT 特力A 1993-06-21 NaT 飛亞達A 1993-06-03 NaT 深圳能源 1993-09-03 NaT 國藥一致 1993-08-09 NaT 深深房A 1993-09-15 NaT 富奧股份 1993-09-29 NaT 中糧地產 1993-10-08 NaT 深桑達A 1993-10-28 NaT *ST新都 1994-01-03 NaT 神州數碼 1994-05-09 NaT ... ... ... ... 紫金礦業 2008-04-25 NaT *ST新集 2007-12-19 NaT 中國遠洋 2007-06-26 NaT 建設銀行 2007-09-25 NaT 金鉬股份 2008-04-17 NaT 中國銀行 2006-07-05 NaT 中國重工 2009-12-16 NaT 大唐發電 2006-12-20 NaT 中信銀行 2007-04-27 NaT 出版傳媒 2007-12-21 NaT 招商地產 1993-06-07 2015-12-30 白雲山A 1993-11-08 2013-04-26 美的電器 1993-11-12 2013-09-18 宏源證券 1994-02-02 2015-01-26 鹽湖集團 1995-03-03 2011-03-22 國恆退 1996-03-20 2015-07-13 金馬集團 1996-08-19 2013-08-14 *ST創智 1997-06-26 2013-02-08 *ST炎黃 1998-05-29 2013-03-27 退市長油 1997-06-12 2014-06-05 萊鋼股份 1997-08-28 2012-02-28 天方藥業 2000-12-27 2013-07-15 路橋建設 2000-07-25 2012-03-01 太行水泥 2002-08-22 2011-02-18 百聯股份 1993-02-19 2011-08-23 退市博元 1990-12-19 2016-05-13 東方明珠 1994-02-24 2015-05-20 廣汽長豐 2004-06-14 2012-03-20 *ST二重 2010-02-02 2015-05-21 中國北車 2009-12-29 2015-05-20 [1815 rows x 3 columns]
http://www.cnblogs.com/prpl/p/5561327.html