python金融:从tushare金融数据的获取到运用pandas数据清洗、处理、加工与金融波动率、年化收益率、最大回撤、夏普比率等指标计算与数据可视化
python在处理金融数据时,具有很多优点:一是语法简单,可以轻松上手;二是免费与开源,使用python不像使用matlab需要购买软件授权,节约成本开支;三是具有强大的第三方模块支持,从numpy到pandas、再到人工智能,都有成熟开源模块提供支撑;最后一个是与金融进行了深度的结合,从行情获取到投资策略开发再到风控,都有广泛的应用场景。这篇文章演示了从数据获取到处理的一个简单的、完整的业务流程,主要面向python金融初学者。
一、Tushare的安装与接口调用方法
(一)模块安装
安装相对比较简单,使用 pip install tushare 指令在终端中即可正常安装。
(二)模块调用
导入tushare 包: import tushare as ts
1.查看安装版本
print(f"tushare 版本: {ts.__version__}")
2.获取tushare的token
登录到www.tushare.org网站之后,点击用户中心,上面有一个‘接口token’选项卡,点击复制token。

3.查询所需数据接口信息
从tushare.pro数据平台——数据接口——沪深股票——基础数据—— 股票列表中查看数据获取方式。(注意,tushare pro数据接口数据需要积分才能获取,大约需要2000积分才有权限,对应需要捐助大约人民币200元,需要免费使用数据接口的注意查找其他方法。)



3. 数据获取
(1)通过数据接口Tushare(pro)获取目前处于上市状态的公司列表
包含:市场类型(market),交易所代码(exchange),股票名称(name),股票代码(ts_code),地区(area),行业(industry)
import tushare as ts
import pandas as pd
import seaborn as sb
import numpy as np
import datetime as dt
print(f"tushare 版本: {ts.__version__}",'\n')
token = '******************************************'
ts.set_token(token)
pro = ts.pro_api()
# 获取上市状态公司列表
df = pro.stock_basic(exchange='', list_status='L', fields='market,exchange,name,ts_code,area,industry')
print(df.head())
结果如下:

(2)获取2023年12月4日所有上市股票的基本面数据(备用列表)
包括动态市盈率(pe)、每股收益(eps)、市净率(pb)、股票代码(ts_code),股票名称(name),将股票名称设置为index
df_alternate = pro.bak_basic(trade_date='20231204',fields='pe,eps,pb,ts_code,name').set_index(['ts_code']) display(df_alternate)
结果如下:

(3)获取股票2020年1月1日到2023年11月30日的日行情数据
stock_str = '600822.SH,600638.SH,300326.SZ,300802.SZ,' df_4_daily = ts.pro_bar(ts_code=stock_str, start_date='20200101', end_date='20231130') print(df_4_daily)
结果如下:

二、金融数据的预处理
(一)数据聚类,从上市公司列表中筛选出上海市的股票列表
df = df.groupby('area') # 以地区进行分组
df = df.get_group('上海')
结果如下:

(二)根据条件随机选择股票,模拟随机过程
从上海市的股票中任意选取六支股票,其中需包含:任意两支主版的股票(600xxx),任意两支中小版股票(00xxxx),任意两支创业版股票(300xxx)。将六支股票名放到一个列表中。
df1 = df[df['ts_code'].str.startswith(('600'))].sample(2)
df2 = df[df['ts_code'].str.startswith(('00'))].sample(2)
df3 = df[df['ts_code'].str.startswith(('300'))].sample(2)
list6 = df1['ts_code'].to_list() + df2['ts_code'].to_list() + df3['ts_code'].to_list()
list6
结果如下 :
![]()
(三)去掉PE最高的股票和EPS最低的股票
df_6 = df_alternate.loc[list6,['pe','eps','pb']] # 获取6支票的基本面信息
df_5 = df_6.drop(df_6['pe'].idxmax())
display('去除PE最大的股票后剩余的5支股票:',df_5)
df_4 = df_5.drop(df_5['eps'].idxmin())
display('去除EPS最低值后剩余的4支股票',df_4)
结果如下:

(三)数据框df的合并
四支股票行情数据与沪深300数据合并为一个DataFrame。
df_4_daily = df_4_daily.loc[:,['close','open','high','low','vol']].sort_values(by='trade_date', ascending=True) assets_all = pd.concat([df_4_daily,df_hs300_daily],axis=0).sort_values(by='trade_date', ascending=True) assets_all.head(10)
结果如下:

(四)金融数据透视
主要运用DataFrame中的收盘价‘close’,并将日期设置为Index。
assets_all = assets_all.reset_index().set_index('trade_date')
pivot_table = pd.pivot_table(assets_all, index=['trade_date'], columns=['ts_code'], values=['close'])['close']
display(pivot_table.head())
结果如下:

三、金融数据分析与可视化
(一)计算每日收益率并用直方图显示收益率分布
每日收益计算:daily_return = close/close.shift(1) – 1 或 pct_change()
结果如下


(二)计算各资产之间收益的相关性矩阵,并用热力图表示
结果如下:

(三)计算累积收益率并对比收益率情况
accum = daily_rtn.cumsum().apply(np.exp) display(accum.head(3)) accum.plot(title='Accum Return',figsize=(10,6))
结果如下:

(四)收益质量分析-夏普比率的运用
夏普比率计算公式:
sharpe_ratio = (E(r)-Rf)/sigma
夏普比率 = (期望收益 – 无风险收益)/方差
结果:

(五)风险分析-最大回撤的计算与展示
df_max = pivot_table.max() # 计算每只股票的最大净值 df_drawdown = (pivot_table-df_max) / df_max # 计算每只股票的回撤 df_maximum_drawdown = df_drawdown.min() # 计算每只股票的最大回撤 df_maximum_drawdown.plot.bar(title='Maximum Drawdown',figsize=(6,3),rot=0)
结果如下:

(六)结果简单分析
从(三)、(四)、(五)的计算结果与图表中,可以清晰的看到,在过去的三年中,600822表现最好,600638其次,300326最差,三个图表一一相互印证,为后面的投资决策分析提供了参考。
结语:
金融分析工作相对比较复杂,单个产品的分析相对比较简单,所以此文主要是针对没有入门的读者进行入门操练用,后面的组合分析,主要要用到时间序列分析方面的金融数学知识、期权分析要计算希腊值,对冲、套利都离要从这些最基本的分析工具走起,道阻且长。
如需这方面的辅导,可以私信联系。
话说看文章经常点评赞的同学,容易有不少女朋友,不信的话可以试试。:)

本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://www.net2asp.com/bde458cc1c.html
