赵走x博客
首页
书籍
软件
工具
古诗词
搜索
登录
29、布林带
28、指数移动平均线
27、简单移动平均线
26、真实波动幅度均值(ATR)
25、周汇总
24、日期分析
23、股票收益率
22、统计分析
21、取值范围:找到最大值和最小值
20、成交量加权平均价格(VWAP)
19、CSV 文件
18、文件读写
17、动手实践:数组的转换
16、数组的属性
15、数组的分割
14、数组的组合
13、动手实践:改变数组的维度
12、动手实践:多维数组的切片和索引
11、一维数组的索引和切片
10、动手实践:创建自定义数据类型
9、dtype 类的属性
8、自定义数据类型
7、字符编码
6、数据类型对象
5、NumPy 数据类型
4、选取数组元素
3、动手实践:创建多维数组
2、NumPy 数组对象
1、动手实践:向量加法
23、股票收益率
资源编号:76368
人工智能
Numpy学习指南
热度:39
在学术文献中,收盘价的分析常常是基于股票收益率和对数收益率的。简单收益率是指相邻 两个价格之间的变化率,而对数收益率是指所有价格取对数后两两之间的差值。我们在高中学习 过对数的知识,“a”的对数减去“b”的对数就等于“a除以b”的对数。因此,对数收益率也可 以用来衡量价格的变化率。注意,由于收益率是一个比值,例如我们用美元除以美元(也可以是 其他货币单位),因此它是无量纲的。总之,投资者最感兴趣的是收益率的方差或标准差,因为 这代表着投资风险的大小。
在学术文献中,收盘价的分析常常是基于股票收益率和对数收益率的。简单收益率是指相邻 两个价格之间的变化率,而对数收益率是指所有价格取对数后两两之间的差值。我们在高中学习 过对数的知识,“a”的对数减去“b”的对数就等于“a除以b”的对数。因此,对数收益率也可 以用来衡量价格的变化率。注意,由于收益率是一个比值,例如我们用美元除以美元(也可以是 其他货币单位),因此它是无量纲的。总之,投资者最感兴趣的是收益率的方差或标准差,因为 这代表着投资风险的大小。 # 动手实践:分析股票收益率 按照如下步骤分析股票收益率。 ### (1) 首先,我们来计算简单收益率。 NumPy中的diff函数可以返回一个由相邻数组元素的差 值构成的数组。这有点类似于微积分中的微分。为了计算收益率,我们还需要用差值除以前一天 的价格。不过这里要注意,diff返回的数组比收盘价数组少一个元素。经过仔细考虑,我们使 用如下代码,注意,我们没有用收盘价数组中的最后一个值做除数,用std函数计算标准差: ``` import numpy as np c = np.loadtxt('data.csv', delimiter=',', usecols=(6,), unpack=True) print('c=', c) print('*' * 30) print('np.diff(c)=', np.diff(c)) print('*' * 30) returns = np.diff(c) / c[:-1] print('returns=', returns) print('*' * 30) print('3.22/336.1=', 3.22 / 336.1) print('*' * 30) print('Standard deviation =', np.std(returns)) ``` 输出结果如下: ``` c= [336.1 339.32 345.03 344.32 343.44 346.5 351.88 355.2 358.16 354.54 356.85 359.18 359.9 363.13 358.3 350.56 338.61 342.62 342.88 348.16 353.21 349.31 352.12 359.56 360. 355.36 355.76 352.47 346.67 351.99] ****************************** np.diff(c)= [ 3.22 5.71 -0.71 -0.88 3.06 5.38 3.32 2.96 -3.62 2.31 2.33 0.72 3.23 -4.83 -7.74 -11.95 4.01 0.26 5.28 5.05 -3.9 2.81 7.44 0.44 -4.64 0.4 -3.29 -5.8 5.32] ****************************** returns= [ 0.00958048 0.01682777 -0.00205779 -0.00255576 0.00890985 0.0155267 0.00943503 0.00833333 -0.01010721 0.00651548 0.00652935 0.00200457 0.00897472 -0.01330102 -0.02160201 -0.03408832 0.01184253 0.00075886 0.01539897 0.01450483 -0.01104159 0.00804443 0.02112916 0.00122372 -0.01288889 0.00112562 -0.00924781 -0.0164553 0.01534601] ****************************** 3.22/336.1= 0.009580481999404939 ****************************** Standard deviation = 0.012922134436826306 ``` ### (2) 对数收益率计算起来甚至更简单一些。 我们先用log函数得到每一个收盘价的对数,再 对结果使用diff函数即可。 ``` logreturns = np.diff(np.log(c)) print('logreturns = ', logreturns) ``` Out: ``` logreturns = [ 0.00953488 0.01668775 -0.00205991 -0.00255903 0.00887039 0.01540739 0.0093908 0.0082988 -0.01015864 0.00649435 0.00650813 0.00200256 0.00893468 -0.01339027 -0.02183875 -0.03468287 0.01177296 0.00075857 0.01528161 0.01440064 -0.011103 0.00801225 0.02090904 0.00122297 -0.01297267 0.00112499 -0.00929083 -0.01659219 0.01522945] ``` 一般情况下,我们应检查输入数组以确保其不含有零和负数。否则,将得到一个错误提示。 不过在我们的例子中,股价总为正值,所以可以将检查省略掉。 ### (3) 我们很可能对哪些交易日的收益率为正值非常感兴趣。 在完成了前面的步骤之后,我们 只需要用where函数就可以做到这一点。where函数可以根据指定的条件返回所有满足条件的数 组元素的索引值。输入如下代码: ``` posretindices = np.where(returns > 0) print('posretindices = ', posretindices) ``` 即可输出该数组中所有正值元素的索引。 ``` posretindices = (array([ 0, 1, 4, 5, 6, 7, 9, 10, 11, 12, 16, 17, 18, 19, 21, 22, 23, 25, 28]),) ``` # (4) 在投资学中,波动率(volatility)是对价格变动的一种度量。 历史波动率可以根据历史价 格数据计算得出。计算历史波动率(如年波动率或月波动率)时,需要用到对数收益率。年波动 率等于对数收益率的标准差除以其均值,再除以交易日倒数的平方根,通常交易日取252天。我 们用std和mean函数来计算,代码如下所示: ``` annual_volatility = np.std(logreturns) / np.mean(logreturns) annual_volatility = annual_volatility / np.sqrt(1. / 252.) print('annual_volatility = ', annual_volatility) ``` Out: ``` annual_volatility = 129.27478991115132 ``` # (5) 请注意sqrt函数中的除法运算。 在Python中,整数的除法和浮点数的除法运算机制不同, 我们必须使用浮点数才能得到正确的结果。与计算年波动率的方法类似,计算月波动率如下: ``` print('Month volatility:', annual_volatility * np.sqrt(1. / 12.)) ``` Out: ``` Month volatility: 37.318417377317765 ``` # 刚才做了些什么 我们用计算数组相邻元素差值的diff函数计算了简单收益率,用计算数组元素自然对数的 log函数计算了对数收益率。最后,我们计算了年波动率和月波动率。