量化交易策略——BIAS策略简单小试and加强版
2017-04-12 17:23阅读:
量化交易策略——BIAS策略简单小试and加强版
乖离率(BIAS)简称Y值,是移动平均(moving
average)原理派生的一项技术指标,测试原理是建立在:如果股价偏离移动平均线太远,不管股价在移动平均线之上或之下,都有可能趋向平均线的这一条原理上。而乖离率则表示股价偏离趋向指标所占到的百分比值。
计算方法:N期BIAS=(当日收盘价-N期平均收盘价)/N期平均收盘价*100%
回测:
资金:100000
频率:日
交易资产:平安银行
手续费滑点采用平台默认
采用13日bias值,买入卖出临界值为0.065,即bias<-0.065满仓买入,bias>0.065全仓卖出
分析:
信号设置较为简单,可以考虑和别的指标结合下。
交易次数较少,每次都是全买全卖,买完了等好久都卖不出去的情况很容易出现,导致错过很多更好的买点。
参数没有计算机优化。
后期大趋势下,表现不好。
由bias值与股价的图看出,bias值并没有明显领先股价做出变化。
收益与风险

源码:
# 定义一个全局变量, 保存要操作的证券
# 000001(股票:平安银行)
security = '000001.XSHE'
# 初始化此策略
# 设置我们要操作的股票池, 这里我们只操作一支股票
set_universe([security])
# 每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次
def handle_data(context, data):
# 取得过去十三天的平均价格
average_price =
data[security].mavg(13)
# 取得当前价格
current_price =
data[security].price
# 取得当前的现金
cash =
context.portfolio.cash
# 计算BIAS值
bias=(current_price-average_price)/average_price
# 设置BIAS操作临界值
bias_operationvalue=0.065;
#
如果BIAS值小于-BIAS操作临界值,买入
if bias <
-1*bias_operationvalue:
# 计算可以买多少只股票
number_of_shares =
int(cash/current_price)
# 购买量大于0时,下单
if number_of_shares > 0:
# 买入股票
order(security, +number_of_shares)
# 记录这次买入
log.info('Buying %s' % (security))
#
如果BIAS大于BIAS操作临界值,卖出
elif bias >
bias_operationvalue and
context.portfolio.positions[security].amount > 0:
# 卖出所有股票,使这只股票的最终持有量为0
order_target(security, 0)
# 记录这次卖出
log.info('Selling %s' %
(security))
# 画出当前的价格
record(stock_price=data[security].price)
record(bias=bias*20+7)
bias策略加强版
主要变化
1.加入了多股票方法,每隔一个周期开始前,结算上一周期未卖出的股票,从股票池(此次选的沪深300)里挑选一些股票(挑选标准此次选的是价格超过5日均线2%),在一个周期内每个单位时间循环访问每个挑选出来的股票,进行判断是否买入(判断标准是13日bias值<-0.06)或卖出(判断标准是13日bias值>0.06).
2.加入了止损,每只股票亏损超过20%,则止损。
3.加入了仓位管理,将资金平均分配给每个股票,每个股票依然只能是进行满仓空仓操作。
4.加入了胜率统计,在卖的时候判断,盈利则成功,亏损则失败,胜率算法为,成功次数除以成功与失败之和。在日志里输出,此次的胜率是64%。
核心代码
#初始化
def initialize(context):
......
#每个单位时间执行一次handle_data内的指令
def handle_data(context, data):
#如果是一个新的周期
if
g.i%g.period==0:
#清算所有未卖出的股票
clear(context, data)
#从股票池中挑选股票
findstock(context, data)
# 循环股票池
for security in
g.buystocks:
#进行股票交易
......
收益与风险

源码:
# 定义一个全局变量, 保存要操作的证券
def initialize(context):
#设置股票池
context.stocks =
get_index_stocks('000300.XSHG')
set_universe(context.stocks)
#设置最多挑选的股票数量
g.max_stock=10
#平均分配股票的可用资金
g.max_use_cash=context.portfolio.cash/g.max_stock
#设置变量,记录操作成功与失败次数
g.win=0.0
g.lose=0.0
#计时器
g.i=-1;
#股票池中选择出的股票列表
g.buystocks = []
#更新股票列表周期
g.period=60
# 每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次
def handle_data(context, data):
g.i=g.i+1
#判断是否为一个新周期
if
g.i%g.period==0:
#清算所有未卖出的股票
clear(context, data)
#从股票池中挑选股票
findstock(context, data)
# 循环股票池
for security in
g.buystocks:
# 得到该股票当前价格
current_price =
data[security].price
#得到十三日均价
avg = data[security].mavg(13)
#计算bias值
bias = (current_price-avg)/avg
#计算持仓成本
current_avgcost =
context.portfolio.positions[security].avg_cost
#计算当前股票的盈利状况
if
context.portfolio.positions[security].amount > 0:
r_ratio=(current_price-current_avgcost)/current_avgcost
else:
r_ratio=0
# 如果bias值小于-0.06,且仓位为空,则买入
if bias < -0.06 and
context.portfoli