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

# -*- coding: utf-8 -*-

"""

* DataSource : 天天基金网 (http://fund.eastmoney.com/161005.html?spm=search),利用网站提供的数据接口,实现基金净值查询,并做一些简单的分析。数据是否准确,分析是否到位

* @Date : 2020-09-29 10:19

* @Auth : xiaoshuai.zhu

* @File :Python 爬取基金历史净值数据.py

* @IDE :PyCharm

* @Version 1.0

"""

# ## 基金单位净值、累计净值

# 一般在每个工作日公布上一个工作日的净值,单位净值=总净资产/基金份额,可以简单理解为基金的价格。

# 因此,净值越高,一定程度上表示基金越“贵”,也有可能是基金经理人管理的好,在交易日买入基金的时候,如果是当天15点之前购入,那么按照当天的基金净值确认份额,购入份额=购买金额/当日基金净值;

# 如果是在当天15点之后购入,则按照下一工作日的基金净值确认份额。因为基金净值一般在第二个工作日(或者当天晚上)才公布,所以在买入基金的时候,是不知道买入确认的基金净值是多少,也就不知道买入的份额是多少,

# 累计净值就是基金净值加上过往分红,反映基金过往整体的收益情况。单位净值提供基金即时交易价格的参考,从基金业绩的角度看,累计净值是一个更重要的指标。

#

# ## 近期入手的基金

#

# 富国天惠成长混合A(前端:161005 后端:161006)

# 导入需要的模块

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} # code:指明基金代码;sdate:数据开始日期;edate:数据结束日期;per:指定每页显示的条数,如果不指定该参数,则默认值为10,如果指定该参数值在1-49之间,则每页条数按照指定参数值显示,如果指定该值大于等于50,则每页显示20条;page:per指定了每页的显示条数,存在一页显示不完整的情况,该参数直接指定显示第几页

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('161005',per=49,sdate='2020-09-24',edate='2020-09-30')

# 修改数据类型

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))

运行预览

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值