zoukankan      html  css  js  c++  java
  • python量化之路:获取历史某一时刻沪深上市公司股票代码及上市时间

    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-26
    000578         盐湖集团 1995-03-03 2011-03-22
    000594          国恒退 1996-03-20 2015-07-13
    000602         金马集团 1996-08-19 2013-08-14
    000787        *ST创智 1997-06-26 2013-02-08
    000805        *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]
    复制代码

      还不错。

  • 相关阅读:
    OC UITextField只允许输入两位小数
    UIBezierPath使用
    2020-11-25:go中,map的底层数据结构是什么?
    2020-11-24:n个物品每个物品都有一定价值,分给2个人,怎么分两个人的价值差最小?
    2020-11-23:go中,s是一个字符串,s[0]代表什么?是否等于固定字节数?
    2020-11-22:mysql中,什么是filesort?
    2020-11-21:java中,什么是跨代引用?
    2020-11-20:java中,听说过CMS的并发预处理和并发可中断预处理吗?
    2020-11-19:go中,defer原理是什么?
    2020-11-18:java中,到底多大的对象会被直接扔到老年代?
  • 原文地址:https://www.cnblogs.com/medik/p/10989794.html
Copyright © 2011-2022 走看看