yyds!用机器学习预测 bilibili 股价走势
Python中文社区
共 6806字,需浏览 14分钟
·
2021-08-21 10:27
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
pd.to_datetime
将数据集时间转化为时间序列,便于股票的分析。BILI = data.DataReader('BILI', 'yahoo',start='29/3/2018',)
BILI.index=pd.to_datetime(BILI.index)
head()
方法看一下数据集的结构,数据集包含了股票的开盘价、收盘价、每日最低价与最高价、交易量等信息。扫描本文最下方二维码获取全部完整源码和Jupyter Notebook 文件打包下载。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])
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')
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%
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()
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()
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
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()
↓↓长按扫码获取完整源码↓↓
评论