一、回测效果

二、回测代码

可以在这里复制我的代码: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)
    

Logo

专业量化交易与投资者大本营

更多推荐