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

用机器学习预测 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()

OpenMagic API

Need more than content? Move into the product flow.

If you are here for model access, pricing, developer docs, or the future API console, the dedicated product path now lives on api.openmagic.ai.

登录免费注册