摘 要
模型采用了蒙特卡罗模拟法来计算VAR,基于随机过程运算,计算出股票的平均收益率与风险,并且计算出股票相应的99%置信水平下的VAR。选取的对象是美股编号000333,20140101-20181231时期的复权后数据。
关键词:金融数据;VaR;股票风险
1. 引言
目前最为流行的市场风险度量方法是VaR(风险价值)方法,通过预测能够使持有外币资产的金融机构或企业进行有效的风险规避,对VaR的计算和预测实质是对对金融资产波动率的计算和预测。本文的目的就是蒙特卡罗模型引入到股票风险 VaR测算中 ,以提高测算风险率 VaR值的精度。
2. 模型介绍
VaR (风险价值)是一种定量化描述金融机构所面临的风险的方法。VaR值的测算主要取决于两个关键的变量 :即在市场正常波动的条件下,在一定的概率水平α%下,某一金融资产或金融资产组合的VaR是在未来特定一段时间∆t内最大的可能损失。使用蒙特卡罗模拟法进行风险价值估算,即运用历史数据对未来进行多次模拟,以求未来股价结果的概率分布。蒙特卡罗模拟法的公式如下:
其中S为股票的价格,μ为期望收益率,△t为时间间隔,σ为股票风险,ε为随机变量。将S移项可得:
可以看出,蒙特卡罗模拟法认为股票的价格波动可以分为两部分,第一部分为drift,即股票会根据收益率波动,第二部分为shock,即随机波动。如下图1:
图1
3. 实证分析
3.1数据选取
目前各大领域的金融机构及各大企业所持有的股票多样化,股本文取美股的复权数据的股票日收益率作为风险因子,并定义日收益率为:
其中C为投入的本金,V为经过一段时间后的市值。
3.2基本描述收益率
在正式建模分析之前,首先对美股的收益率做描述分析,美股的复权数据的收益率的基本描述如表1所示:
交易日期 |
开盘价 |
收盘价 |
最高价 |
最低价 |
成交量 |
编号 |
收益率 |
2014-01-03 |
11.009 |
10.934 |
11.100 |
10.716 |
75845 |
333 |
-0.017345 |
2014-01-06 |
10.891 |
10.602 |
10.913 |
10.545 |
59925 |
333 |
-0.030364 |
... |
... |
... |
... |
... |
... |
... |
... |
2018-12-27 |
37.910 |
36.800 |
38.060 |
36.800 |
230747 |
333 |
-0.008888 |
2018-12-28 |
36.750 |
36.860 |
37.400 |
36.310 |
211676 |
333 |
0.001630 |
表1美股333的复权权收益率
图2三只股票的走势
000333美股复权数据,399300沪深复权数据集,600000浦发银行复权数据集。
图3股票成交量
图4交易总额
图5股票的收盘价及其移动平均线
图6三只股票大概的相关关系
图7日收益率
图8收益分布图
图9三只股票的累计收益率
从图11中看出,收益率的均值是为正的,股票风险处于0.025以下,在整体的价值上是趋向正值。从下图10可以看出来,股票的收盘价基本都是高于开盘价,所以股票每天的收益基本为正值。
图10
图11
另外在结合图10、11,观察后得到结论美股000333在2014-01-01到2018-12-31期间的收益率趋于正值,保持在稳赚不赔的状态,而且股票的风险低于0.05,得出这张股票是优质股票。
3.3实证结果
图12
定义完蒙特卡罗函数,我们通过模拟100次的投资,得到的结果如图12所示,可以看到,每一次模拟所得到股价走势都是不同的,但是大部分都集中在36-38之间。下面我们用过模拟1000次的投资并计算风险价值。并定义置信水平为99%,绘制股票最终价格的分布图如图13所示。
编辑切换为居中
图13
从图13中我们可以得到,即在99% 的置信水平下,美股000333股票在一年后的价格不会低于34.95,其风险价值为1.91,而其平均价格与其初始价格基本一致。
4. 附录
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False
df = pd.read_csv("./data/000333-20140101-20181231.csv"
, index_col='date')
df.index = pd.to_datetime(df.index)
df['Return'] = df['close'].pct_change(1)
df = df.dropna()
plt.figure(figsize=(16, 6))
df['open'].plot()
df['close'].plot()
plt.legend(['open', 'close'], loc='upper rigth')
plt.savefig('1.png', dpi=300) # 指定分辨率保存
plt.show()
ret_df = pd.concat([df['Return']], axis=1)
ret_df.columns = ['000333']
area = np.pi * 20
plt.scatter(ret_df.mean(), ret_df.std(), alpha=0.5, s=area)
plt.xlabel('Expected returns')
for label, x, y in zip(ret_df.columns, ret_df.mean(), ret_df.std()):
plt.annotate(
label,
xy=(x, y), xytext=(50, 50),
textcoords='offset points', ha='right', va='bottom',
arrowprops=dict(arrowstyle='-', connectionstyle='arc3,rad=-0.3'))
plt.show()
days = 365
dt = 1 / days
mu = ret_df.loc['2014-01-01':'2018-12-31'].mean()['000333']
sigma = ret_df.std()['000333']
def stock_monte_carlo(start_price, days, mu, sigma):
price = np.zeros(days)
price[0] = start_price
shock = np.zeros(days)
drift = np.zeros(days)
for x in range(1, days):
shock[x] = np.random.normal(loc=mu * dt, scale=sigma * np.sqrt(dt))
drift[x] = mu * dt
price[x] = price[x - 1] + (price[x - 1] * (drift[x] + shock[x]))
return price
start_price = df['close'][-1]
for run in range(100):
plt.plot(stock_monte_carlo(start_price, days, mu, sigma))
plt.xlabel("Days")
plt.ylabel("Price")
plt.title('Monte Carlo Analysis for Tesla')
plt.show()
runs = 10000
simulations = np.zeros(runs)
np.set_printoptions(threshold=5)
for run in range(runs):
simulations[run] = stock_monte_carlo(start_price, days, mu, sigma)[days - 1];
q = np.percentile(simulations, 1)
plt.hist(simulations, bins=200)
plt.figtext(0.6, 0.8, s="Start price: $%.2f" % start_price)
plt.figtext(0.6, 0.7, "Mean final price: $%.2f" % simulations.mean())
plt.figtext(0.6, 0.6, "VaR(0.99): $%.2f" % (start_price - q,))
plt.figtext(0.15, 0.6, "q(0.99): $%.2f" % q)
plt.axvline(x=q, linewidth=4, color='r')
plt.title(u"Final price distribution for Tesla Stock after %s days" % days, weight='bold');
plt.show()
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ15101117,本站将立刻清除。