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

大家知道,近几年,不少同学都是经由基金进入到股市中的。去年就很流行“买股不如买基”的说话,至于股票和基金到底谁更好,这个仁者见仁智者见智,恐怕一时半会儿也说不清楚。

今天,阳哥给大家分享的主题是 用 Python 来追踪和更新基金的收益情况,涉及到的Python库主要是 pandas 和 tushare 。

最终实现的效果如下:

图片

上面表格中的信息,主要涉及四个方面:

  1. 基金基础信息,包括基金名称、基金费率、基金公司、基金成立时间等;

  2. 基金经理的信息,包括姓名、性别、任职时间等;

  3. 基金规模,体现出来的是基金金额的规模,是通过基金份额以及基金净值计算出来的;

  4. 基金年度收益情况,一般是计算基金近几年的收益情况。

上面的这些信息,在财经工具 tushare 中,目前是都已经提供了的。因此,咱们有必要稍微介绍下 tushare 。

01 tushare 介绍

关于财经数据,有多个Python库可以供咱们选择,其中 tushare 是国内较早开始发布财经数据的社区,其内容比较完善,今天我们使用的就是 tushare 。

Tushare 是一个金融大数据平台,数据内容包含股票、指数、基金、期货、债券、外汇、行业大数据等,同时包括了数字货币行情等区块链数据,为各类金融投资和研究人员提供适用的数据和工具,概览如下:

图片

​​

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 的详细介绍,请点击下面的链接前往:

  • 神器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 的 periodyears = 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 = Nonedf_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']/10000df_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.nanreturn df_yr_returns

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

df_return = get_returns('110011.OF',2018)
df_return

获取的信息如下:

图片

同时获取多只基金的信息

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

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

实现的代码如下:

# 获取多只基金的信息def get_data_fund(df_fund_info,fund_code_short,code_exception,start_year):df_filter_info = pd.DataFrame()for code in fund_code_short:df_tmp = df_fund_info[df_fund_info['fund_code'].str.contains(code)].head(1)df_filter_info = df_filter_info.append(df_tmp)df_filter_info = df_filter_info.reset_index(drop=True)   fund_codes = df_filter_info['fund_code'].tolist()# fund_codesdf = pd.DataFrame()for code in fund_codes:if code in code_exception:code_update = code[:-2]+'OF'code_short = code[:-3]df_fund = get_fund(code_update,df_fund_info)df_fund['fund_code'] = codedf_fund = df_fund[['fund_code','manager_name','gender','begin_date']]df_fund = df_fund.dropna(axis=1) # 删除含 NaN 的列test_m = df_fund_info[df_fund_info['fund_code'].str.contains(code_short)]df_fund = pd.merge(df_fund,test_m,how='left',on='fund_code')else:df_fund = get_fund(code,df_fund_info) df_return = get_returns(code,start_year)df_fund_merge = pd.merge(df_fund,df_return,how='left',on='fund_code')df = df.append(df_fund_merge)df = df.reset_index(drop=True)df = df.rename(columns={'fund_code':'基金代码','manager_name':'基金经理','gender':'性别','begin_date':'上任日期','fund_name':'基金名称','management':'基金公司','m_fee':'管理费','c_fee':'托管费','found_date':'成立时间','amount':'基金规模(亿元)','fd_share_date':'规模对应日期'})# 调整列的排序cols = df.columns.tolist()col_1 = cols[:4]col_2 = cols[4:5]col_3 = cols[5:]cols = col_2 + col_1 + col_3df = df[cols]return df

上面的自定义函数 get_data_fund 中,存在一些特列,我也进行了调整。

这个特列,主要是有一类基金,叫做LOF基金,场内和场外的数字代码是一样的,比如谢治宇的兴全合润基金,在tushare中,场内的完整代码是163406.SZ,场外的完整代码是163406.OF,对于LOF基金,我们只需要获取一个的信息即可。

同时,由于LOF基金获取信息是基金基础信息和基金经理信息用的代码有些区别,需要分开应用。因此,需要在上面的函数 get_data_fund 中进行区别,并且引入一个 code_exception 参数。

在上面的函数 get_data_fund 中,还对最后显示的列的顺序也进行了调整,该过程的实现的详细内容,可以在下面的链接中来了解:

  • Pandas实用技能,将列(column)排序的几种方法

基于自定义函数 get_data_fund,设置好函数所需要的参数后,就可以获取多只基金的信息了,具体参数如下:

# 需要获取的基金代码简称列表
fund_code_short = ['000772', '003095','166005','320007','163406','260101','161005','162605','163402','005827','110022','110011','164908','000800','590008','360007','118001','519736','007119','002190','005911','001938','166002','377240']# ['200011','690003','200010',]# 特列:LOF 基金,基金经理和管理费等费用所用的代码两处不一致,需要调整
# 输入的是 LOF 基金在场内的完整代码
code_exception = ['163406.SZ','160632.SZ','160222.SZ','159843.SZ','515920.SH'] # 设置基金收益开始的年份
start_year = 2018
# 设置基金收益截止的年份
end_year = 2021
year_list = list(range(start_year,end_year+1))df_fund_final = get_data_fund(df_fund_info,fund_code_short,code_exception,start_year)
df_fund_final

得到的结果如下:

图片

Pandas 中,可以通过 Style 对表格样式进行设置,对收益情况进行红涨绿跌的设置。

代码如下:

def color_returns(val):if val >=0:color = '#EE7621' # light red elif val <0:color = '#99ff66' # light green else:color = '#FFFAFA' # ligth gray return f'background-color: {color}'format_dict = {'基金规模(亿元)': '¥{0:.1f}', '管理费': '{0:.1f}', '托管费': '{0:.2f}', 2017: '{0:.1%}', 2018: '{0:.1%}', 2019: '{0:.1%}', 2020: '{0:.1%}', 2021: '{0:.1%}', }
df_fund_final = df_fund_final.sort_values('基金经理',ascending=True)df_fund_final.style.hide_index()\.hide_columns(['规模对应日期','成立时间'])\.format(format_dict)\.applymap(color_returns,subset=year_list)\.background_gradient(subset=['基金规模(亿元)'],cmap='Blues')

得到的结果如下:

图片

关于 Pandas 中表格样式设置,阳哥之前分享了一份详细的内容,有兴趣的同学可以前往查看:03 小结

至此,咱们就获取了本次想要得到的信息,这个表格可以定期更新,用于给其他人员分享基金的基本信息以及年度收益情况。

在今天的这个财经案例里,需求其实是很常见的。在这个案例里,主要用到的是 Pandas 和 Tushare 工具。

对于 Pandas 而言,用到的知识点还是挺多的,包括数据筛选、数据合并、数据排序、数据透视表、样式设置等,虽然都是基础知识点,但要做到熟练运用,也是需要一定功底的。

对于 tushare ,主要是关注该工具中财经信息的完整性、准确性以及及时性。

如果其他财经工具有这样的功能,也是可以了。

​​完整源码或安装教程点:这里领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/15799.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

研报精选230505

目录 【行业230505国信证券】风电or电网产业链周评&#xff08;4月第5周&#xff09;&#xff1a;海风开发资源集中释放&#xff0c;黑色类原材料价格持续下行 【行业230505天风证券】通信AI系列之&#xff1a;人工智能之火点燃算力需求&#xff0c;AI服务器迎投资机遇 【行业2…

你最关心的4个零代码问题,ChatGPT 帮你解答了!

作为人工智能&#xff08;AI&#xff09;新型聊天机器人模型 ChatGPT&#xff0c;刚上线5天就突破100万用户&#xff0c;两个多月全球用户量破亿&#xff0c;不愧为业界最炙热的当红炸子鸡。 ChatGPT 是一种语言生成模型&#xff0c;由 OpenAI 开发和训练。它是基于 Transform…

问ChatGPT:零基础如何学好.Net Core?

更多开源项目请查看&#xff1a;一个专注推荐.Net开源项目的榜单 ChatGPT横空出世&#xff0c;一下子让全球互联网企业都慌了&#xff0c;纷纷表示&#xff1a;马上跟进发布ChatGPT&#xff0c;媒体纷纷报道大有改变教培行业。 下面我们问问ChatGPT&#xff1a;零基础如何学好…

GPT-4刚发布就有手机APP接入,上传照片视频一键解读,还当起了美版知乎的问答bot...

萧箫 发自 凹非寺量子位 | 公众号 QbitAI GPT-4刚发布&#xff0c;就已经有手机应用接入了&#xff01; 只需要上传图像&#xff0c;再用语音提出需求&#xff0c;GPT-4就能帮助视障人士“看清”眼前的世界。 随时随地&#xff0c;实时解读&#xff0c;就像聊天对话一样自然。 …

whisper:robust speech recognition via large-sacle weak supervision

OpenAI Whisper 精读【论文精读45】_哔哩哔哩_bilibili更多论文&#xff1a;https://github.com/mli/paper-reading, 视频播放量 68331、弹幕量 327、点赞数 2332、投硬币枚数 1192、收藏人数 983、转发人数 394, 视频作者 跟李沐学AI, 作者简介 &#xff0c;相关视频&#xff…

《通义听悟能这么用?大佬语音面试音频通义AI总结》

此文章更适用与&#xff1a;有会议记录、直播记录、面试记录的朋友和知识内容博主等 1、把录音视频文件上传到电脑 2、上传音视频入口 3、上传音视频 4、选择语言是否翻译 5、选择是否区分发言人 我这里是某大佬的语音面试音频文件&#xff0c;选择了2人对话。 6、效果展示 总…

强到离谱!2023年必备的21款AI工具

2022年是AI技术大发展的一年&#xff0c;特别是ChatGPT的很空出世&#xff0c;让AI工具迎来大爆发&#xff0c;今天就给大家整理出21款免费且实用的AI工具推荐&#xff0c;无论是做设计还是日常学习工作都能用得到。2023年已经开始&#xff0c;让这些AI工具帮你提升生产效率&am…

《AI上字幕》基于openAI研发的whisper模型,语音(视频)一键转文本/字幕/带时间轴/支持多语言/自带翻译《桌面版教程》

简介&#xff1a; OpenAI的chatGPT非常火爆&#xff0c;其实OpenAI旗下的另一个模型实力也十分强大&#xff0c;它就是开源免费的Whisper语音转文本模型&#xff0c;目前为止它是较为顶尖的语音转文本模型 当前github上也有许多出色的开发者根据此模型开发出桌面版语音转文字应…

用GitChat赚钱的6种方法

先说下GitChat这个平台&#xff0c;其主页是&#xff1a;https://gitbook.cn/ 。 GitChat是针对技术人的知识付费平台&#xff0c;创始人是谢工&#xff0c;中途被CSDN收购&#xff0c;现在属于CSDN&#xff0c;不过依然是以独立品牌在运作。目前已完成和CSDN的衔接&#xff0c…

ChatGPT帮你梳理最全Java多线程编程知识

目录 引言 引入多线程编程的重要性和应用场景 介绍多线程的优势和挑战 什么是多线程&#xff1f; 线程与进程的区别 线程的创建与生命周期管理 线程的创建方式 …

ChatGPT、Midjourney不香了吗,New Bing 已向全球个人开放

文章目录 1. 前言2. 教程3. 开始 Bing AI 以上图片均由Bing AI生成。&#xff08;后文给出第一幅图的关键字&#xff09; 本文没有任何广告&#xff0c;放心食用&#xff0c;并且手把手教你怎么配置new bing&#xff0c;有需要的耐心看完哦&#xff0c;不懂的可私信我~ 1. 前…

胎教级培训手册:两步让ChatGPT成为小红书标题大师

文 / 高扬&#xff08;微信公众号&#xff1a;量子论&#xff09; 上篇介绍了如何编写小红书爆款笔记的内容部分&#xff0c;今天重点介绍给小红书内容起标题。 最近做小红书&#xff0c;我发现一个规律&#xff0c;要想做爆款&#xff0c;除了内容优秀&#xff0c;除了首图亮眼…

关于ChatGPT,我们请小红书技术人和NLP专家聊聊原理和潜力

在微软、百度、阿里、腾讯、小米纷纷宣布入局之后&#xff0c;ChatGPT 再次被送上科技头条。 图源&#xff1a;Financial Times 互联网公司们的争相表态&#xff0c;让大家似乎看到了 ChatGPT 落地应用的曙光。相比去年底&#xff0c;关于 ChatGPT 的讨论&#xff0c;也从技术…

打破创作界限,1天创作1000篇精品小红书带货笔记!chatgpt超级写手机器人创作流程介绍。

【Chatgpt超级写手机器人教程】 1天创作1000篇精品小红书带货笔记&#xff01;✨ 难听的真话&#xff1a;做运营不用RPA好比猴子不用工具。RPA就是非技术人最佳自动化利器&#xff0c;学三个月Python不如学一周RPA 我是RPA帮创始人阿愚呱呱&#xff0c;特会玩赚RPA的运营人。[R…

胎教级培训手册:四步让ChatGPT成为小红书爆款大师

文 / 高扬&#xff08;微信公众号&#xff1a;量子论&#xff09; 最近公众号更新有些慢&#xff0c;因为我在配合陈楚&#xff08;chenchu727&#xff09;做小红书。 ChatGPT用在小红书上具有天然优势&#xff0c;然后再接合AI绘画&#xff0c;更是绝配。 AI绘画&#xff0c;陈…

DNS配置与爬虫原理——Dialogue with ChatGPT

本文记录一次与ChatGPT的有趣对话 PS&#xff1a;劳资自下而上&#xff0c;只差应用层了~~ 不对&#xff0c;还不知道ARP欺骗怎么辨别和防止 PS2&#xff1a;问过校园网mac了&#xff0c;应该没有ARP欺骗 学这个有什么用&#xff0c;好玩吗? 写一个爬取对方QQ好友的小程序 很抱…

RK3566-视频话机智慧校园主板方案

RK3566 是一款专为消费类行业应用打造的通用型 SoC。CPU 采用 4 核 A55 架构处理器&#xff0c;集成 G52 图形处理器&#xff0c;且内置独立 NPU&#xff0c;算力为 0.8Tops&#xff0c;运行安卓 11 或 Linux 系统。 基本参数 SOC RK3566&#xff0c;4*A55处理器&#xff0c…

校园网搭建3.0分享梳理,测试还没完成

几个有意思的网络拓扑图先瞧瞧 &#x1f43c;&#xff1a;网吧网速是流畅到每一秒钟的 步入正题 在某学院校园网目前的实际情况在充分调研的基础上&#xff0c;结合目前技术的发展方向和用户的实际需求&#xff0c;制订了学院校园校园网建设的整体设计方案。通过校园网的设计与…

学术会议盘点!2023年发表SCI的绝佳机会

◆ChatGPT热潮带来的行业革新大行其道&#xff0c;相关区块链、信息安全、视觉、机器学习....产业必将带来诸多变革。 本文为大家梳理了近期可投的4则EI检索的国际会议&#xff0c;均可推荐发表SCI&#xff0c;还有超多IEEE Fellow主讲&#xff0c;不仅涵盖计算机各个学科方向&…

征文 | 吸引铁粉?成为CSDN明星!

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 征文 | 吸引铁粉&#xff1f;成为CSDN明星&#xff01; 导读 当今数字时代&#xff0c;社交媒体和在线社区成为了人们交流和分享的主要平台之一&#xff0c;CSDN就是其…