如何做出选择
假使我们筛选出来的候选人就是这13支股票,但是我们不确定应该如何做出选择。那我们简单地尝试一下将目标锁定在收益和波动这两个指标上来进行我们下面的工作。
import pandas as pd
import numpy as np
import tushare as ts
from functools import reduce
token = '你的tushare密钥'
ts.set_token(token)
pro = ts.pro_api(token)
上代码
封装数据
- 首先我们封装一个获取股票的每日数据的函数。数据按照时间正序,只取交易日期
trade_date
和收盘价格close
列。
def concat_df(code,start='2021-01-01',end=''):
df_00 = ts.pro_bar(code,start_date=start,end_date=end,adj='qfq',freq='D')
df_00= df_00.sort_values('trade_date', ascending=True)
df_00 = df_00[['trade_date','close']]
return df_00
- 将股票名称和代码进行一个打包,上篇的
df_result
就是我们的对象。将数据放入在一个list中。
name = df_result.name.values.tolist()
ticker = df_result.ts_code.values.tolist()
dfs = [concat_df(s) for s in ticker]
- 将list中的13段数据进行拼接,成为一个Dataframe。并按照交易日期列来对齐,使用reduce()函数来进行操作。不得不说代码原作者的功底是真的强。
解读一下这行代码:将13段数据进行左右拼接;以左①为起点,右①至右①②列列横向追加数据;用trade_date列来对齐;dfs为拆分对象;
.iloc[:, 1:]
取每列里所有行的数值,取从第一列开始以后的所有数值(也就是说我们舍去了第一列的交易日期)。
data = reduce(lambda left, right: pd.merge(left, right, on='trade_date'), dfs).iloc[:, 1:]
计算数据
- 下面我们来计算收益率和波动率。然后将数据年化,乘以252天。并打包成Dataframe。
returns = data.pct_change()
mean_daily_returns = returns.mean()
volatilities = returns.std()
combine = pd.DataFrame({'returns': mean_daily_returns * 252,
'volatility': volatilities * 252})
- 导入画图工具,matplotlib和seaborn。这里说明一下,我导入的是Noto字体,请按自己的情况来进行字体设置。中文输出很头疼!
import matplotlib.pyplot as mpl
from matplotlib import font_manager
%matplotlib inline
my_font = font_manager.FontProperties(fname="C:\\Users\\...\\Fonts\\NotoSansMonoCJKsc-Regular.otf")
# mpl.rcParams['font.sans-serif'] = ['SimHei']
# mpl.rcParams['axes.unicode_minus']=False
import seaborn as sns
sns.set()
画图分析
- 我们画一个收益率和波动率的回归图来看看这13个候选人的具体情况。X轴波动率,Y轴收益率。
g = sns.jointplot(data=combine, x="volatility", y="returns", kind="reg",height=7)
# name 我们已经在第2步打包好了,【i,1】是表内的波动率,【i,0】是表内的收益率
for i in range(combine.shape[0]):
mpl.annotate(name[i], (combine.iloc[i,1], combine.iloc[i,0]), fontproperties=my_font)
mpl.text(10, -0.2, 'SELL', fontsize=40, fontproperties=my_font)
mpl.text(7, 1.25, 'BUY', fontsize=40, fontproperties=my_font)
mpl.show()
结论
从图表中我们可以清晰的知道这13个候选股票的情况,这样对于我们的投资会有一定的帮助。图中所示当前的状况在蓝线以下的候选股票还是要酌情考虑是否要购买,蓝线以上的股票相对来讲也存在超买的可能。我们需要再结合一些其它的分析来巩固我们的投资选择,譬如一些技术指标,和大盘目前的处境。希望这篇分析对大家有所帮助。