我们已经介绍了三篇关于量化投资方面绘图的文章和一篇指标类的推导和介绍的文章,大家有兴趣可以了解一下
由于这一部分主要是给大家介绍指标的数学公式和计算方法,更深入的了解它们,其中有众多的数学公式和理论推导过程,我尽可能排版的工整,方便各位阅读。如果只想看代码实现可以跳到最后面“代码实现”部分
上一篇通过层层递进的指标介绍和一步一步的数学公式推导给大家介绍了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指标的研判标准
常态范围通常是股价运行在一定宽度的带状范围内,它的特征是股价没有极度大涨 大跌,处在一种相对平衡的状态之中,此时使用布林线的方法非常简单
在一个强势市场中,股价连续上升,通常股价会运行在上轨线和下轨线之间,当股价连续上升较长时间,股价上穿上轨线,次日又下穿下轨线且进一步打破下轨线,带动上轨线,出现由上升转平的明显拐点,此时为卖出信号。另外可以适当增强这个判断,打破均线就卖出也是可以考虑的