18910140161

用Python分析股票的收益和风险

顺晟科技

2021-06-16 10:43:29

442

本文将使用Python编程向您展示股票投资回报和风险的基本知识。

一、股票的收益

1.1导入CSV时间序列数据

本文将分析微软2000年以来的股票交易数据(点击我下载),是csv格式的时间序列数据。您将使用熊猫来读取csv数据,并将其存储为DataFrame格式。

#进口熊猫套装

将熊猫作为pd导入

#读取csv文件,将“日期”列解析为日期和时间格式,并将其设置为索引

stock rices=PD . read _ CSV(' MSFTPrices . CSV ',parse _ Date=[' Date '],index_col='Date ')

#按日期对数据进行排序(以确保后续收益率计算的准确性)

股票=股票。排序_值(按='日期')

#打印前5行数据

print(stock rices . head())

开高关低音量调节

日期

2000-01-03 88.777 89.722 84.712 58.28125 53228400 38.527809

2000-01-04 85.893 88.588 84.901 56.31250 54119000 37.226345

2000-01-05 84.050 88.021 82.726 56.90625 64059600 37.618851

2000-01-06 84.853 86.130 81.970 55.00000 54976600 36.358688

2000-01-07 82.159 84.901 81.166 55.71875 62013600 36.833828

股票数据包括交易日、开盘价、更高价、更低价、收盘价、调整收盘价和成交量。其中,调整后的收盘价最为重要,它规范了股权分置、分红等公司行为,能够真实反映股票随时间的回报。因此,本文的后续计算基于调整后的收盘价。

1.2计算产量

计算产量的公式如下:

可以理解为两天的差价除以前的价格。在熊猫中。pct_change()方法用于计算回报率。

#添加一列“退货”来存储每日退货率

库存价格['退货']=库存价格['调整']。pct_change()

#检查前5行数据

print(stock rices . head())

开盘高收盘低成交量调整收益

日期

2000-01-03 88.777 89.722 84.712 58.28125 53228400 38.527809 NAn

2000-01-04 85.893 88.588 84.901 56.31250 54119000 37.226345 -0.033780

2000-01-05 84.050 88.021 82.726 56.90625 64059600 37.618851 0.010544

2000-01-06 84.853 86.130 81.970 55.00000 54976600 36.358688 -0.033498

2000-01-07 82.159 84.901 81.166 55.71875 62013600 36.833828 0.013068

数据框增加了一列收益,即股票的收益。请注意,天的收益率是缺失值NaN,因为没有前的数据进行计算。

为了方便后续的计算,我们选择了列Returns,丢弃丢失的值,并将它们存储在新的变量clean_returns中。使用。dropna()方法删除缺少的值。

clean _ Returns=stock rices[' Returns ']。dropna()

画一张日收入随时间变化的图表。

#导入matplotlib绘图包中的pyplot模块

将matplotlib.pyplot导入为plt

#绘图

clean_returns.plot()

plt.show()

1.3收入的平均值

均值是最常用的统计量,它对一系列数据进行平均,并将其浓缩为一个数值,但它也丢失了数据波动性的信息。

numpy包中的mean()函数可以用来计算历史股票收益的平均值。

#导入numpy包

将numpy导入为np

#计算股票的日平均收益

mean _ return _ daily=NP . mean(clean _ returns)

打印('平均日收入:',mean_return_daily)

平均日收入:0.507807777787

通过以下公式,将日收益率换算成年化收益率(一般假设一年有252个交易日),其中日平均收益率为。

#计算年平均收入

mean _ return _ annualized=((1 mean _ return _ daily)* * 252)-1

打印('平均年化收入:',mean _ return _ normalized)

平均年化回报率:0.57981.777777777955

1.4收入分配

画收入直方图了解其分布,同时观察收入的异常值。一般收入分配两边都有两条长尾巴,投资时一般避开左尾巴的异常值,因为代表的是较大的损失;分布在右尾的离群值通常是好事,代表着更大的利润。

使用matplotlib绘图包中的hist()函数绘制直方图。

#绘制直方图

plt.hist(clean_returns,bins=75)

plt.show()

上图所示的收入是怎样的分配?是正态分布吗?我们稍后会揭晓答案。

第二,风险的度量

金融市场的风险是一种不确定性的度量,体现在收益的波动上。一般可以用以下统计数字表示:

方差或标准差

歪斜

峭度

接下来,我们将逐一计算它们。

2.1差异

方差是数据离散程度的度量。下图中,蓝色分布的方差远大于红色分布的方差,其数据更加分散。

图片来源:https://en.wikipedia.org/wiki/Standard_deviation

标准差,也称为均方差,是方差的算术平方根。投资收益标准差越高,风险越大,因为数据分布离均值越远,收益波动范围越大。

numpy包中的std()函数可以用来计算标准差,方差就是标准差的平方。

#计算标准偏差

sigma _ daily=NP . STD(clean _ returns)

打印('标准差: ',sigma_daily)

#计算差异

方差_每日=sigma _每日** 2

打印('差异: ',差异_每日)

标准差???????????

论可变性18860 . 888888888686

以上计算是日方差,可以换算成人方差。标准差乘以交易天数的平方根,得到年化标准差。年化方差是通过将年化标准差平方得到的。

#计算年化标准差

sigma _ annualized=sigma _ daily * NP . sqrt(252)

打印('年化标准差:',sigma _年化)

#计算年化方差

方差_年化=sigma _年化** 2

打印('年化方差:',方差_年化)

年化标准差:0.30000.300000000005

年化方差:0.57981.979797999995

2.2偏斜度

偏斜度是数据分布偏斜的方向和程度的度量,反映了分布的不对称性。

下面显示的曲线分别代表负偏差和正偏差。在金融领域,人们往往更有偏见,因为这意味着高利润的概率更大。

图片来源:https://en.wikipedia.org/wiki/Skewness

您可以使用scipy.stats提供的skew()函数来计算收入分配的偏斜度。

#从scipy.stats导入偏斜函数

从scipy.stats导入偏斜

#计算收入分配的偏斜度

returns _ skew ness=skew(clean _ returns)

Print('偏斜度:',返回_偏斜度)

偏斜度:0.57999999991

回头看之前画的收入分布图,乍一看似乎是对称分布,但经过偏度计算,我们知道它有轻微的正偏度。

2.3峰度

峰度代表概率密度分布曲线峰值在平均值处的特征数,反映了峰值的锐度。一般将样本的峰度与正态分布进行比较。因为正态分布的峰度为3,超过3的部分称为超额峰度。大多数财务回报都有正值峰值。

kurtosis.png

使用scipy.stats提供的峰度()函数计算分布的峰度值。

#从scipy.stats导入峰度函数

来自scipy.stats导入峰度

#计算收入分布的峰度值

超额峰度=峰度(clean_returns)

打印('增值峰度:',超额_峰度)

#计算峰度

第四矩=超额峰度3

打印('峰度:',第四时刻)

剩余峰度:49080 . 98999999999

峰度:47981.97977797999

上述峰度的计算结果表明,股票收益的峰值远高于正态分布。从下图概率密度分布的对比中也可以看出,橙色代表收入的分布,蓝色代表正态分布。

#模拟正态分布数据,其均值和标准差与本文股票收益率相同。

mu=均值_返回_每日

sigma=sigma_daily

norm=np.random.normal(mu,sigma,size=10000)

#画正态分布的概率密度分布图

plt。hist(norm,bins=100,=0.8,密度=真,标签='正态分布')

#画收入的概率密度分布图

plt.hist(clean_returns,bins=75,alpha=0.7,density=True,label='Returns ')

#添加图例描述

plt.legend()

#绘图

plt.show()

三、收入分配的正态性检验

现在让我们回到部分末尾提出的问题:

我们知道正态分布是对称的,其偏度为0,而股票收益的正偏度为0.219。正态分布的峰度为3,股票收益的峰度高达13.31。从这两个统计数据可以看出,股票收益率不是正态分布的,略微向右倾斜,有一个尖峰。

但这能让我们自信地得出结论吗?为了判断股票收益率分布的正态性,我们需要使用真实的统计检验方法,而不是简单地检查峰度或偏度。

在这里,由scipy.stats提供的shapiro()函数被夏皮罗-维尔克用来测试股票收益的分布。该函数有两个返回值,一个是t检验统计量,另一个是p值。现在你不需要知道什么是夏皮罗-维尔克检验,只需要知道如何用P值来判断数据的正态性:如果P值小于等于0.05,那么拒绝正态性假设,得出数据不是正态分布的结论。

#从scipy.stats导入shapiro

来自scipy.stats import shapiro

#夏皮罗-维尔克股票收益测试

Shapiro _ results=Shapiro(clean _ returns)

打印('夏皮罗-维尔克测试结果: ',夏皮罗_结果)

#提取p值

p_value=shapiro_results[1]

打印(' P值: ',p_value)

夏皮罗-维尔克测试结果: (0.900332072220,0.0)

p值: 0.0

计算出的P值很小,目前精度等于0,可以肯定地说,收入分布不是正态分布。

总结

本文用Python计算股票的收益和风险。我们先看股票的收益及其分布,然后计算指示风险的统计量:方差、偏度、峰度,最后检验收益分布的正态性。

此外,我们还学习了以下统计函数:

将numpy导入为np

np.mean()的平均值#

Np.std() #标准偏差

来自scipy.stats import skew,峰度,shapiro

偏斜()#偏斜度

峰度()#增值峰度

夏皮罗()#夏皮罗-维尔克正态性检验

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航