python在处理金融数据时,具有很多优点:一是语法简单,可以轻松上手;二是免费与开源,使用python不像使用matlab需要购买软件授权,节约成本开支;三是具有强大的第三方模块支持,从numpy到pandas、再到人工智能,都有成熟开源模块提供支撑;最后一个是与金融进行了深度的结合,从行情获取到投资策略开发再到风控,都有广泛的应用场景。这篇文章演示了从数据获取到处理的一个简单的、完整的业务流程,主要面向python金融初学者。
安装相对比较简单,使用 pip install tushare 指令在终端中即可正常安装。
导入tushare 包: import tushare as ts
print(f"tushare 版本: {ts.__version__}")
登录到www.tushare.org网站之后,点击用户中心,上面有一个‘接口token’选项卡,点击复制token。
从tushare.pro数据平台——数据接口——沪深股票——基础数据—— 股票列表中查看数据获取方式。(注意,tushare pro数据接口数据需要积分才能获取,大约需要2000积分才有权限,对应需要捐助大约人民币200元,需要免费使用数据接口的注意查找其他方法。)
包含:市场类型(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())
结果如下:
包括动态市盈率(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)
结果如下:
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)
结果如下:
四支股票行情数据与沪深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最差,三个图表一一相互印证,为后面的投资决策分析提供了参考。
金融分析工作相对比较复杂,单个产品的分析相对比较简单,所以此文主要是针对没有入门的读者进行入门操练用,后面的组合分析,主要要用到时间序列分析方面的金融数学知识、期权分析要计算希腊值,对冲、套利都离要从这些最基本的分析工具走起,道阻且长。
如需这方面的辅导,可以私信联系。
话说看文章经常点评赞的同学,容易有不少女朋友,不信的话可以试试。:)