股票价格会经历周期性的下跌和上涨。我们将观察股价收益率的概率分布。
首先需要下载某只股票(例如AAPL)的历史数据,然后计算其收盘价的日收益率( http://en.wikipedia.org/wiki/Rate_of_return)。因为在之前的攻略中已详细介绍,所以这里省略了相关的步骤。
准备工作
如有必要,请先安装Matplotlib和SciPy。
具体步骤
有趣的部分来了!
- 计算突破和回调位置。
假设我们想每年交易五次,即大约每50天交易一次。一种策略是在股价回调的时候(下跌一定的百分比时)买入,在股价突破的时候(上涨一定的百分比时)卖出。
根据我们选定的交易频率设置适当的百分位数,换算出与之匹配的收益率。使用SciPy中的scoreatpercentile
函数,具体实现如下。
freq = 1/float(sys.argv[2])
breakout = scipy.stats.scoreatpercentile
(logreturns, 100 * (1 - freq) )
pullback = scipy.stats.scoreatpercentile
(logreturns, 100 * freq)
- 生成买入点和卖出点。
使用NumPy的compress
函数,利用收盘价数据生成买入点和卖出点。该函数依据给定条件确定索引位置并返回这些索引对应的数组元素。
buys = numpy.compress
(logreturns < pullback, close)
sells = numpy.compress
(logreturns > breakout, close)
print buys
print sells
print len(buys), len(sells)
print sells.sum() - buys.sum()
也许是出于简化代码的考虑,这段代码不能保证卖出点一定会晚于买入点。
如果选择AAPL(苹果公司),交易周期设定为50天,输出如下。
[ 340.1 377.35 378. 373.17 415.99]
[ 357. 370.8 366.48 395.2 419.55]
5 5
24.42
可见,如果我们买卖AAPL股票五次,将获得24美元的收益。
- 绘制收益率直方图。
使用Matplotlib,为收益率数据绘制直方图。
matplotlib.pyplot.hist(logreturns)
matplotlib.pyplot.show()
得到如下的直方图。
本攻略的完整代码如下。
from matplotlib.finance import quotes_historical_yahoo
from datetime import date
import numpy
import sys
import scipy.stats
import matplotlib.pyplot
#1. 获取收盘价数据
today = date.today()
start = (today.year - 1, today.month, today.day)
quotes = quotes_historical_yahoo(sys.argv[1], start, today)
close = numpy.array([q[4] for q in quotes])
#2. 获取收益率数据
logreturns = numpy.diff(numpy.log(close))
#3. 计算突破和回调位置
freq = 1/float(sys.argv[2])
breakout = scipy.stats.scoreatpercentile(logreturns, 100 * (1 - freq) )
pullback = scipy.stats.scoreatpercentile(logreturns, 100 * freq)
#4. 生成买入点和卖出点
buys = numpy.compress(logreturns < pullback, close)
sells = numpy.compress(logreturns > breakout, close)
print buys
print sells
print len(buys), len(sells)
print sells.sum() - buys.sum()
#5. 绘制收益率直方图
matplotlib.pyplot.hist(logreturns)
matplotlib.pyplot.show()
#AAPL 50
#[ 340.1 377.35 378. 373.17 415.99]
#[ 357. 370.8 366.48 395.2 419.55]
#5 5
#24.42
小结
compress
函数返回一个数组,其中包含了输入数组中满足指定条件的元素。输入数组的内容保持不变。