yyds!用机器学习预测 bilibili 股价走势
本文主要講解用Python分析嗶哩嗶哩股價,通過對股票數據進行基礎分析,結合運用matplotlib繪圖庫進行可視化,并用機器學習方法 — 蒙特卡洛模擬預測未來一年股價走勢。
安裝
我們需要安裝numpy、pandas、matplotlib、scipy等Python數據科學工具包。
#關注公眾號:寬客邦,回復“源碼”獲取下載本文完整源碼 import?numpy?as?np import?pandas?as?pd from?math?import?sqrt import?matplotlib.pyplot?as?plt from?scipy.stats?import?norm from?pandas_datareader?import?data選取嗶哩嗶哩(股票代碼:BILI)2018年上市到現在2021年的數據進行分析,數據來自雅虎。這里使用pd.to_datetime將數據集時間轉化為時間序列,便于股票的分析。
BILI?=?data.DataReader('BILI',?'yahoo',start='29/3/2018',) BILI.index=pd.to_datetime(BILI.index)首先用head()方法看一下數據集的結構,數據集包含了股票的開盤價、收盤價、每日最低價與最高價、交易量等信息。掃描本文最下方二維碼獲取全部完整源碼和Jupyter Notebook 文件打包下載。
開盤價走勢
我們可以通過 matplotlib 進行數據可視化,plt.legend用于設置圖像的圖例,loc是圖例位置,upper right代表圖例在右上角。從圖中可以看出嗶哩嗶哩股票在2020年12月到2021年2月之間有一個快速的增長,隨后股價有所回落。
plt.figure(figsize=(16,6)) BILI['Open'].plot() plt.legend(['BILI'],loc='upper?right')股票成交量
我們再來看一下股票的成交量。
plt.figure(figsize=(16,6)) BILI['Volume'].plot() plt.legend(['BILI'],loc='upper?right') plt.xlim(BILI.index[0],BILI.index[-1])股票交易總額
我們再分析以下股票的交易總額。從圖中可以很明顯看出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])下面我們來通過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?MA50') BILI['Close'].rolling(200).mean().plot(label='BILI?MA200') plt.legend()股票的收益率
下面我們計算每支股票的日收益率,并用直方圖進行展示。這里了三種方法來計算日收益率,第一種是直接使用計算公式計算;第二種是導入專用于金融領域的第三方庫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)也可以用箱圖觀察收益率
box_df?=?pd.concat([BILI['Return']],axis=1) box_df.columns?=?['BILI?Returns'] box_df.plot(kind='box',figsize=(8,11),colormap='jet')繪制股票的累計收益率
BILI['Cumulative?Return']=(1+BILI['Return']).cumprod()BILI['Cumulative?Return'].plot(label='BILI',figsize=(16,8),title='Cumulative?Return') plt.legend()股票的復合年均增長率和收益的年度波動率
計算股票的復合年均增長率和收益的年度波動率。
#關注公眾號:寬客邦,回復“源碼”獲取完整源碼,計算復合年均增長率 days?=?(BILI.index[-1]?-?BILI.index[0]).days cagr?=?((((BILI['Adj?Close'][-1])?/?BILI['Adj?Close'][1]))?**?(365.0/days))?-?1 print?('CAGR?=',str(round(cagr)*100)+"%") mu?=?cagr#計算收益的年度波動率 BILI['Returns']?=?BILI['Adj?Close'].pct_change() vol?=?BILI['Returns']*sqrt(252) print?("Annual?Volatility?=",str(round(vol,4)*100)+"%")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))+1#關注公眾號:寬客邦,回復“源碼”獲取下載本文完整源碼 price_list?=?[S]for?x?in?daily_returns:price_list.append(price_list[-1]*x)#生成價格序列的折線圖plt.plot(price_list) plt.show()生成每日收益的直方圖
plt.hist(daily_returns-1,?100)? plt.show()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()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()為我們的多重模擬創建股票收盤價的直方圖。
plt.hist(result,bins=50) plt.show()用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()從上面的結果我們得知:嗶哩嗶哩(BILI)的股價有5%的可能性最終會低于38.33美元,有5%的可能性會高于326.44美元。那么你是否愿意冒5%的風險獲得股價低于38.33美元的損失,來追逐股價高于326.44美元的回報收益呢?掃描本文最下方二維碼獲取全部完整源碼和Jupyter Notebook 文件打包下載。
↓↓長按掃碼獲取完整源碼↓↓
總結
以上是生活随笔為你收集整理的yyds!用机器学习预测 bilibili 股价走势的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ssm毕设项目基于微信的的高校起床协会管
- 下一篇: 大佬帮我看看