Numpy 定期在低点做交易

股票价格会经历周期性的下跌和上涨。我们将观察股价收益率的概率分布。

首先需要下载某只股票(例如AAPL)的历史数据,然后计算其收盘价的日收益率( http://en.wikipedia.org/wiki/Rate_of_return)。因为在之前的攻略中已详细介绍,所以这里省略了相关的步骤。

准备工作

如有必要,请先安装Matplotlib和SciPy

具体步骤

有趣的部分来了!

  1. 计算突破和回调位置。

假设我们想每年交易五次,即大约每50天交易一次。一种策略是在股价回调的时候(下跌一定的百分比时)买入,在股价突破的时候(上涨一定的百分比时)卖出。
根据我们选定的交易频率设置适当的百分位数,换算出与之匹配的收益率。使用SciPy中的scoreatpercentile函数,具体实现如下。

freq = 1/float(sys.argv[2])
     breakout = scipy.stats.scoreatpercentile 
     (logreturns, 100 * (1 - freq) )
pullback = scipy.stats.scoreatpercentile 
    (logreturns, 100 * freq)

  1. 生成买入点和卖出点。

使用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美元的收益。

  1. 绘制收益率直方图。

使用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函数返回一个数组,其中包含了输入数组中满足指定条件的元素。输入数组的内容保持不变。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程