社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Oh My God!Python 还能帮你理财?!

编程派 • 4 年前 • 346 次点击  

你不理财,财不理你!Python 也能帮你理财?听说金融行业很多分析师都已经开始学 Python 了,本文介绍了如何获取基金收益数据的方式,拿到数据后你可以做的事情就多了!

文 | 白玉无冰 出处 | SegmentFault

效果预览

累计收益率走势图

基本信息结果

如何使用:

python3 + 一些第三方库

  1. import requests

  2. import pandas

  3. import numpy

  4. import matplotlib

  5. import lxml

配置 config.jsoncode 配置基金代码, useCache 是否使用缓存。

  1. {

  2. "code":[

  3. "002736",

  4. "003328",

  5. "003547",

  6. ],

  7. "useCache":true

  8. }

运行 fund_analysis.py

实现原理

数据获取:

从天天基金网里点开一个基金,在 chrome 开发者工具观察加载了的文件。依次查找发现了一个 js 文件,里面含有一些基金的基本信息。这是一个 js 文件。

获取累计收益率信息需要在页面做些操作,点击累计收益里的3年,观察开发者工具的请求,很容易找到这个数据源是如何获取的。这是个 json 数据。

基金费率表在另一个页面,我们多找几次可以找到信息源地址。这是个 html 数据。

接着通过对 Hearders 的分析,用 request 模拟浏览器获取数据(这里不清楚的话可以参考之前的文章)。最后将其保存在本地作为缓冲使用。以累计收益率信息 json 为例子,主要代码如下。

  1. filePath = f'./cache/{fundCode}.json'

  2. requests_url='http://api.fund.eastmoney.com/pinzhong/LJSYLZS'

  3. headers = {

  4. 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36',

  5. 'Accept': 'application/json' ,

  6. 'Referer': f'http://fund.eastmoney.com/{fundCode}.html',

  7. }

  8. params={

  9. 'fundCode': f'{fundCode}',

  10. 'indexcode': '000300',

  11. 'type': 'try',

  12. }

  13. requests_page=requests.get(requests_url,headers=headers,params=params)

  14. with open(filePath, 'w') as f:

  15. json.dump(requests_page.json(), f )

数据分析:

对于 基本信息的 js 文件,读取文件后作为字符串,通过正则表达式获取需要的数据。

例如获取一年收益率可以用以下代码获取。

  1. syl_1n=re.search(r'syl_1n\s?=\s?"([^\s]*)"',data).group(1);

对于 累计收益率 json 数据,直接用 json 解析,找到需要数据进行筛选加工处理。

采用了 all_data[基金代码][时间]=累计收益率 的格式存储,再通过 pandas 的 DataFrame 进行向上填充空数据。

  1. df = DataFrame(all_data).sort_index().fillna(method= 'ffill')

对于 基金费率表 html 数据,采用 xpath 解析。xpath 路径可以直接用 chrome 获取。

对于管理费率可以参考以下代码。

  1. selector = lxml.html.fromstring(data);

  2. # 管理费率

  3. mg_rate=selector.xpath('/html/body/div[1]/div[8]/div[3]/div[2]/div[3]/div/div[4]/div/table/tbody/tr/td[2]/text()')[0]

数据存储:

使用 DataFrame 中的 plot 可以快速画图,使用 to_excel 保存在 Excel 表中。可以参考以下代码。

  1. # 保存数据

  2. fig,axes = plt.subplots(2, 1)

  3. # 处理基本信息

  4. df2 = DataFrame(all_data_base)

  5. df2.stack().unstack(0).to_excel(f'result_{time.time()}.xlsx',sheet_name='out')

  6. df2.iloc[1:5,:].plot.barh(ax=axes[0],grid=True,fontsize=25)

  7. # 处理收益

  8. df=DataFrame (all_data).sort_index().fillna(method='ffill')

  9. df.plot(ax=axes[1],grid=True,fontsize=25)

  10. fig.savefig(f'result_{time.time()}.png')

小结

数据的获取主要采用了爬虫的基本方法,使用的是 requests 库。而数据的解析和保存主要运用的是正则表达式、xpath解析库以及 pandas 数据处理库。

对于一个基金的分析远远不止于这些数据(例如持仓分布,基金经理信息等),这里只是做个引子,希望能给大家一个思路,如果你有想法或者不懂的地方,欢迎留言或私信交流!

参考资料:https://mp.weixin.qq.com/s/DAsc41ziM5KOmlXtLxMeEQ

签到送书计划

自律改变自我!第①期打卡送书活动启动!

我发起了一个签到送书活动,活动结束后将送出 5 本 Python 技术书。签到次数越多,中奖概率越高。活动详情,请点击:自律改变自我!第①期打卡送书活动启动!

下面是今天的签到二维码:


回复下方「关键词」,获取优质资源


回复关键词「 pybook03」,立即获取主页君与小伙伴一起翻译的《Think Python 2e》电子版

回复关键词「 入门资料」,立即获取主页君整理的 10 本 Python 入门书的电子版

回复关键词「m」,立即获取Python精选优质文章合集

回复关键词「book 数字」,将数字替换成 0 及以上数字,有惊喜好礼哦~


推荐阅读



题图:pexels,CC0 授权。


好文和朋友一起看~
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/51058
 
346 次点击