赞
踩
1.理解python语言中numpy库的各函数作用;
2.掌握numpy库中常用函数,能够用其解决实际问题;
用numpy库中函数完成对股价统计分析的实现,内容包括但不限于:
(1)构造CSV数据
(2)读取数据
(3)计算成交量加权平均价格
(4)计算股票最高价(所有最高价中的最大值)、最低价(所有最高价中的最小值)、极差
(5)计算收盘价中位数、方差
(6)计算股票收益率、年波动率、月波动率
其中,年波动率等于对数收益率的标准差除以其均值,再乘以交易日的平方根,通常交易日取252天。月波动率等于对数收益率的标准差除以其均值,再乘以交易月的平方根,通常交易月取12月。
可能会用到的numpy库中的函数:loadtxt、average、ptp、median、var、max、min、diff、log、std、mean、sqrt
构造数据案例(也可自行设计):其中,第4-8列,即EXCEL表格中的D-H列,分别为股票的开盘价,最高价,最低价,收盘价,成交量。
with open(“./data/stock_data.csv”, “w”) as fdata:
fdata.write(“”“AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800
AAPL,31-01-2011, ,335.8,340.04,334.3,339.32,13473000
AAPL,01-02-2011, ,341.3,345.65,340.98,345.03,15236800
AAPL,02-02-2011, ,344.45,345.25,343.55,344.32,9242600
AAPL,03-02-2011, ,343.8,344.24,338.55,343.44,14064100
AAPL,04-02-2011, ,343.61,346.7,343.51,346.5,11494200
AAPL,07-02-2011, ,347.89,353.25,347.64,351.88,17322100
AAPL,08-02-2011, ,353.68,355.52,352.15,355.2,13608500
AAPL,09-02-2011, ,355.19,359,354.87,358.16,17240800
AAPL,10-02-2011, ,357.39,360,348,354.54,33162400
AAPL,11-02-2011, ,354.75,357.8,353.54,356.85,13127500
AAPL,14-02-2011, ,356.79,359.48,356.71,359.18,11086200
AAPL,15-02-2011, ,359.19,359.97,357.55,359.9,10149000
AAPL,16-02-2011, ,360.8,364.9,360.5,363.13,17184100
AAPL,17-02-2011, ,357.1,360.27,356.52,358.3,18949000
AAPL,18-02-2011, ,358.21,359.5,349.52,350.56,29144500
AAPL,22-02-2011, ,342.05,345.4,337.72,338.61,31162200
AAPL,23-02-2011, ,338.77,344.64,338.61,342.62,23994700
AAPL,24-02-2011, ,344.02,345.15,338.37,342.88,17853500
AAPL,25-02-2011, ,345.29,348.43,344.8,348.16,13572000
AAPL,28-02-2011, ,351.21,355.05,351.12,353.21,14395400
AAPL,01-03-2011, ,355.47,355.72,347.68,349.31,16290300
AAPL,02-03-2011, ,349.96,354.35,348.4,352.12,21521000
AAPL,03-03-2011, ,357.2,359.79,355.92,359.56,17885200
AAPL,04-03-2011, ,360.07,360.29,357.75,360,16188000
AAPL,07-03-2011, ,361.11,361.67,351.31,355.36,19504300
AAPL,08-03-2011, ,354.91,357.4,352.25,355.76,12718000
AAPL,09-03-2011, ,354.69,354.76,350.6,352.47,16192700
AAPL,10-03-2011, ,349.69,349.77,344.9,346.67,18138800
AAPL,11-03-2011, ,345.4,352.32,345,351.99,16824200
“””)
根据该问题的描述和分析,自行完成程序设计并实现,要求算法描述准确且程序运行正确。
第一步,详细阅读实验要求,根据求取问题的不同,明确概念以及所需的函数。
加权平均值即将各数值乘以相应的权数,然后加总求和得到总体值,再除以总的单位数(即权重之和)。
简单收益率:是指相邻两个价格之间的变化率。
对数收益率:是指所有价格取对数后两两之间的差值。
第二步,具体了解所需函数的用法,参数、返回值等。具体如下:
loadtxt:数据的获取。fname:被读取的文件名(文件的相对地址或者绝对地址),delimiter(指定读取文件中数据的分隔符),usecols(指定需要读取的列),unpack(选择是否将数据进行向量输出)。
本实验文件保存路径为"./data/stock_data.csv",数据集以“,”将数据隔开,需要使用到的数据在数据集的4—7列(以0开始标记列数),将每列数据存储到对应的变量中,以high_price(最高价), low_price(最低价),end_price(收盘价), turnover(成交量)命名。
average:np.average(a,weights)计算平均值。参数a为要平均的数据的数组,为end_price,weights:数组,与a中的值关联的权重数组turnover。
ptp:numpy.ptp(a)或者a.ptp()求极值,最大值-最小值。a为输入值,为high_price。
median:median(a),a为输入值,为end_price。
var:np.var(a),a 包含需要方差的数字的数组,求end_price数组的方差。
max:np.max(a)或a.max(),a包含需要求最大值的数组,返回high_price的最大值。
min:np.min(a)或a.min(),a包含需要求最小值的数组,返回high_price的最小值。
diff:函数可以返回一个由相邻数组元素的差值构成的数组。不过需要注意的是,diff返回的数组比收盘价数组少一个元素。
log:计算给定数组中每个元素的自然对数。计算对数收益率时需计算end_price的对数。
std:np.std(a),a表示要计算标准差的数组。计算年波动率、月波动率的时需用到对数收益率的标准差,所以a为log_returns(求取对数收益率的结果存储在log_returns)。
mean:np.mean(a),求取数组a的均值。计算年波动率、月波动率的时需除以对数收益率的均值,所以a为log_returns。
sqrt:np.sqrt(a),求取数组a的平方。计算年波动率、月波动率的时需乘以以交易日(252)、交易月的平方根(12)。
第三步,根据以上函数完成代码,并运行得出结果。
构造CSV数据,将数据保存在本地data文件夹中,命名为stock_data.csv,上图可看到数据集的具体内容,其中本文用到的数据为第5-8列,分别对应股票的最高价,最低价,收盘价,成交量。
运行实验代码后,依次得出结果,包括收盘价的平均价格,成交量加权的平均价格,最高价中的最大值,最高价的最小值,最高价的极值,最低价的极值,收盘价的中位数、方差。收盘价的简单收益率,对数收益率(得到是一个数组形式),年波动率、月波动率。
在完成实验的基础上,下载一个731条股票数据的数据集,从左到右所展示列,分别为日期、开盘价、最高价、最低价、收盘价、成交量。
对数据集完成实验中的相关操作,得到的运行结果如上图,由于数据量过大,简单收益率和对数收益率进行部分展示。
1.实验过程中遇到的问题及解决办法;
对实验中所使用的部分函数,缺少相关训练,不明白其中的参数意义,返回数据类型,进行相关的查询学习,并进行实践。
读取数据时,需要将一列数据存储到一个变量中。
2.对设计进行评价(优点与不足);
优点:代码简洁易懂,使用输出语句对输出结果进行说明。
不足:对于某些结果,可以尝试使用多种方式来计算。
3.对设计及调试过程的心得体会;
这段时间通过对numpy库的学习,掌握了基本的函数使用方法,同时我发现通过调用函数可以将复杂的公式简单化,快速完成大量计算。其次我发现学习一门语言时,仅仅通过理论的学习是远远不够的,还必须经过大量的实践,才能更好地掌握。
4.思考对原实验方案的改进,写出改进思路。
本实验利用股票数据集,对numpy库中的一些简单函数进行练习,除此之外,还可以进行更多的函数的练习,比如说求取绝对值、指数值、模运算。
import numpy as np # (1)构造CSV数据 with open("./data/stock_data.csv", "w") as fdata: fdata.write("""AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800 AAPL,31-01-2011, ,335.8,340.04,334.3,339.32,13473000 AAPL,01-02-2011, ,341.3,345.65,340.98,345.03,15236800 AAPL,02-02-2011, ,344.45,345.25,343.55,344.32,9242600 AAPL,03-02-2011, ,343.8,344.24,338.55,343.44,14064100 AAPL,04-02-2011, ,343.61,346.7,343.51,346.5,11494200 AAPL,07-02-2011, ,347.89,353.25,347.64,351.88,17322100 AAPL,08-02-2011, ,353.68,355.52,352.15,355.2,13608500 AAPL,09-02-2011, ,355.19,359,354.87,358.16,17240800 AAPL,10-02-2011, ,357.39,360,348,354.54,33162400 AAPL,11-02-2011, ,354.75,357.8,353.54,356.85,13127500 AAPL,14-02-2011, ,356.79,359.48,356.71,359.18,11086200 AAPL,15-02-2011, ,359.19,359.97,357.55,359.9,10149000 AAPL,16-02-2011, ,360.8,364.9,360.5,363.13,17184100 AAPL,17-02-2011, ,357.1,360.27,356.52,358.3,18949000 AAPL,18-02-2011, ,358.21,359.5,349.52,350.56,29144500 AAPL,22-02-2011, ,342.05,345.4,337.72,338.61,31162200 AAPL,23-02-2011, ,338.77,344.64,338.61,342.62,23994700 AAPL,24-02-2011, ,344.02,345.15,338.37,342.88,17853500 AAPL,25-02-2011, ,345.29,348.43,344.8,348.16,13572000 AAPL,28-02-2011, ,351.21,355.05,351.12,353.21,14395400 AAPL,01-03-2011, ,355.47,355.72,347.68,349.31,16290300 AAPL,02-03-2011, ,349.96,354.35,348.4,352.12,21521000 AAPL,03-03-2011, ,357.2,359.79,355.92,359.56,17885200 AAPL,04-03-2011, ,360.07,360.29,357.75,360,16188000 AAPL,07-03-2011, ,361.11,361.67,351.31,355.36,19504300 AAPL,08-03-2011, ,354.91,357.4,352.25,355.76,12718000 AAPL,09-03-2011, ,354.69,354.76,350.6,352.47,16192700 AAPL,10-03-2011, ,349.69,349.77,344.9,346.67,18138800 AAPL,11-03-2011, ,345.4,352.32,345,351.99,16824200 """) # (2)读取数据 # 读取数据集中的最高价、最低价、收盘价、成交量 high_price, low_price,end_price, turnover = np.loadtxt( fname="./data/stock_data.csv", #文件名 delimiter=',', #分隔符 usecols=(4,5,6,7), #读取的列数,数据类型为元组tuple,其中元素个数有多少个,则选出多少列 unpack=True #是否解包,类型为布尔型 ) # (3)计算成交量加权平均价格 print("平均价格 =",np.average(end_price)) #输出收盘价的平均价格 print("成交量加权平均价格 =",np.average(end_price, weights=turnover)) #输出成交量加权平均价格,权重为成交量 # (4)计算股票最高价(所有最高价中的最大值)、最低价(所有最高价中的最小值)、极差 print("最高价 =", high_price.max()) #max函数 求最大值 print("最低价 =", low_price.min()) #min函数 求最小值 print("最高价极差 =", high_price.ptp()) #ptp函数 求极差 print("最低价极差 =", low_price.ptp()) # (5)计算收盘价中位数、方差 print("中位数 =", np.median(end_price)) #median 求中位数 print("方差 =", np.var(end_price)) #var 求方差 #print("variance =", end_price.var()) # (6)计算股票收益率、年波动率、月波动率 returns = np.diff(end_price) #计算简单收益率 log_returns = np.diff(np.log(end_price)) #计算对数收益率 # 年波动率等于对数收益率的标准差除以其均值,再乘以交易日的平方根,通常交易日取252天。 annual_volatility = log_returns.std() / log_returns.mean() * np.sqrt(252) # 月波动率等于对数收益率的标准差除以其均值,再乘以交易月的平方根,通常交易月取12月。 monthly_volatility = log_returns.std() / log_returns.mean() * np.sqrt(12) print("简单收益率", returns) print("对数收益率", log_returns) print("年波动率", annual_volatility) print("月波动率", monthly_volatility)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。