• 即将脱下军装:32年,军装已经成为我的皮肤 2020-01-21
  • 端午临近,苏州河上53支龙舟竞渡 2019-12-28
  • 事件 —频道 春城壹网 七彩云南 一网天下 2019-12-14
  • CEC2018苏州开幕 打造全新电竞泛娱乐 2019-12-14
  • 国酒茅台·国之栋梁 希望工程圆梦行动获第十二届人民企业社会责任奖年度案例奖 2019-12-06
  • 湖州日报社党委书记、社长沈振建祝贺人民日报创刊70周年 2019-12-06
  • 是什么时候颠覆了“文艺应当为千千万万劳动人民服务”这一社会主义文艺路线的?!那一股“伤痕潮”功不可灭,可惜的是“旧伤痕”已经烟灭,取代其的是“挖根潮”。留给工农 2019-11-24
  • 我国居民人均预期寿命又提高了 2017年提高至76.7岁 2019-11-24
  • 《格萨尔》史诗藏译汉16册完成终审 2019-11-10
  • 干惊天动地事  做崇德守廉人 2019-10-20
  • 新一代宝马8系首发亮相 运动旗舰正式回归 2019-10-20
  • 全纪录600名工人为“重庆铁路咽喉”动手术  奋战7个通宵为旅客节约1小时 2019-10-19
  • 共享单车押金安全受关注 部分平台已引入银行存管 2019-10-16
  • 视频--江苏频道--人民网 2019-10-16
  • 回复@看着就想笑:历史至今的客观事实是奴隶主剥削奴隶、封建地主剥削农奴、资本家剥削雇佣劳动者、师傅剥削徒弟都是建立在私有制基础上的,而且小私有和他人联合顾工生 2019-10-14
  • 青海麻将258 www.jncff.tw 青海麻将258 > QQ空间 > QQ空间日志 > 用Python抓取天天基金网基金历史净值数据

    用Python抓取天天基金网基金历史净值数据

    时间:2019-11-27 09:27 作者:QQ地带 我要评论

    玩基金的朋友应该都深有体会,2018是相当惨淡的一年,尤其下半年,能够保本就不错了。2019迎来了开门红,从2月11日到14日,连续四个交易日整体翻红,“逢九必涨”,2019是不是可以有些期待呢?
    “天天基金”网站可以查询基金历史净值信息,这里利用网站提供的数据接口,实现基金净值查询,并做一些简单的分析。数据是否准确,分析是否到位,不care,就是做一个简单的Python实现。
    Python获取基金数据
    以下链接可以获取基金数据:http://fund.eastmoney.com/f10/F10DataApi.aspx
    提供适当参数,即可获取指定基金在指定日期段内的净值数据,例如:
    http://fund.eastmoney.com/f10/F10DataApi.aspx?type=lsjz&code=110022&page=1&sdate=2019-01-01&edate=2019-02-13&per=20
    以上提供了代码为110022的基金(易方达消费行业)在2019年1月1日到2月13日之间的基金净值数据。如下图:
     
     
     
     
     
     
    链接中的各参数含义简单说明:
     
    code:指明基金代码;
    sdate:数据开始日期;
    edate:数据结束日期;
    per:指定每页显示的条数,如果不指定该参数,则默认值为10,如果指定该参数值在1-49之间,则每页条数按照指定参数值显示,如果指定该值大于等于50,则每页显示20条(很神奇的设定);
    page:per指定了每页的显示条数,存在一页显示不完整的情况,该参数直接指定显示第几页。
    如上图,底部有pages、curpage参数,分别指明总页数和当前页数,在抓取数据时,需要特别处理,否则只能获取当页数据。代码非常的简单,过程也很容易理解,不多介绍,后附完整代码。
     
    基金单位净值、累计净值
    基金一般在每个工作日公布上一个工作日的净值,单位净值=总净资产/基金份额,可以简单理解为基金的价格。因此,净值越高,一定程度上表示基金越“贵”,但也可能代表基金经理管理好。在交易日买入基金的时候,如果是当天15点之前购入,那么按照当天的基金净值确认份额,购入份额=购买金额/当日基金净值。如果是在当天15点之后购入,则按照下一工作日的基金净值确认份额。因为基金净值一般在第二个工作日(或者当天晚上)才公布,所以在买入基金的时候,是不知道买入确认的基金净值是多少,也就不知道买入的份额是多少。
     
    累计净值就是基金净值加上过往分红,反映基金过往整体的收益情况。单位净值提供基金即时交易价格的参考,但从基金业绩的角度看,累计净值是一个更重要的指标。
     
    实例
    抓取招商中证白酒指数分级(161725)2018年的基金数据进行分析。将基金单位净值、累计净值、日增长率数据作图,如下:
     
     
     
     
     
     
    可以看到,去年是比较惨淡的一年,尤其是下半年,整体是向下的走势。这段时间关注过基金的应该都深有体会,“绿化”非常好的半年。日增长整理整体波动分布,下半年波动幅度比较大,尤其是11月份前后的几个交易日,经历过大幅的涨跌。全年245个交易日中,除两个缺失值外,有106天日增长率为正,137天为负或者零。整体上跌的天数多于涨的天数。
     
    我们再来看下“累计净值-单位净值”的变化。一般在发生分红的时候,该差额会发生变动。作图如下:
     
     
     
     
     
     
    可以看到,2018年该差额发生过两次变动,一次是发生在7月初,另一次发生在12月中旬。进一步确认,两个试点分别是2018/07/05和2018/12/17.查询天天基金网站,该基金在2018年并没有具体的分红信息,但是在2018/12/17这天发生过基金份额折算,在2018/07/05这天并没有查询到具体事项。作为一个只会基金定投的小白瓜,就理解到这里了。
     
    代码:
     
    # 导入需要的???/div>
    import requests
    from bs4 import BeautifulSoup
    import re
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import matplotlib
     
    #指定默认字体
    matplotlib.rcParams['font.sans-serif'] = ['SimHei']
    matplotlib.rcParams['font.family']='sans-serif'
    #解决负号'-'显示为方块的问题
    matplotlib.rcParams['axes.unicode_minus'] = False
     
    # 抓取网页
    def get_url(url, params=None, proxies=None):
        rsp = requests.get(url, params=params, proxies=proxies)
        rsp.raise_for_status()
        return rsp.text
     
    # 从网页抓取数据
    def get_fund_data(code,per=10,sdate='',edate='',proxies=None):
        url = 'http://fund.eastmoney.com/f10/F10DataApi.aspx'
        params = {'type': 'lsjz', 'code': code, 'page':1,'per': per, 'sdate': sdate, 'edate': edate}
        html = get_url(url, params, proxies)
        soup = BeautifulSoup(html, 'html.parser')
     
        # 获取总页数
        pattern=re.compile(r'pages:(.*),')
        result=re.search(pattern,html).group(1)
        pages=int(result)
     
        # 获取表头
        heads = []
        for head in soup.findAll("th"):
            heads.append(head.contents[0])
     
        # 数据存取列表
        records = []
     
        # 从第1页开始抓取所有页面数据
        page=1
        while page<=pages:
            params = {'type': 'lsjz', 'code': code, 'page':page,'per': per, 'sdate': sdate, 'edate': edate}
            html = get_url(url, params, proxies)
            soup = BeautifulSoup(html, 'html.parser')
     
            # 获取数据
            for row in soup.findAll("tbody")[0].findAll("tr"):
                row_records = []
                for record in row.findAll('td'):
                    val = record.contents
     
                    # 处理空值
                    if val == []:
                        row_records.append(np.nan)
                    else:
                        row_records.append(val[0])
     
                # 记录数据
                records.append(row_records)
     
            # 下一页
            page=page+1
     
        # 数据整理到dataframe
        np_records = np.array(records)
        data= pd.DataFrame()
        for col,col_name in enumerate(heads):
            data[col_name] = np_records[:,col]
     
        return data
     
     
    # 主程序
    if __name__ == "__main__":
        data=get_fund_data('161725',per=49,sdate='2018-01-01',edate='2018-12-31')
        # 修改数据类型
        data['净值日期']=pd.to_datetime(data['净值日期'],format='%Y/%m/%d')
        data['单位净值']= data['单位净值'].astype(float)
        data['累计净值']=data['累计净值'].astype(float)
        data['日增长率']=data['日增长率'].str.strip('%').astype(float)
        # 按照日期升序排序并重建索引
        data=data.sort_values(by='净值日期',axis=0,ascending=True).reset_index(drop=True)
        print(data)
     
        # 获取净值日期、单位净值、累计净值、日增长率等数据并
        net_value_date = data['净值日期']
        net_asset_value = data['单位净值']
        accumulative_net_value=data['累计净值']
        daily_growth_rate = data['日增长率']
     
        # 作基金净值图
        fig = plt.figure()
        #坐标轴1
        ax1 = fig.add_subplot(111)
        ax1.plot(net_value_date,net_asset_value)
        ax1.plot(net_value_date,accumulative_net_value)
        ax1.set_ylabel('净值数据')
        ax1.set_xlabel('日期')
        plt.legend(loc='upper left')
        #坐标轴2
        ax2 = ax1.twinx()
        ax2.plot(net_value_date,daily_growth_rate,'r')
        ax2.set_ylabel('日增长率(%)')
        plt.legend(loc='upper right')
        plt.title('基金净值数据')
        plt.show()
     
        # 绘制分红配送信息图
        bonus = accumulative_net_value-net_asset_value
        plt.figure()
        plt.plot(net_value_date,bonus)
        plt.xlabel('日期')
        plt.ylabel('累计净值-单位净值')
        plt.title('基金“分红”信息')
        plt.show()
     
        # 日增长率分析
        print('日增长率缺失:',sum(np.isnan(daily_growth_rate)))
        print('日增长率为正的天数:',sum(daily_growth_rate>0))
        print('日增长率为负(包含0)的天数:',sum(daily_growth_rate<=0))

    标签: Python 基金
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%

    Google提供的广告

  • 即将脱下军装:32年,军装已经成为我的皮肤 2020-01-21
  • 端午临近,苏州河上53支龙舟竞渡 2019-12-28
  • 事件 —频道 春城壹网 七彩云南 一网天下 2019-12-14
  • CEC2018苏州开幕 打造全新电竞泛娱乐 2019-12-14
  • 国酒茅台·国之栋梁 希望工程圆梦行动获第十二届人民企业社会责任奖年度案例奖 2019-12-06
  • 湖州日报社党委书记、社长沈振建祝贺人民日报创刊70周年 2019-12-06
  • 是什么时候颠覆了“文艺应当为千千万万劳动人民服务”这一社会主义文艺路线的?!那一股“伤痕潮”功不可灭,可惜的是“旧伤痕”已经烟灭,取代其的是“挖根潮”。留给工农 2019-11-24
  • 我国居民人均预期寿命又提高了 2017年提高至76.7岁 2019-11-24
  • 《格萨尔》史诗藏译汉16册完成终审 2019-11-10
  • 干惊天动地事  做崇德守廉人 2019-10-20
  • 新一代宝马8系首发亮相 运动旗舰正式回归 2019-10-20
  • 全纪录600名工人为“重庆铁路咽喉”动手术  奋战7个通宵为旅客节约1小时 2019-10-19
  • 共享单车押金安全受关注 部分平台已引入银行存管 2019-10-16
  • 视频--江苏频道--人民网 2019-10-16
  • 回复@看着就想笑:历史至今的客观事实是奴隶主剥削奴隶、封建地主剥削农奴、资本家剥削雇佣劳动者、师傅剥削徒弟都是建立在私有制基础上的,而且小私有和他人联合顾工生 2019-10-14