本质上是一种基于统计与概率的计算机运算策略。通过对历史大量的数据进行不同组合的量化策略运算,寻找投资方向和确定买卖时机。随着大环境的改变,策略必然需要变动调整,但我们不变的目标便是执着地寻找出适合当下获利概率最大所对应的投资策略。
相对强弱指数(Relative Strength Index,RSI)
RSI从本质上来讲,是根据一段时间内的价格涨跌情况来反映市场的多空程度。其通过计算,得出一个0-100之间的数值代表当天的RSI,一般来说超过50为多头行情,而小于50可认为是空头行情。实际运用中,投资者更多的会根据RSI是否捅破某个其所认为的阈值或者其曲率变化来判断是否出现了超卖超买市场,从而实施自己的投资行为。
这里我们需要处理股票的历史数据,所以可以先下载到本地,方法可以参考前面所写的博文获取全球各大证券交易所的全部股票交易信息。为了更方便地使用数据,我们可以先设置几个函数,如下:
import numpy as np
import math
import random
import json
#从本地读取历史数据,下面读取的是已经下载到本地的CSV文件。
def get_stock_hist(num):
s_his=np.genfromtxt('C:/Users/Haipeng/Desktop/python/Korea/Korea_{:03d}.csv'.format(num), delimiter=',')
s_hi=s_his[1:][:]
days=s_hi.shape[0]
this_stock = []
for i in range(1,days,1):
this_day = [i]
for k in range(1,7):
this_day.append(s_hi[i][k])
this_stock.append(this_day)
print 'Maximum date is ',len(this_stock)
return this_stock
#均值
def get_ma(D, N):
p_used=np.zeros(N);
for i in range(1,N+1,1):
p_used[i-1]=stock_hist[(D-1)-(i-1)][4]
ma=np.mean(p_used)
return ma
#获取第D天的某个数据
def get_price(D, p_tpe):
if p_tpe=='close':
pos=4;
elif p_tpe=='open':
pos=1;
elif p_tpe=='high':
pos=2;
elif p_tpe=='low':
pos=3;
else:
pos=5
price=stock_hist[D-1][pos];
return price
#跨度设置为N天时,得到第D天的RSI。这里使用了指数移动平均法计算。
def get_RSI_E(D,N):
up_value = 0.0
down_value = 0.0
a = 2.0/(N+1)
for i in range(1,N+1):
value = get_price(i+1,'close')-get_price(i,'close')
if value>=0:
up_value += value
else:
down_value -=value
up_value = up_value/N
down_value = down_value/N
for i in range(D-N):
value = get_price(i+N+1,'close')-get_price(i+N,'close')
if value >= 0:
up_value = a*value +(1-a)*up_value
if value <= 0:
down_value = -a*value + (1-a)*down_value
RSI = 100*up_value/(up_value+down_value)
return RSI
方法2:指数移动平均法计算比较复杂,同时计算效率比较低。所以现实情况下我们使用卡特勒相对强弱指数,具体如下:
实现代码也相对简单,运算时我们也以这种方法为主:
#跨度设置为N天时,得到第D天的RSI。这里使用了简单移动平均法计算。
def get_RSI(D,N):
up_value = 0.0
down_value = 0.0
for i in range(N):
value = get_price(D-i,'close')-get_price(D-i-1,'close')
if value>=0:
up_value += value
else:
down_value -=value
RSI = 100.0*up_value/(up_value+down_value)
return RSI
可视化可以方便肉眼观察数据特征,而这里便可以在K线下加入RSI曲线来直观地比较其相关性。下面需要获取某段时间的开盘价、收盘价、最低价和最高价等来绘制K线,另外还需获取均线及RSI在对应时间段下的数据。所以先定义以下几个收割数据的函数:
#Date\Open\High\Low\Close
def get_tuples(fro,to):
res =[]
for d in range(fro,to+1):
tmp = []
tmp.append(d)
tmp.append(get_price(d,'open'))
tmp.append(get_price(d,'high'))
tmp.append(get_price(d,'low'))
tmp.append(get_price(d,'close'))
res.append(tmp)
return res
def get_mar(fro,to,N):
ma = []
for i in range(fro,to+1):
ma.append(get_ma(i,N))
return ma
def get_rsi(fro,to,N):
res = []
for d in range(fro,to+1):
res.append(get_RSI(d,N))
return res
这里使用matplotlib画图,这是为了下一步的分析计划更好展开,代码如下:
import matplotlib.pyplot as plt
from matplotlib.finance import candlestick_ohlc
#绘图函数
def plot_RSI(fro,to):
rsi14 = get_rsi(fro,to,14)
rsi7 = get_rsi(fro,to,7)
ma5 = get_mar(fro,to,5)
ma10 = get_mar(fro,to,10)
ma20 = get_mar(fro,to,20)
tuples = get_tuples(fro,to)
date = [d for d in range(fro,to+1)]
fig = plt.figure(figsize=(8,5))
p1 = plt.subplot2grid((4,4),(0,0),rowspan=3,colspan=4,axisbg='k')
p1.set_title("Relative Strength Index(RSI)")
p1.set_ylabel("Price")
p1.plot(date,ma5,'m')
p1.plot(date,ma10,'b')
p1.plot(date,ma20,'y')
p1.legend(('MA5','MA10','MA20'))
p1.grid(True,color='w')
candlestick_ohlc(p1, tuples, width=0.7,colorup='r',colordown="g")
p2 = plt.subplot2grid((4,4),(3,0),colspan=4,axisbg='g')
p2.set_ylabel("RSI")
p2.set_xlabel("Dates")
p2.plot(date,rsi14, 'c-')
p2.plot(date,rsi7, 'r-')
p2.axhline(75,color='yellow')
p2.axhline(25,color='yellow')
p2.set_ylim(0,100)
p2.set_yticks([25,50,75])
p2.legend(('RSI14','RSI7'),loc='upper left')
plt.subplots_adjust(hspace=0)
plt.show()# show the plot on the screen
#这里我们随意挑选一只股票测试,例如第八支股票
stock_hist = get_stock_hist(8)
#选择绘制日期起始,例如第100天到第900天之间,调用函数
plot_RSI(100,900)
得出图形如下:
上图数据比较密集,我们可以把时间缩短点,例如需要查看450到600天的图像:
plot_RSI(450,600)
博文包含了获取数据、分析相关原理及技术指标RSI的实现到图像的可视化。而股市上很多关于RSI技术指标的操作指南,在这里并没有详述。原因是其实对于不一样的市场,不同的股票,不同的投资者可能得出完全不一样的策略。我们需要关注的事是如何让计算机通过高速运算帮我们找出某种隐含的规则,而RSI可以作为其中的一个指标,来弥补人经验的缺陷。