互联网技术 / 互联网资讯 · 2024年2月1日 0

用机器学习预测 Bilibili 股票走势

本文主要讲解用Python分析哔哩哔哩股价,通过对股票数据进行基础分析,结合运用Matplotlib绘图库进行可视化,并用机器学习方法蒙特卡洛模拟预测未来一年股价走势。

yyds!用机器学习预测 bilibili 股价走势

安装

我们需要安装nuMpy、pandas、Matplotlib、scIPy等Python数据科学工具包。

选取哔哩哔哩(股票代码:BILI)2018年上市到现在2021年的数据进行分析,数据来自雅虎。这里使用pd.to_datetiMe将数据集时间转化为时间序列,便于股票的分析。

首先用head()方法看一下数据集的结构,数据集包含了股票的开盘价、收盘价、每日最低价与最高价、交易量等信息。扫描本文最下方二维码获取全部完整源码和JupyteR Notebook 文件打包下载。

yyds!用机器学习预测 bilibili 股价走势

开盘价走势

我们可以通过 Matplotlib 进行数据可视化,plt.legend用于设置图像的图例,loc是图例位置,uppeR Right代表图例在右上角。从图中可以看出哔哩哔哩股票在2020年12月到2021年2月之间有一个快速的增长,随后股价有所回落。

plt.figuRe(figsize=(16,6)) BILI[‘Open’].plot() plt.legend([‘BILI’],loc=’uppeR Right’)

yyds!用机器学习预测 bilibili 股价走势

股票成交量

我们再来看一下股票的成交量。

plt.figuRe(figsize=(16,6)) BILI[‘VoluMe’].plot() plt.legend([‘BILI’],loc=’uppeR Right’) plt.xliM(BILI.index[0],BILI.index[-1])

yyds!用机器学习预测 bilibili 股价走势

股票交易总额

我们再分析以下股票的交易总额。从图中可以很明显看出2021年1月到5月间某一天交易总额创历史新高。

BILI[‘TOTAl TRaded’]=BILI[‘Open’]*BILI[‘VoluMe’] plt.figuRe(figsize=(16,6)) BILI[‘TOTAl TRaded’].plot() plt.legend([‘BILI’],loc=’uppeR Right’) plt.xliM(BILI.index[0],BILI.index[-1])

yyds!用机器学习预测 bilibili 股价走势

下面我们来通过aRgMax()获取最大交易总额的日期。

BILI[‘TOTAl TRaded’].aRgMax()

输出结果如下:

TiMestaMp(‘2021-02-25 00:00:00’)

我们搜索新闻可以发现,2021年2月25日哔哩哔哩(NASDAQ: BILI)公布了截至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=’BILI M0′) BILI[‘Close’].Rolling(200).Mean().plot(label=’BILI MA200′) plt.legend()

yyds!用机器学习预测 bilibili 股价走势

股票的收益率

下面我们计算每支股票的日收益率,并用直方图进行展示。这里了三种方法来计算日收益率,第一种是直接使用计算公式计算;第二种是导入专用于金融领域的第三方库FFn.to_RetuRns函数计算;第三种是利用pandas自带的函数PCt_change(1)进行计算。扫描本文最下方二维码获取全部完整源码和JupyteR Notebook 文件打包下载。

BILI[‘RetuRn’]=(BILI[‘Close’]-BILI[‘Close’].sHift(1))/BILI[‘Close’].sHift(1) BILI=BILI.dRopna() #导入专用于金融领域的第三方库FFn.to_RetuRns函数计算 iMpoRt FFn BILI[‘RetuRn’]=FFn.to_RetuRns(BILI[‘Close’]) #利用pandas自带的函数PCt_change(1)进行计算 BILI[‘RetuRn’]=BILI[‘Close’].PCt_change() BILI=BILI.dRopna() plt.Hist(BILI[‘RetuRn’],BIns=50)

yyds!用机器学习预测 bilibili 股价走势

也可以用箱图观察收益率

box_df = pd.concat([BILI[‘RetuRn’]],axis=1) box_df.coluMns = [‘BILI RetuRns’] box_df.plot(kind=’box’,figsize=(8,11),coloRMap=’jet’)

yyds!用机器学习预测 bilibili 股价走势

绘制股票的累计收益率

BILI[‘CuMulative RetuRn’]=(1+BILI[‘RetuRn’]).cuMProd() BILI[‘CuMulative RetuRn’].plot(label=’BILI’,figsize=(16,8),tITle=’CuMulative RetuRn’) plt.legend()

yyds!用机器学习预测 bilibili 股价走势

股票的复合年均增长率和收益的年度波动率

计算股票的复合年均增长率和收益的年度波动率。

CAGR = 71.72%Annual VolatilITy = 65.14%

用蒙特卡洛模拟预测股票走势

我们来预测未来一个交易年度(252 天)内潜在价格序列演变的单一模拟,基于遵循正态分布的每日收益随机的抽取。由第一个图表中显示的单线系列表示。第二个图表绘制了一年期间这些随机每日收益的直方图。扫描本文最下方二维码获取全部完整源码和JupyteR Notebook 文件打包下载。

S = BILI[‘Adj Close’][-1] #起始股票价格(即最后一天的实际股票价格) T = 252 #交易天数 Mu = 0.7172 #复合年均增长率 vol = 0.6514 #年度波动率 #关注公众号:宽客邦,回复“源码”获取完整源码,使用随机正态分布创建每日收益列表 dAIly_RetuRns=np.Random.noRMal((Mu/T),vol/Math.sqRt(T)) #关注公众号:宽客邦,回复“源码”获取下载本文完整源码 price_list = [S] foR x in dAIly_RetuRns: price_list.append(price_list[-1]*x) plt.plot(price_list) plt.show()

yyds!用机器学习预测 bilibili 股价走势

生成每日收益的直方图

plt.Hist(dAIly_RetuRns-1, 100) plt.show()

yyds!用机器学习预测 bilibili 股价走势

1000次模拟预测未来哔哩哔哩股价走势。

iMpoRt nuMpy as np iMpoRt Math iMpoRt Matplotlib.pyplot as plt fRoM scIPy.stats iMpoRt noRM #关注公众号:宽客邦,回复“源码”获取下载本文完整源码 S = BILI[‘Adj Close’][-1] #起始股票价格(即最后一天的实际股票价格) T = 252 #交易天数 Mu = 0.7172 #复合年均增长率 vol = 0.6514 #年度波动率 #选择要模拟的运行次数 – 我选择1000 foR i in Range(1000): #使用随机正态分布创建每日收益列表 dAIly_RetuRns=np.Random.noRMal(Mu/T,vol/Math.sqRt(T))+1 #设置起始价格并创建由上述随机每日收益生成的价格列表 price_list = [S] foR x in dAIly_RetuRns: price_list.append(price_list[-1]*x) plt.plot(price_list) plt.show()

yyds!用机器学习预测 bilibili 股价走势

10000次模拟预测未来哔哩哔哩股价走势。

iMpoRt nuMpy as np iMpoRt Math iMpoRt Matplotlib.pyplot as plt fRoM scIPy.stats iMpoRt noRM #关注公众号:宽客邦,回复“源码”获取下载本文完整源码 Result = [] #定义变量 S = BILI[‘Adj Close’][-1] #起始股票价格(即最后一天的实际股票价格) T = 252 #交易天数 Mu = 0.7172 #复合年均增长率 vol = 0.6514 #年度波动率 #选择要模拟的运行次数 – 选择10000 foR i in Range(10000): #使用随机正态分布创建每日收益列表 dAIly_RetuRns=np.Random.noRMal(Mu/T,vol/Math.sqRt(T))+1 #设置起始价格并创建由上述随机每日收益生成的价格列表 price_list = [S] foR x in dAIly_RetuRns: price_list.append(price_list[-1]*x) #绘制来自每个单独运行的数据,我们将在最后绘制 plt.plot(price_list) #将每次模拟运行的结束值附加到我们在开始时创建的空列表中 Result.append(pRice_list[-1]) #显示上面创建的多个价格系列的图 plt.show()

yyds!用机器学习预测 bilibili 股价走势

为我们的多重模拟创建股票收盘价的直方图。

plt.Hist(Result,BIns=50) plt.show()

yyds!用机器学习预测 bilibili 股价走势

用nuMpy Mean函数计算平均值的分布,以获得我们的“预期值”。

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.33550814175252 95% 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()