首先要做的就是学习如何获取数据、保存数据、读取数据。
1、数据的获取
数据的获取是不是要用到爬虫啊,可是我不会怎么办?
其实告诉大家一个简单的方法就是使用Python的tushare包,虽然从这个包中获取的数据可能并不完全满足我们的需要,但是对于做一些简单的分析已经足够了。
打开Anaconda Prompt,然后输入conda list看一看这个包有没有安装,如果没有安装,我们可以在这个界面输入pip install tushare直接安装这个包。
我们以获取“000001”(平安银行)为例:
因为我们后续内容还要用到NumPy包,所以首先导入Tushar包和NumPy。
我们使用tushare的get_hist_data( )函数进行获取,并查看数据的前五行。
有点遗憾的是,通过这种方法只能获取最近3年的数据,如果要是做简单的分析是足够了。接下来把数据保存为“csv”格式
如何读取呢? 此时就需要Numpy 的loadtxt( )函数。
比如我们要读取这只股票的收盘价和成交量。
解释一下参数的含义:
(1)首先是stock_data.csv,这个是文件名,因为我使用的是notebo,当我 们保存数据时,就直接保存到了home中,我可以直接调取,如果使用 ipython需要输入文件的地址,这一点要注意。
(2)第二个参数我们设置分隔delimiter=‘,’,(采用什么符号来分割列)默认情况下是空格来分割,一般我们常用英文逗号作为分隔符。
(3)第三个参数代表使用的列,注意列的索引是从0开始的哦,第四个参 数unpack=True表示我们允许分拆保存不同的列,比如我们单独把收盘价 赋值给c,成交量赋值给v,如果是False则不可以。
(4)最后一个参数是skiprows=1代表跳过头行,如果不设置的话,会出现错 误,说不能将第一行的字符串转为浮点数。
2、计算股票成交量加权平均价格
VWAP(成交量加权平均价格)是一个非常重要的经济学量。它代表着金融资产的“平均价格”,某个价格的成交量越高,该价格所占的权重也就越大,VWAP常用语算法交易。
很简单吧,我们也可以计算某一个区间的VWAP,区别只是c和v要选取到某个时间区间。
我们使用了average函数,average函数有四个参数,分别是a、axis、weights、returned。
第一个参数:a,就是要根据权重计算的那一列或者一行数据。
第二个参数:axis代表轴,也就是方向,默认是按照纵向,如果axis= 1则会按照横向计算。举个例子
我们是按照横向来计算加权平均值,如果去掉axis参数,则会报错,因为纵向有3个数据,而权重只有两个,所以会显示无法匹配。
第三个参数weights代表权重,第四个参数returned,默认的情况下是False。此时只显示算出来的加权平均值,如果设置returned=True则会返回一个元组,这个元组第一部分是求出的平均值,第二部分是权重的和。看下面例子
一般returned参数并不常用。针对axis在numpy中的应用,后面内容中我会专门作出介绍~~
3、计算收盘价的算数平均值
4、时间加权平均价格
在经济学中。TWAP(时间加权平均价格)是另外一种“平均”价格的指标,前面我们已经计算VWAP。时间加权平均价格只是一个变种,基本的思想就是最近的价格重要性大一些,所以我们应该对近期的价格给以较高的权重。最简单的方法就是用arange函数创建一个从0 开始一次增涨的自然数序列,个数也就是收盘价的个数,虽然这并不是最合适的做法,我们只是为了说明计算时间加权平均价格这个问题。
5、收盘价最大值、最小值和中位数
注意:在计算中位数的时候,如果数据个数是奇数的,那么返回的就是中间值,如果是偶数,则会返回中间两个值的平均数。
ptp函数可以计算数组的取值范围,它也有一个参数axis,默认是axis=0,是按照纵向计算,如果axis=1,则按照横向计算。
6、股票收益率
我们通常很关注股票的收益率,这个收益率包括简单收益率和对数收益率。简单收益率是指相邻两个价格之间的变化率,而对数收益率是所有价格取对数后两两之间的差值。
(1) 计算简单收益率。
我们可以使用diff函数计算相邻数组元素的差值,构成一个数组,然后用这个数组除以前一天的价格。这里千万要注意,因为diff计算出来的是后一日减去前一日的差值,因此返回的数组中,元素个数会比收盘价少一个。在选择除数的时候,我们也要注意,不能将收盘价的最后一个元素作为除数。
我们也可以利用之前学过的map函数计算收益率大于0 的天数。
我们同样可以计算这只股票收益率的标准差,看看投资风险的大小。
(2)计算对数收益率
因为对数收益率是相邻价格对数的差值。
我们发现对数收益率大于0 的天数和简单收益率大于0的天数一致。
(3)波动率
在投资学中,波动率是对价格变动的一种度量,就是历史波动率(比如年波动率或者月波动率)需要用到对数收益率。年波动率等于对数收益率的标准差除以其均值,再除以交易日倒数的平方根,我们来计算一下,最近一年的年波动率,通常交易日取252天。
7、日期分析
如果对于这只股票我们想知道,在这一周的交易日里,哪一天的平均收盘价最 高,哪一天的最低,应该怎么办?我们来分析一下:
首先要思考一个问题,就是我们的数据中的日期,如果单看日期我不知道这一天是星期几,不利于分析。如果有一种方法,能把这种日期转换成我们所熟悉的用数字代替,比如0(星期一)、1(星期二)等等就好了,其实是有的。
这时候我们就要定义一个转换函数:
这个函数是怎么作用的呢?
首先它会将我们传入的比如“2018-01-14”转换成numpy可以识别的datetime对象,然后将datetime对象,调用weekday方法,就可以转换成0-6之间的整数了。
那是不是说在读取数据的时候就可以把这个函数作为loadtxt的参数塞进去呢?
这是不可以的,这里要运用一个桥梁,这个桥梁就是loadtxt中的参数converters参数,converters参数后跟一个字典,键就是日期对应的列的索引值,值就是我们刚才定义的datesnum函数。下面就可以读取数据了,我们需要获得日期和收盘价:
我们可以看到dates转换成了整数,并且没有5和6,因为星期六和星期日不是交易日。
我们的目的就是查看,就是要查看一周5个交易日的平均收盘价,所以我们要创建一个含有5个元素的数组,并且把初始值设置为0。我们用这个数组来存储每个工作日的平均收盘价。
接下来要做的工作就是找出每个工作日的收盘价了,比如对应于星期一的全部收盘价。
我们知道close和dates是一一对应的,如果我知道dates中某个元素的索引值,我就可以找到与这个元素相对应的close值,因为两者的索引肯定一样。
先介绍两个函数,where函数会根据指定的条件返回所有满足条件元素的索引值,比如我要找dates为1,也就是星期2的全部索引值,就可以使用where函数,take函数可以根据这些索引值从另外一个数组中抽取与相对应的值。
所以我们要写一个for循环,然后遍历0到4,用where函数获取相应的索引值,用take函数获取相应的收盘价:
我们还可以计算那个工作日的平均收盘价最高,那个工作日最低。
argmax和argmin两个函数分别表示返回数组中最大值的索引值和最小值的索引值。我们可以看到这一周5个交易日,星期二的平均收盘价较高,星期五的平均收盘价最低。
其实我们计算这些数据暂时纯属娱乐,或者熟悉一下NumPy中常用的函数,或许可能会发现一些有用的东西,但是随着学习慢慢的深入,肯会发觉一些真正有用的东西或者知识。
8. 真实波动幅度均值(ATR)
这个指标是用来衡量股价波动性的技术指标。在《海龟交易法则》这本书中提到用这个指标进行仓位管理。今天就来科普一下这个指标到底是什么~~
(这些资料也是我自己从书中和网上看到的,并非自己原创)
(1)什么是ATR
ATR不属于趋势或者震荡类的指标,它是表示市场的波动幅度,它也可以对目前货币的动能有所提示,用来衡量货币波动幅度,在海龟交易中广泛使用。
(2)指标特点
市场是在波动中发展的,但是每个时期的波幅都不会保持一致,当一波趋势确立,市场上投资者的情绪反应也会变得强烈起来,波动幅度也会增加,而当市场方面不明确,或者市场处于明显的观望和等待情绪的时候,又或者在盘整时期,价格的波动幅度会变得较小,而ATR指标则是能够直接反映出这样的波幅变化。
(3) ATR的计算方式
相对于均线来说,ATR的计算稍显复杂,需要用三个步骤来计算,具体如下:
1, 当前K线的最高价与最低价之间的幅度(h-l)
2, 当日最高价与前一日收盘价之差。(h-preclose)
3, 前一根K线的收盘价与当前K线最低价之间的幅度(preclose-l)
三个幅度之中的最大值为真实波动幅度,通过计算一段时间的真实波动幅度,就可以用取平均值的方法获得平均真实波动幅度,即ATR。
(4) Python计算ATR
那使用多少天来计算呢? 根据使用者的习惯不同,10天、20天乃至65天都有,常用的使用最近20天的数据来计算。一般的行情软件都内置有ATR指标,设置好日期段就可以得到数值。
现在使用Python计算一下平安银行最近20天(数据只到18年1月10日)的ATR。
首先要导入numpy包
读取最高价、收盘价和最低价数据
读取最高价、收盘价和最低价数据
取最近20天的数据,注意取收盘价数据时,用到的是前一天的收盘价,因此我们要把数据往前调整一天。
根据前面ATR的计算公式,求出h-l,h-preclose, preclose-l,并个序列中的各个元素的最大值。什么意思呢?三个序列,先比较第一个元素,谁最大取谁,然后在比较第二个元素,依次类推。这一步要使用Python的maximum函数。
他和max的区别就是,max仅能取一个数组中的最大值。
求出真实波动幅度的均值
可看到平安银行最近20天的ATR为0.4139。
(5)如何使用指标
根据书中和网上的资料大概有以下几种用法:
一是计算首笔仓位规模
比如你想在1月10日看到平安银行的收盘价为13.04元,认为若能够向上突破13.5就是一个很好的买入点,假如手上有10万资金,那么你应该在股价突破13.5元时买入多少手呢?
在《海龟交易法则》中建议第一笔仓位应该是一个ATR的波动与总资金的1%的波动相对应,什么意思呢?
现在你手中有10万元钱,1%的波动就是1000元,截止到2018年1月10日,平安银行的20日ATR为0.414,应该买多少股呢?1000/0.414=2415.45,取整数就是2400股,也就是说你应该在股价突破13.5的时候立刻买入2400股,花费32400元。此时在你入市的同时,你应该为这个仓位设置好止损,书中介绍很多海龟采用2ATR作为止损点,什么意思呢?就是说当前的ATR为0.414,当股价突破13.5元建完仓后,如果股价跌破13.5-2*0.414=12.672元时就该平仓止损了。止损时如果不计算交易成本的话,亏损1987.2元,占仓位资金的6.13%,占总资金的2%左右,这就意味着,若你看错市场走势,那么连错5次,总损失也不过10%。
二是加仓并提高止损
如果在股价涨到13.5元买入后继续加仓的话,那么同样利用ATR进行加仓,《海龟交易法则》中建议每上涨0.5ATR就加仓一次,也就是说在股价突破13.707元、13.914元、14.121元时在分别买入2400股,直到用完10万元为止。与此同时每个新加的仓位都应该设置相应的新价位之下2ATR的地方。整个仓位管理的最精华处,就是移动止损的设置。
如果有条件可以读一下《仓位管理:让你活得更久》和《海龟交易法则》中关于如何使用ATR进行资金的管理相关内容。