python抓取A股市场历史数据(个股、指数)

@抓取金融市场数据

A股市场的关键数据

如果不是做短线,在一天内拼瞬时交易锁定投机收益。那每天只取一份数据就可以,用长时间的历史数据做决策分析(机会选择、持有收益计算,及交易策略的评估)。

个股数据与数据源

对于个股数据,可以拆分为个股基本属性信息和历史交易信息。
个股基本信息:可以包括行业、市值、利润、市盈率等中长期属性,这一部分季度/半年一看即可,不用抓取最新。
(从天天基金网抓取)

历史交易数据:每天要抓取最新的数据,累积至少5年的数据(我从2015.01.01开始,抓取5年的数据,网易提供了方便的数据获取接口,从网易可以获得任意长的历史数据,经过比较各家,个股历史数据的抓取还是163最好用)

python准备

工欲善其事必先利其器,数据抓取主要是从各种第三方抓,由于还是非付费用户,所以便捷高效的API是没有,各种网页解析而已。
这部分主要用了requests库和beautifulsoup页面解析库,拿来pip安装一下,然后import即可。
由于有些网页必须渲染后才能抓取,所以也引入了requests-html库,第一次使用的时候会下载一个浏览器内核。

抓取功能封成了function,后续可重用,高级的工具出来也方便替换。
有的网页涉及到动态技术需要渲染后才能抓到我们想要的信息,这部分抓取也要慢一些,单独做了封装。

#外部数据抓取引用库
import requests
from bs4 import BeautifulSoup
from requests_html import HTMLSession

#渲染抓取页面
def get_html_page_render(url):
    try:
        session=HTMLSession()
        r = session.get(url)
        r.html.render()
        session.close()
        return r.html.html
    except:
        return ""

#直接抓取页面
def get_html_page(url):
    try:
        rtime=0
        res=""
        #重试次数最大为8
        while len(res)==0 and rtime<8:
            #print("get url",url,rtime)
            r=requests.get(url,timeout=30)
            r.raise_for_status()
            r.encoding=r.apparent_encoding
            res=r.text
            rtime=rtime+1
            r.close()
        return res
    except:
        print("err",url)
        return ""

获取所有股票列表

A股全集的获取,经过各家评估,选择用天天基金网。
http://quote.eastmoney.com/stock_list.html
用requests直接做页面解析即可。

#抓取A股票列表,写入文件
def get_stock_list_in_file(filename):
    stock_list_url='http://quote.eastmoney.com/stock_list.html'
    #抓取网页获得HTML code
    htm=get_html_page(stock_list_url)
    fout = open(filename,"w")
    #istock=stock()
    soup=BeautifulSoup(htm, "html.parser")
    tags=soup.find_all('a',target="_blank")
    iget=0
    for tag in tags:
        str=tag.attrs['href']
        #通过正则从STRING中抽取CODE股票代码
        match=re.search(r's[hz]\d{6}', str)
        if not match:
            continue
        code=match.group(0)
        iget=iget+1
        fout.write(code+"\n")
    fout.close
    return iget

得到一个A股的全集列表,其中其实有不少已经退市的,还有各种指数,杂质比较多,不见得都能取得历史数据,可以算做一个大BASE吧。
一行一个CODE,大约5K条。
这里抓取的股票代码上海的带"sh"前缀,深圳的带"sz"前缀,在163获取个股历史数据的时候需要做些处理。

抓取个股历史交易信息

网易163的数据接口免费而且可以获取任意长的历史数据,堪称免费版本最良心。
不够个股编码有些不同,根据上面抓取的sh/sz标,在163抓取的时候需要做一些代码变换。具体规则大概是上海前面加“0”,深圳前面加“1”。

url举例:
http://quotes.money.163.com/service/chddata.html?code=0000300&start=20151219&end=20201108&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;VOTURNOVER
换掉code为股票代码,换掉start/end为起止日期,字段按需可选。

TAG 意义
TCLOSE 收盘价
HIGH 最高价
LOW 最低价
CHG 涨跌额
PCHG 涨跌幅
TURNOVER 换手率
VOTURNOVER 成交量
VATURNOVER 成交金额
TCAP 总市值
MCAP 流通市值
#获取a股个股最新历史数据,最新在最前,每行为一天的数据
#format:DATE,收盘价,最高价,最低价,涨跌额,涨跌幅,换手率,成交量,成交金额,总市值,流通市值
#return:iget抓取到的行数
def get_stock_163_history(code):
    #编码转换
    org_code=code
    ncode=code.replace("sh","0")
    nncode=ncode.replace("sz","1")
    
    #抓取到当前日期
    latest_date = datetime.date.today()
    time_str=latest_date.strftime("%Y%m%d")
    url='http://quotes.money.163.com/service/chddata.html?code='+nncode+'&start=20150101&end='+time_str+'&fields=TCLOSE;HIGH;LOW;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP'
    iget=0
    r=requests.get(url)
    line=str(r.content)
    
    #指定抓取到存储的文件名,每个个股一个文件 
    filename='../data/'+org_code+'.his'
    fout=open(filename,"w")

    # 解析抓取回来的数据,格式化存储
    lines = line.split("\\n")
    for i in range(1,len(lines)):
        lines[i]=lines[i].replace("\\r","")
        res=lines[i].split(",")
        #如果列数不足,则此行格式有误,丢弃
        if len(res)>11:
            fout.write(res[0])
            for j in range(3,len(res)):
                fout.write("\t"+res[j])
            fout.write("\n")
            fout.flush()
            iget=iget+1
    fout.close
    return iget

抓取的每一个CODE,一个独立存储的文件,每行是一天的数据,第一列是日期。

大盘指数

a股的主要指数也都可以通过163的接口获得,指数的列表信息可以从天天基金网获取:
http://quote.eastmoney.com/center/hszs.html
指数很多,其实关键就看几个就行,比如沪深300,相当于把握大盘。

000001  上证指数,上证综合       sh000001
399001  深证成指        sz399001
000300  沪深300 sh000300
399005  中小板指        sz399005
399006  创业板指        sz399006
000010  上证180 sh000010
000016  上证50  sh000016
000009  上证380 sh000009
000132  上证100 sh000132
000133  上证150 sh000133
000003  B股指数        sh000003
000012  国债指数        sh000012
000905  中证500 sh000905

以上是我抓的几个常用指数,用来看看大盘、决策指数基金应该差不多啦。

待续,
后面还有抓基金的。
在动荡和不可解释的A股市场,没有内幕消息的小玩家先从货币基金和指数基金入手,再成熟点可以选些优质基金,让优秀的基金经理帮咱赚钱呀。

你可能感兴趣的:(个体投资策略)