请关注微信公众号:金融数学 FinancialMathematics玩基金的朋友应该都深有体会,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这天并没有查询到具体事项。作为一个只会基金定投的小白瓜,就理解到这里了。

代码:

# 导入需要的模块

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 基金净值_用Python抓取天天基金网基金历史净值数据相关推荐

  1. python爬取天天基金_用Python抓取天天基金网基金历史净值数据

    请关注微信公众号:金融数学 FinancialMathematics玩基金的朋友应该都深有体会,2018是相当惨淡的一年,尤其下半年,能够保本就不错了.2019迎来了开门红,从2月11日到14日,连续 ...

  2. python爬取天天基金历史净值_用Python抓取天天基金网基金历史净值数据

    请关注微信公众号:金融数学 FinancialMathematics 玩基金的朋友应该都深有体会,2018是相当惨淡的一年,尤其下半年,能够保本就不错了.2019迎来了开门红,从2月11日到14日,连 ...

  3. python爬取基金历史净值_Python学习笔记之抓取某只基金历史净值数据实战案例

    摘要:这篇Python开发技术栏目下的"Python学习笔记之抓取某只基金历史净值数据实战案例",介绍的技术点是"Python学习笔记.Python.历史净值数据.学习笔 ...

  4. python历史净值分析_Python 爬取基金历史净值数据

    # -*- coding: utf-8 -*- """ * DataSource : 天天基金网 (http://fund.eastmoney.com/161005.ht ...

  5. 基金净值查询/下载的方法 —— 查询所有基金今日净值数据

    基金净值查询 一个非常简单能查所有基金净值查询的方法,可以随时查看和下载基金净值数据,手机上就能查询和下载基金净值数据,不用下载APP.软件啥的,在线就能基金净值查询. 先演示一下代码,如果你懂代码, ...

  6. EXCEL(Power BI)获取天天基金网每日历史净值数据,我去,这也太简单了吧!

    EXCEL(Power BI)获取天天基金网每日历史净值数据,我去,这也太简单了吧! 第一次在帮助别人的过程中学习了爬虫. 一万个开心~~~~~~~~~ 废话不多说,上干货. 找到天天基金显示数据的那 ...

  7. python抓取数据包_利用python-pypcap抓取带VLAN标签的数据包方法

    1.背景介绍 在采用通常的socket抓包方式下,操作系统会自动将收到包的VLAN信息剥离,导致上层应用收到的包不会含有VLAN标签信息.而libpcap虽然是基于socket实现抓包,但在收到数据包 ...

  8. 【python量化】用Python获取基金历史净值数据

    写在前面 股票期货等历史数据可以通过很多接口以及库来获取,而针对基金数据获取的方式则比较少.下面这篇文章的主要内容是介绍如何通过Python爬取天天基金网的基金历史数据,以便于我们对基金进行数据分析以 ...

  9. python爬取股票大单历史记录_利用bs4爬取股票的历史交易数据

    听起来,爬取股票的所有历史交易数据跟高大上,有木有? 不过写这个爬虫的时候,发现基于网易财经的股票历史数据的爬取其实挺简单,最后再写到txt文档里(暂时写txt,以后会写csv的.可以在用机器学习干一 ...

最新文章

  1. [转]Oracle 执行计划(Explain Plan) 说明
  2. 【阿里云课程】如何基于GAN完成人脸图像超分辨任务
  3. 面试了100个运营,发现具备这些思维的人才能走的更远
  4. 得到选择框句柄 怎么操作_电脑版微信怎么多开?最简单的三种电脑版微信多开教程...
  5. mysql新增字段位置_图解MySQL | [原理解析] MySQL 为表添加列 是怎么quot;立刻quot;完成的...
  6. request之额外路径
  7. Windows10下VB6.0开发——利用PictureBox控件实现数据点实时绘图
  8. matlab程序 直线插补,用Matlab实现直线插补计算程序.doc
  9. 台湾地区HITCON队长发威夺冠,XCTF联赛西安站国际赛顺利落幕
  10. 2020 年,从架构谈起,到 Mesh 结束
  11. 选自《致加西亚的信》
  12. 盘点好用的 Markdown 编辑器
  13. 在哪里写博客比较好?不同写作平台的横向对比
  14. 年薪五万程序员的生活及他的理财梦
  15. Blender摄像机环绕运动、动画渲染、视频合成
  16. 基于SpringBoot HII健身房app
  17. 致爱丽丝 之MY收藏
  18. 【Scratch二次开发】04-构建离线版本
  19. 对网页 ‘’为所欲为‘’ 之手动实现深色模式?
  20. Apple MacPad Pro会是什么样?

热门文章

  1. apt apt-get_Windows用户准备好进行apt-get吗?
  2. Android 2⃣️day
  3. 【TypeScript】带类型语法的JavaScript
  4. 初中数学老师计算机培训反思,初中数学老师考试反思
  5. 【qq机器人】Nonebot2搭建详细教程
  6. 简账(开源记账软件)-前端环境简介及部署
  7. python怎么隐藏输入法_如何创建隐藏的文本输入框?
  8. 图片或者其他文件在数据库的存储方式详解
  9. 老曹眼中的“团队管理”
  10. SpringMVC小白问题一之启动时配置应用程序监听器错误