​​


作者:悠悠做神仙​


上一篇文章量化交易入门系列2:经典的量化交易策略(上),介绍了经典量化策略,​均线策略​和​海龟交易策略​。本篇文章,将继续分享一些经典的交易策略--​布林线均值回归策略

布林线均值回归策略

BOLL​指标是美国股市分析家​约翰·布林​根据统计学中的标准差原理设计出来的一种非常简单实用的技术分析指标。

一般而言,股价的运动总是围绕某一价值中枢(如均线、成本线等)在一定的范围内变动,正是在上述条件的基础上,引进了“​股价通道​”的概念,其认为股价通道的宽窄随着股价波动幅度的大小而变化,而且股价通道又具有变异性,它会随着股价的变化而自动调整。

所以,布林线均值回归策略认为,标的价格在上轨线和下轨线围成的范围内浮动,即使短期内突破上下轨,但长期内仍然会回归到布林带之中。因此,一旦突破上下轨,即形成买卖信号。

当股价向上突破上界时,为卖出信号,当股价向下突破下界时,为买入信号。


BOLL线的计算公式:

中轨线 = N日移动平均线 上轨线 = 中轨线 + k *标准差 下轨线 = 中轨线 - k * 标准差


对于公式的解释

布林曲线策略是一种价格通道指标,由上、中、下三条轨道线组成。上、中、下轨解释如下:

中轨:行业中所有股票收盘价均值序列的移动平均线 上轨:移动平均线加上p倍的均值序列标准差 下轨:移动平均线减去p倍的均值序列标准差

策略思路

第一步:根据数据计算BOLL线的上下界 第二步:获得持仓信号 第三步:回测分析

策略源码(带收口判断)

策略标的股票:603678-火炬电子

策略周期:2020-01-01 至2021-11-29

模拟资金:10w

import numpy as np
import pandas as pd
from pandas import Series,DataFrame
# 定义一个全局变量, 保存要操作的证券
# 603678(股票:火炬电子)
security = '603678.XSHG'
# 初始化此策略
# 设置我们要操作的股票池, 这里我们只操作一支股票
set_universe([security])
#设置回测条件
set_commission(PerTrade(buy_cost=0.0008, sell_cost=0.0015, min_cost=5))
set_slippage(FixedSlippage(0))
#布林策略
def bolling(cash,paused,current_price,num,days):
#取得股票的收盘价信息
price=attribute_history(security,num+days,'1d',('close','open'),skip_paused=True)
#创建一个num*days的二维数组来保存收盘价数据
price_array=np.arange(num*days).reshape(num,days)
for i in range(0,num):
for j in range(0,days):
price_array[i][j]=price['close'][i+j]
#创建一个数组来保存中轨信息
mid=np.arange(num)
#创建一个数组来保存标准差
std=np.arange(num)
for i in range(0,num):
mid[i]=np.mean(price_array[i])
std[i]=np.std(price_array[i])
#用up来保存昨日的上轨线
up=mid[num-1]+2*std
#用down来保存昨日的下轨线
down=mid[num-1]-2*std
#用一个列表来保存每天是开口还是收口
#如果一天的标准差不比前一天小,则在open列表里记录
#True,反之记录False,在close列表里记录False,反之
#记录False
open=[]
close=[]
for i in range(0,num-1):
if std[i]>std[i+1]:
close.append('True')
open.append('False')
else:
open.append('True')
close.append('False')
#如果连续num天开口
if 'False' not in open:
#如果当前价格超过昨日的上轨
if current_price>mid[num-1]+2*std[num-1]:
#计算可以买多少股票
num_of_shares=int(cash/current_price)
#如果可以买的数量超过0并且股票未停牌
if num_of_shares>0 and paused==False:
#购买股票
order(security,+num_of_shares)
#如果当前价格跌破了昨日的下轨
elif current_price<mid[num-1]-2*std[num-1]:
#如果股票未停牌
if paused==False:
#将股票卖空
order_target(security,0)
#如果连续num天收口,则股价超过上轨时卖,跌破
#下轨时买
if 'False' not in close:
if current_price>mid[num-1]+2*std[num-1]:
if paused==False:
order_target(security,0)
elif current_price<mid[num-1]-2*std[num-1]:
num_of_shares=int(cash/current_price)
if num_of_shares>0 and paused==False:
order(security,+num_of_shares)
# 每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次
def handle_data(context, data):
#确定考虑几天的布林轨
num=5
#确定计算布林轨时使用几天的股票数据
days=20
#取得当前现金
cash=context.portfolio.cash
#判断目前股票是否停牌
paused=data[security].paused
#取得当前股票价格
current_price=data[security].price
#执行布林策略
bolling(cash,paused,current_price,num,days)

模拟效果

策略收益率:99.38%

策略年花收益:45.27%

基准收益:18.43%

【量化】量化交易入门系列3:经典的量化交易策略(中)_标准差


想向技术大佬们多多取经?开发中遇到的问题何处探讨?如何获取金融科技海量资源?

​恒生LIGHT云社区​​,由恒生电子搭建的金融科技专业社区平台,分享实用技术干货、资源数据、金融科技行业趋势,拥抱所有金融开发者。