Skip to content

布林线均值回归

python
# 布林线均值回归

"""
- 当股票价格触及布林线上轨且有持仓时, 卖出股票.
- 当股票价格触及布林线下轨且无持仓时, 买入股票.
"""

from zltquant import *

# 初始化函数,设定策略参数
def initialize(context):
    # 设置回测频率为每日
    set_benchmark('sz399300')  # 设置基准为沪深300指数
    # 设置股票池
    g.stock = 'sh600000'  # 这里平安银行
    # 设置布林线参数
    g.window = 20  # 布林线的窗口期
    g.num_std = 2  # 标准差倍数
    # 设置定时器,每天开盘时运行
    run_daily(trade, time='09:31')
    
# 交易函数
def trade(context):
    # 获取股票的历史数据
    dbar1 = get_price(g.stock, end_date=context.current_dt, count=g.window, fq="pre")
    stock_data = pd.Series(dbar1['close'])  # 将 close 数据转换为 pandas.Series

    # 计算布林线
    mean = stock_data.rolling(window=g.window).mean().iloc[-1]  # 中轨(移动平均)
    std = stock_data.rolling(window=g.window).std().iloc[-1]    # 标准差
    upper_band = mean + g.num_std * std  # 上轨
    lower_band = mean - g.num_std * std  # 下轨    
    # 获取当前价格
    current_price = stock_data.iloc[-1]
    # 获取当前持仓
    current_position = context.portfolio.positions[g.stock].total_amount

    # 交易逻辑
    if current_price > upper_band and current_position > 0:
        # 如果当前价格高于上轨且有持仓,则卖出
        order_target(g.stock, 0)
        log.info("卖出股票:%s" % g.stock)
    elif current_price < lower_band and current_position == 0:
        # 如果当前价格低于下轨且无持仓,则买入
        order_value(g.stock, context.portfolio.available_cash)
        log.info("买入股票:%s" % g.stock)
    

# 收盘后运行函数
def after_trading_end(context):
    # 打印每日收盘后的信息
    log.info("每日收盘后运行")
    pass
if __name__ == '__main__':
    run_main()

文档版本: 1.0.0 | 发布于 2025-01-29