量化投资常用技能 系列文章目录
我们已经介绍了三篇关于量化投资方面绘图的文章和一篇指标类的推导和介绍的文章,大家有兴趣可以了解一下
- 绘图篇
- 指标篇
量化投资常用技能——指标篇2
前言
由于这一部分主要是给大家介绍指标的数学公式和计算方法,更深入的了解它们,其中有众多的数学公式和理论推导过程,我尽可能排版的工整,方便各位阅读。如果只想看代码实现可以跳到最后面“代码实现”部分
上一篇通过层层递进的指标介绍和一步一步的数学公式推导给大家介绍了MACD指标的计算方法和它两线一柱的具体构成,可能看起来会比较吃力,但是理解了对之后的决策非常有实用价值。另外MACD指标的代码实现大家可以自己多尝试,清楚代码组成后很容易自己上手使用,可以自己调整函数接口来适应自己的代码,完成程序化的股票交易并在历史数据上回测
大家可以关注我的GitHub:ExileSaber
量化投资这部分内容会在整个包完成并调试后上传,虽然现在还没较高的水平,但是可以一起学习进步
一、布林线指标介绍
该部分主要参考百度百科的介绍
布林线指标,即BOLL指标(Bollinger Bands)
布林线(BOLL)由约翰·布林先生创造,利用统计原理,求出股价的标准差及其信赖区间,从而确定股价的波动范围及未来走势,利用波带显示股价的安全高低价位,因而也被称为布林带
绘图会发现布林线上下限范围不固定,随股价的滚动而变化,其上下限范围是随着股价波动幅度的大小而变化的,股价涨跌幅度加大时,带状区变宽,涨跌幅度狭小盘整时,带状区则变窄,我们可以根据这个特点来设置相关的策略。
具体的策略介绍会放在 “量化投资常用技能——决策篇” 中
二、布林线指标的数学计算过程
布林线指标简单来说就是移动平均线为中轨线,两倍移动标准差为间距的上轨线和下轨线
-
首先计算中轨线(移动平均线MA)
n日移动平均线的计算公式
M A = ( C 1 + C 2 + . . . + C n ) / n MA = (C_1+C_2+...+C_n)/n MA=(C1+C2+...+Cn)/n
其中C 为收盘价,n 为移动平均周期数。之前有介绍如何绘制移动平均线,可以查看我之前的文章:量化投资常用技能——绘图篇 2:绘制移动平均线 -
计算移动标准差线MD
n日移动标准差的计算公式
M D = ( ( C 1 − M A ) 2 + ( C 2 − M A ) 2 + . . . + ( C n − M A ) 2 ) / n MD =\sqrt{\big((C_1-MA)^2+(C_2-MA)^2+...+(C_n-MA)^2\big)/n} MD=((C1−MA)2+(C2−MA)2+...+(Cn−MA)2)/n其中C 为收盘价,n 为移动标准差周期数,MA为n日移动平均值
-
计算中轨线(MB)上轨线(UP)下轨线(DN)
M B = n 日 的 M A MB = n日的MA MB=n日的MA
U P = M B + 2 × M D UP = MB + 2 \times MD UP=MB+2×MD
D N = M B − 2 × M D DN = MB - 2 \times MD DN=MB−2×MD
三、布林线指标的代码实现和绘图
分为两个部分来讲解,一个是主要的计算部分的代码,学习的同时也可以自己灵活运用在其他地方。另外就是整体的绘图部分,包括烛状图和布林线指标
主要的计算部分的计算方法
列表构造使用尽可能简洁的语句,避免繁琐冗长的代码
# 此处的data数据类型为Series对象
mean_data = np.array([data[i: i+window].mean() for i in range(len(data) - window + 1)]) # 计算移动平均线,转换为ndarray对象数据类型是为了更方便的计算上下轨线
std_data = np.array([data[i: i+window].std() for i in range(len(data) - window + 1)]) # 计算移动标准差
up_line = mean_data + 2 * std_data # 上轨线
down_line = mean_data - 2 * std_data # 下轨线
两个ndarray对象的相加是对应元素相加,非常方便,因此必须要保证两个ndarray对象等长
完整的绘图代码
为了绘图全面,我们将“量化投资常用技能——绘图篇 1:绘制股票收盘价格曲线和ochl烛状图”中绘制烛状图的函数 p l o t plot plot_ o c h l ochl ochl 黏贴到这一部分代码中,即可完成美观工整的图像绘制。另外在数据方面,我们采用另外一种获取数据的方式(该方法不一定每次都可以有效,需要自己寻找解决方法)。完整代码如下:
缺少的库直接 pip install 安装即可
import numpy as np
import matplotlib.pyplot as plt
import pandas_datareader.data as web
import datetime
from matplotlib.dates import date2num
import mpl_finance as mpf
# ———————————————————— #
# ———— 默认参数设置 ———— #
# ———————————————————— #
__colorup__ = "red"
__colordown__ = "green"
window = 30
start = datetime.datetime(2017, 1, 1)
end = datetime.date.today()
stock = web.DataReader("600519.SS", "yahoo", start, end) # 选择茅台股的数据
# ———————————————————— #
def bulin_line(data_df, window=20, axs=None, show=False):
'''
绘制布林线均值回归策略
:param data: 传入Series类型数据
:param window: 移动平均线计算窗口大小
:param axs: 是否子图绘制
:param show: 是否绘图
:return:
'''
drawer = plt if axs is None else axs
data = data_df['Close']
# 此处的data数据类型为Series对象
mean_data = np.array(
[data[i: i + window].mean() for i in range(len(data) - window + 1)]) # 计算移动平均线,转换为ndarray对象数据类型是为了更方便的计算上下轨线
std_data = np.array([data[i: i + window].std() for i in range(len(data) - window + 1)]) # 计算移动标准差
up_line = mean_data + 2 * std_data # 上轨线
down_line = mean_data - 2 * std_data # 下轨线
x = data.index
drawer.plot(x[window - 1:], mean_data, 'r--', label='mean data', alpha=0.8)
drawer.plot(x[window - 1:], up_line, 'b--', label='up line', alpha=0.6)
drawer.plot(x[window - 1:], down_line, 'b--', label='down line', alpha=0.6)
drawer.legend()
if show:
plt.show()
def plot_ochl(data_df, axs=None, show=False):
'''
绘制烛状图
:param data_df: 输入的数据,默认采用tsla的历史行情数据,输入的数据类型目前只支持DataFrame类型
:param axs: 是否在子图上绘制
:param show: 是否显示图像
:return:
'''
if axs is None:
fig, ax = plt.subplots(figsize=(14, 7))
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
drawer = ax
else:
drawer = axs
qutotes = []
# 这部分根据实际表格情况做修改
for index, (d, o, c, h, l) in enumerate(zip(data_df.index, data_df.Open, data_df.Close, data_df.High, data_df.Low)):
d = date2num(d) # 蜡烛图的日期要使用matplotlib.finance.date2num进行转换为特有的数字值
val = (d, o, c, h, l) # 日期,开盘,收盘,最高,最低组成tuple对象val
qutotes.append(val) # 加val加入qutotes
# 使用mpf.candlestick_ochl进行蜡烛绘制,ochl代表:open,close,high,low
mpf.candlestick_ochl(drawer, qutotes, width=0.6, colorup=__colorup__, colordown=__colordown__)
drawer.autoscale_view()
drawer.xaxis_date()
if show:
plt.show()
plot_ochl(stock)
bulin_line(stock, window=window, show=True)
最后的绘制效果如下:
四、BOLL指标的一般研判标准
该部分主要介绍几个常见的研判标准,实际情况并不一定会和研判标准相符合
这部分主要借鉴了百度百科的介绍,放在最后供大家学习代码后也可以了解一下一些BOLL指标的研判标准
布林线功能
- 布林线可以指示支撑和压力位置
- 布林线可以显示超买,超卖
- 布林线可以指示趋势
- 布林线具备通道作用
在常态范围内,布林线使用的技术和方法
常态范围通常是股价运行在一定宽度的带状范围内,它的特征是股价没有极度大涨 大跌,处在一种相对平衡的状态之中,此时使用布林线的方法非常简单
- 当股价穿越上限压力线(动态上限压力线,静态最上压力线BOLB1)时,卖点信号
- 当股价穿越下限支撑线(动态下限支撑线,静态最下支撑线BOLB4)时,买点信号
- 当股价由下向上穿越中界限(静态从BOLB4穿越BOLB3)时,为加码信号
- 当股价由上向下穿越中界线(静态由BOLB1穿越BOLB2)时,为卖出信号
在单边上升行情布林线的使用方法
在一个强势市场中,股价连续上升,通常股价会运行在上轨线和下轨线之间,当股价连续上升较长时间,股价上穿上轨线,次日又下穿下轨线且进一步打破下轨线,带动上轨线,出现由上升转平的明显拐点,此时为卖出信号。另外可以适当增强这个判断,打破均线就卖出也是可以考虑的
缩口的意义:
- 股价经过数波下跌后,随后常会转为较长时间的窄幅整理,这时我们发现布林线的上限和下限空间极小,愈来愈窄,愈来愈近.盘中显示股价的最高价和最低价差价极小,短线没有获利空间,经常是连手续费都挣不出来,盘中交易不活跃,成交量稀少,投资者要密切注意此种缩口情况,因为一轮大行情可能正在酝酿中,一旦成交量增大,股价上升,布林线开口扩大,上升行情宣告开始.
- 如布林线在高位开口极度缩小,一旦股价向下破位,布林线开口放大,一轮跌势将不可避免.
布林线开口的意义:
- 当股价由低位向高位经过数浪上升后,布林线最上压力线和最下支撑线开口达到 了极大程度,并开口不能继续放大转为收缩时,此时是卖出信号,通常股价紧跟着是一轮大幅下跌或调整行情.
- 当股价经过数浪大幅下跌,布林线上限和下限的开口不能继续放大,布林线上限压力线提前由上向下缩口,等到布林线下限支撑线随后由下向上缩口时,一轮跌势将告结束.
使用布林线的注意事项
- 布林线参数的设定不得小于6,静态钱龙值通常是10;动态钱龙设定时通常为20.
- 使用布林线要注意判明是在常态区还是非常态区,在非常态区不能单纯以破上限卖,破下限买为原则.
- 动用开口缩小,在低位容易捕捉住牛股,但在高位或一旦缩口后,股价向下突破,常会有较大下跌空间.
- 可将布林线和其他指标配合使用,效果会更好,如成交量,KDJ指标等.