买股不如买基?Python实现快速追踪基金的收益情况!谁还不是个买基高手?

tushare概览

全部内容很丰富,为了有助于大家有个整体的了解,阳哥绘制了一张完整的思维导图,截图如下:

使用 Tushare

Tushare 平台的数据,已全面升级到 tushare pro 了,通常情况下,还是称之为 tushare。

想使用 tushare 中的数据和功能,首先需要进行注册,获得一份 token (一串字母和数字组成的文本),然后才可以获取到数据,大家可以通过以下链接来注册(也可以点击文末的“阅读原文”):

https://tushare.pro/register?reg=129033

在 tushare 中注册后,通过 “个人主页”——“接口TOKEN” 可以找到自己的 token 值,界面如下:

图片

tushare接口TOKEN

复制 token 值,然后在代码中进行如下设置:

# 设置 token

tushare 注册地址:https://tushare.pro/register?reg=129033

以上方法只需要在第一次或者token失效后调用,完成调取tushare数据凭证的设置,正常情况下不需要重复设置。

ts.set_token(‘你的token值’)

pro = ts.pro_api()

在设置好 token 值后,我们就可以开始获取数据。

关于 tushare 的详细介绍,请点击下面的链接前往:

02 基金信息获取


首先,导入本次需要用到的python库,并设置好tushare,如下:

import pandas as pd

import datetime

import numpy as np

import tushare as ts

token=‘XXXXXXX’

ts.set_token(token)

pro = ts.pro_api()

需要说明的是,tushare 中不同的数据获取需要的权限是不一样的,如果权限不够,可能获取不到数据哦。

获取基金基础信息

首先,咱们来获取基金基础信息,包括基金名称、基金费率、基金公司、基金成立时间等。在 tushare 中,提供了 fund_basic() 接口来获取这些信息。

图片

该接口有两个参数,咱们主要关注的是第一个参数 market,由于基金有场内基金(ETF和LOF)和场外基金,因此,全部的基金是这两者之和。

所有基金的基础信息获取代码如下:

# 获取基金中文名称信息

df_e = pro.fund_basic(market=‘E’)

df_o = pro.fund_basic(market=‘O’)

df_fund_info = df_e.append(df_o)

df_fund_info = df_fund_info[[‘ts_code’,‘name’, ‘management’,‘m_fee’, ‘c_fee’,‘found_date’]]

df_fund_info.columns = [‘fund_code’,‘fund_name’, ‘management’,‘m_fee’, ‘c_fee’,‘found_date’]

df_fund_info = df_fund_info.reset_index(drop=True)

df_fund_info

结果如下:

图片

目前整个市场上有 1.5万多支基金,是不是超出你的想象了啊~~~

当然了,这是包括了混合型、股票型、债券型、货币基金类等全部的基金。

获取基金经理信息

对于主动型基金而言,挑选基金时,选择一个好的基金经理是很重要的因素,因此,在追踪基金的收益情况时,是有必要将基金经理的信息一并获取的。

在tushare 中,可通过接口 fund_manager 来获取某只基金过往基金经理的信息。

在获取基金经理信息后,可以跟之前获取基金基础信息进行合并。

这个过程,阳哥写了一个自定义函数,如下:

# 获取单个基金的信息

def get_fund(fund_code,df_fund_info):

获取基金经理信息,以及开始管理该基金的日期

df_manager = pro.fund_manager(ts_code=fund_code)

df_manager = df_manager[df_manager[‘end_date’].isna()]

df_manager = df_manager.sort_values(‘begin_date’,ascending=True).head(1)

begin_date = df_manager[‘begin_date’].values[0] # 开始管理该基金的日期

df_manager = df_manager[[‘ts_code’, ‘name’, ‘gender’,‘begin_date’]]

df_manager.columns = [‘fund_code’, ‘manager_name’, ‘gender’,‘begin_date’]

合并

df_fund = pd.merge(df_manager,df_fund_info,how=‘left’,on=‘fund_code’)

return df_fund

假如你想获取易方达中小盘基金的信息,可以基于上面的自定义函数 get_fund ,使用如下的代码:

# 110011.OF,易方达中小盘

df_fund = get_fund(‘110011.OF’,df_fund_info)

df_fund

获取的信息如下:

图片

计算基金规模和收益情况

接下来,咱们还需要获取两个信息,基金规模和基金近几年的收益情况。

基金规模,可以从一个角度来观察该基金在市场上的受欢迎度,一般来说,规模较大的基金,说明该基金过往的表现应该还是可以的。不过这里也有两点需要注意:

  1. 基金过往业绩并不代表未来依然会如此;

  2. 基金规模小,并不一定说明该基金未来表现会不好。

除了基金规模,另一个咱们经常关注的,也是基金营销机构经常拿出来宣传的,就是基金的过往收益情况。

基金规模的计算公式如下:

基金规模亿元基金份额数量基金单位净值

在 tushare 中 基金份额数量由函数 fund_share 来获取,基金单位净值(unit_nav)数据由函数 fund_nav 来获取。

此外,在计算基金的过往年度收益时,也是基于其累计净值(accum_nav)来实现的。

因此,阳哥将基金规模获取过程和基金近几年收益情况计算合并在一个自定义函数里,代码如下:

# 获取单支基金的年度收益,基金规模等信息

def get_returns(fund_code,start_year):

df_fund_nav = pro.fund_nav(ts_code=fund_code)

df_fund_nav[‘date’] = pd.to_datetime(df_fund_nav[‘end_date’])

df_fund_nav = df_fund_nav.set_index(‘date’).sort_index()

years = df_fund_nav[‘accum_nav’].resample(‘AS’).sum().to_period(‘A’)

获取年度数据,类型为 pandas 的 period

years = years.index.tolist()

有些基金的开始日期晚于2018年,需要对齐列,补空白

year_list = [yr.year for yr in years if yr.year>=start_year]

将 period 时间数据转为 string 的年度数据

years = [str(yr.year) for yr in years]

df_yrs_index = pd.DataFrame()

for yr in years:

df_yr_index = df_fund_nav.loc[yr].tail(1)

df_yrs_index = df_yrs_index.append(df_yr_index)

df_yrs = df_fund_nav.head(1).append(df_yrs_index)

计算每年的收益率,即涨跌幅度

df_yrs[‘returns’] = df_yrs[‘accum_nav’].pct_change()

删除收益率为 NA 的行 (第1天有数据记录的日期)

df_yrs = df_yrs.dropna(subset=[‘returns’])

筛选自开始年份以来的数据

df_yrs = df_yrs.loc[str(start_year):]

df_yrs = df_yrs.reset_index()

df_yrs[‘year’] = df_yrs[‘date’].dt.year

透视表

df_yr_returns = pd.pivot_table(

df_yrs, index=[‘ts_code’],

values=[‘returns’], columns=[‘year’], fill_value=“”

)

将多层索引转变为单层索引

df_yr_returns = df_yr_returns[‘returns’]

df_yr_returns = df_yr_returns.reset_index()

df_yr_returns.columns.name = None

df_yr_returns = df_yr_returns.rename(columns={‘ts_code’:‘fund_code’})

基金份额

df_fund_share = pro.fund_share(ts_code=fund_code).head(1)

df_fund_share.columns = [‘fund_code’, ‘fd_share_date’, ‘fd_share’, ‘fund_type’, ‘market’]

fd_share,单位是 万份

fd_share_date = df_fund_share[‘fd_share_date’].values[0] # 份额对应的日期

份额日期的净值数据

df_ann_nav = df_fund_nav.loc[fd_share_date:fd_share_date].sort_values(‘update_flag’,ascending=False).head(1)

df_ann_nav = df_ann_nav[[‘ts_code’, ‘accum_nav’,‘unit_nav’]]

df_ann_nav.columns = [‘fund_code’, ‘accum_nav’,‘unit_nav’]

计算基金规模,amount,单位:亿元

df_fund_amount = pd.merge(df_fund_share,df_ann_nav,how=‘left’,on=‘fund_code’)

df_fund_amount[‘amount’] = df_fund_amount[‘fd_share’] * df_fund_amount[‘unit_nav’]/10000

df_fund_amount = df_fund_amount[[‘fund_code’,‘amount’,‘fd_share_date’]]

合并数据

df_yr_returns = pd.merge(df_fund_amount,df_yr_returns,how=‘left’,on=‘fund_code’)

for yr in year_list:

if yr not in df_yr_returns.columns.tolist():

df_yr_returns[yr]=np.nan

return df_yr_returns

假如你想获取易方达中小盘基金的2018年以来的收益情况信息,可以基于上面的自定义函数 get_returns ,使用如下的代码:

df_return = get_returns(‘110011.OF’,2018)

df_return

获取的信息如下:

图片

同时获取多只基金的信息

上面已经实现了获取单只基金所需要的信息,接下来,咱们需要拼接之前获取的信息。

同时,我们一般会同时关注多只基金,因此同时获取多只基金的信息,也是基本必备的需求。

实现的代码如下:

# 获取多只基金的信息

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值