量化交易 - 布林带(Bollinger Bands)策略 - 回测源码
利用布林带进行回测!
·
一、回测效果
二、回测代码
可以在这里复制我的代码:https://www.joinquant.com/view/community/detail/55665
# 导入函数库
from jqdata import *
import numpy as np
import pandas as pd
import talib
# 初始化函数,设定基准等等
def initialize(context):
# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 输出内容到日志 log.info()
log.info('初始函数开始运行且全局只运行一次')
# 过滤掉order系列API产生的比error级别低的log
# log.set_level('order', 'error')
### 股票相关设定 ###
# 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
g.security = '000300.XSHG'
run_daily(market_open, time='open', reference_security='000300.XSHG')
def get_bollinger_bands2(price_data, period=20, std_dev_factor=2):
"""
使用 TA-Lib 计算布林带。
:param price_data: (pd.Series) 股票的收盘价历史数据。
:param period: (int) 移动均线结果计算的周期数,默认 20。
:param std_dev_factor: (float) 标准差倍数,默认 2。
:return: (tuple) 上轨、中轨、下轨。
"""
# 确保 price_data 是 NumPy 数组
if isinstance(price_data, pd.Series):
price_data = price_data.values
# 使用 TA-Lib 计算布林带
upper_band, middle_band, lower_band = talib.BBANDS(
price_data,
timeperiod=period,
nbdevup=std_dev_factor,
nbdevdn=std_dev_factor,
matype=0
)
return upper_band, middle_band, lower_band
## 开盘时运行函数
def market_open(context):
security = g.security
# 获取股票的收盘价
close_data = get_bars(security, count=20, unit='1d', fields=['close'])['close']
# 计算布林带
upper_band, middle_band, lower_band = get_bollinger_bands2(close_data)
# 取得上一时间点价格
current_price = close_data[-1]
# 取得当前的现金
cash = context.portfolio.available_cash
# 如果当前价格低于下轨,则买入
if current_price < lower_band[-1] and cash > 0:
# 记录这次买入
log.info("价格低于布林带下轨, 买入 %s" % security)
# 用所有 cash 买入股票
order_value(security, cash)
# 如果当前价格高于上轨,则卖出
elif current_price > upper_band[-1] and context.portfolio.positions[security].closeable_amount > 0:
# 记录这次卖出
log.info("价格高于布林带上轨, 卖出 %s" % security)
# 卖出所有股票,使这只股票的最终持有量为0
order_target(security, 0)
更多推荐
所有评论(0)