本文主要讲解如何使用Python分析bilibili的股价。通过对股票数据的基础分析,结合使用matplotlib绘图库进行可视化,并利用机器学习方法——蒙特卡洛模拟来预测未来年度股价走势。安装我们需要安装numpy、pandas、matplotlib、scipy等Python数据科学工具包。#关公众号:全客帮,回复“源码”下载本文完整源码哔哩哔哩(股票代码:BILI)从2018年上市到2021年至今的数据进行分析,数据来自雅虎。这里使用pd.to_datetime将数据集时间转换成时间序列,方便股票分析。BILI=data.DataReader('BILI','yahoo',start='29/3/2018',)BILI.index=pd.to_datetime(BILI.index)先用head()方法看结构数据集,数据集包含股票的开盘价、收盘价、每日最低价和最高价、成交量等信息。扫描本文底部二维码,获取所有完整源码和打包下载的JupyterNotebook文件。对于开盘价走势,我们可以通过matplotlib进行数据可视化。plt.legend用来设置图片的图例,loc是图例的位置,upperright表示图例在右上角。从图中可以看出,哔哩哔哩的股票在2020年12月到2021年2月期间有过快速上涨,之后股价回落。plt.figure(figsize=(16,6))BILI['Open'].plot()plt.legend(['BILI'],loc='upperright')股票交易量我们来看看股票交易量.plt.figure(figsize=(16,6))BILI['Volume'].plot()plt.legend(['BILI'],loc='upperright')plt.xlim(BILI.index[0],BILI.index[-1])股票总成交额下面分析一下股票的总成交额。从图中可以明显看出,2021年1-5月某日的总交易量创历史新高。BILI['TotalTraded']=BILI['Open']*BILI['Volume']plt.figure(figsize=(16,6))BILI['TotalTraded'].plot()plt.legend(['BILI'],loc='upperright')plt.xlim(BILI.index[0],BILI.index[-1])让我们使用argmax()来获取最大交易金额的日期。BILI['TotalTraded'].argmax()输出如下:Timestamp('2021-02-2500:00:00')我们搜索新闻,发现是哔哩哔哩(纳斯达克股票代码:BILI)公布的2021年2月25日截至2020年12月31日的第四季度及全年未经审计财务报告。财报发布后,B站股价在美股盘后涨幅超过5%.收盘价及其移动平均线BILI股票的收盘价及其移动平均线如下图所示,我们可以使用DataFrame的rolling()函数来获取移动平均线。BILI['Close'].plot(figsize=(16,6),xlim=(BILI.index[0],BILI.index[-1]))BILI['Close'].rolling(50).mean().plot(label='BILIMA50')BILI['Close'].rolling(200).mean().plot(label='BILIMA200')plt.legend()股票的收益我们计算每只股票的收益每日回报率以直方图显示。这里介绍三种计算日收益率的方法,第一种是直接使用计算公式;二是引入金融领域专用的第三方库ffn.to_returns函数;第三种是使用pandas自带的函数pct_change(1)进行计算。扫描本文底部二维码,获取所有完整源码和打包下载的JupyterNotebook文件。#关锁公众号:宽客帮,回复“源码”获取完整源码,直接用计算公式计算BILI['Return']=(BILI['Close']-BILI['Close'].shift(1))/BILI['Close'].shift(1)BILI=BILI.dropna()#导入金融领域专用第三方库ffn.to_returns函数计算importffnBILI['Return']=ffn.to_returns(BILI['Close'])#使用pandas自带的函数pct_change(1)计算BILI['Return']=BILI['Close'].pct_change()BILI=BILI.dropna()#Focuson公众号:全客帮,回复获取“源码”,下载本文完整源码box_df.columns=['BILIReturns']box_df.plot(kind='box',figsize=(8,11),colormap='jet')绘制股票的累计收益BILI['CumulativeReturn']=(1+BILI['Return']).cumprod()BILI['CumulativeReturn'].plot(label='BILI',figsize=(16,8),title='CumulativeReturn')plt.legend()股票年复合增长率计算股票年复合增长率和ear年波动率宁斯。#关锁公众号:宽客帮,回复“源码”获取完整源码,计算年复合增长率days=(BILI.index[-1]-BILI.index[0]).dayscagr=((((BILI['AdjClose'][-1])/BILI['AdjClose'][1]))**(365.0/天))-1print('CAGR=',str(round(cagr)*100)+"%")mu=cagr#计算收益的年波动率BILI['Returns']=BILI['AdjClose'].pct_change()vol=BILI['Returns']*sqrt(252)print("AnnualVolatility=",str(round(vol,4)*100)+"%")CAGR=71.72%AnnualVolatility=65.14%使用蒙特卡洛模拟预测股票趋势让我们预测潜在价格序列在单个交易年内的演变(252天)在未来模拟,基于服从正态分布的每日回报的随机抽取。由第一张图表中显示的单线系列表示。第二张图表绘制了一年期间这些随机每日回报的直方图。扫描本文底部二维码,获取所有完整源码和打包下载的JupyterNotebook文件。S=BILI['AdjClose'][-1]#初始股价(即最后一天的实际股价)T=252#交易天数mu=0.7172#年复合增长率vol=0.6514#年波动率#注意公众号:全客帮,回复“源码”获取完整源码,使用随机正态分布创建日收益表daily_returns=np.random.normal((mu/T),vol/math.sqrt(T))+1#关注公众号:宽客帮,回复“源码”下载本文完整源码price_list=[S]forxindaily_returns:price_list.append(price_list[-1]*x)#Generate价格序列的折线图plt.plot(price_list)plt.show()生成日收益直方图plt.hist(daily_returns-1,100)plt.show()1000次模拟预测未来哔哩哔哩股价走势。importnumpyasnpimportmathimportmatplotlib.pyplotaspltfromscipy.statsimportnorm#关注公众号:全客帮,回复“源码”下载本文完整源码S=BILI['AdjClose'][-1]#股票初始价(即实际最后一天的股价)T=252#Tradingdaysmu=0.7172#Compoundannualaveragegrowthratevol=0.6514#Annualvolatility#选择要模拟的运行次数——我选择1000foriinrange(1000):#使用随机正态分布创建每日收益列表daily_returns=np.random.normal(mu/T,vol/math.sqrt(T))+1#设置起始价格并创建由上述随机每日收益生成的价格列表price_list=[S]forxindaily_returns:price_list.append(price_list[-1]*x)#绘制每个单独运行的数据,我们将在最后绘制plt.plot(price_list)#显示上面创建的多个价格序列的图plt.show()10000次模拟预测未来哔哩哔哩股价走势。importnumpyasnpimportmathimportmatplotlib.pyplotaspltfromscipy.statsimportnorm#关注公众号:全客帮,回复“源码”下载本文完整源码result=[]#DefinevariableS=BILI['AdjClose'][-1]#Initial股价(即最后一天的实际股价)T=252#交易天数mu=0.7172#复合年平均增长率vol=0.6514#年波动率#选择要模拟的运行次数-选择10000foriinrange(10000):#使用随机正态分布创建每日收益列表daily_returns=np.random.normal(mu/T,vol/math.sqrt(T))+1#设置起始价并创建上述随机每日收益生成的价格列表price_list=[S]forxindaily_returns:price_list.append(price_list[-1]*x)#plotthedatafromeachindividualrun,wewillplotattheendplt.plot(price_list)#appendtheendvalueofeachsimulationrunto我们在result.append(price_list[-1])的开头创建的空列表#show多个价格系列的图表cre上面的plt.show()为我们的多重模拟创建了股票收盘价的直方图。plt.hist(result,bins=50)plt.show()用numpy的均值函数计算均值的分布,得到我们的“期望值”。print(round(np.mean(result)))139.18使用numpy的“percentile”函数计算5%和95%分位数print("5%quantile=",np.percentile(result,5))print("95%quantile=",np.percentile(result,95))5%quantile=38.3355081417525295%quantile=326.44060907630484快速将我们刚刚计算的两个分位数绘制在直方图上,给我们一个直观的表示。plt.hist(result,bins=100)plt.axvline(np.percentile(result,5),color='r',linestyle='dashed')plt.axvline(np.percentile(result,95),color='r',linestyle='dashed')plt.show()从上面的结果我们知道哔哩哔哩(BILI)股价最终低于$38.33的可能性有5%,有5%可能性Sex将高于326.44美元。那么,您是否愿意冒5%的风险在38.33美元以下的损失来追逐326.44美元以上的回报?
