文章复现+内测作业
  114514孙笑川 5天前 67 0

一、代码整体定位
这是量化交易中 “回测初始化” 阶段的核心代码,主要完成参数配置、资金分配、交易规则设定等基础工作,为后续的策略逻辑(选股、买卖、调仓等)提供运行环境,本身不包含具体的选股和交易信号逻辑,但搭建了完整的策略运行骨架。
二、核心模块逐行讲解

  1. 导入依赖库
    python
    运行
    import statsmodels.api as sm # 统计建模库(暂未使用,预留)
    from statsmodels import regression # 回归分析库(暂未使用,预留)
    import numpy as np # 数值计算库(处理数字、数组)
    import pandas as pd # 数据处理库(处理表格数据)
    from jqdata import * # 聚宽数据接口(获取股票/期货数据、回测功能)
    import datetime # 日期处理库
    from dateutil.relativedelta import relativedelta # 日期偏移计算(暂未使用)
    核心依赖是 jqdata:这是聚宽平台的专属库,提供回测、数据获取、交易执行等核心功能;
    numpy/pandas 是量化分析的基础工具,用于数据计算和处理;
    部分库(如 statsmodels)暂未实际使用,属于预留导入,可能是为后续策略逻辑(如回归分析选股)做准备。

  2. 初始化函数 initialize(context)
    这是聚宽回测的入口函数,回测开始时会首先执行,核心作用是完成全局配置:
    python
    运行
    def initialize(context):
    set_params() # 调用参数配置函数
    set_variables() # 调用全局变量初始化函数
    set_backtest() # 调用回测规则配置函数

    资金分配:将初始资金拆分为股票和期货两个子账户

    stock_cash = np.round(context.portfolio.starting_cash*(1/1.3),0) # 股票账户资金(初始资金/1.3,四舍五入)
    future_cash = context.portfolio.starting_cash - stock_cash # 期货账户资金(剩余部分)

    设置子账户:分别管理股票和股指期货的资金

    set_subportfolios(
    [
    SubPortfolioConfig(cash=stock_cash, type=‘stock’), # 股票子账户
    SubPortfolioConfig(cash=future_cash,type=‘index_futures’) # 股指期货子账户
    ]
    )
    context:聚宽的核心上下文对象,存储回测的所有关键信息(如账户资金、持仓、当前时间等);
    资金拆分逻辑:按 1:0.3 的比例将初始资金分给股票(约 77%)和期货(约 23%),目的是隔离两类资产的资金,避免相互占用;
    set_subportfolios:聚宽的子账户功能,实现股票和期货资金的独立管理,比如期货的保证金不会占用股票账户的资金。

  3. 参数配置函数 set_params()
    定义策略的核心参数(用 g. 表示聚宽的全局变量,全策略可调用):
    python
    运行
    def set_params():
    g.tc=5 # 暂未使用的参数(可能是调仓间隔天数)
    g.yb=63 # 暂未使用的参数(63约等于3个月交易日,可能是数据周期)

    g.pick_stock_count = 100 # 初选股票数量(筛选100只候选股)
    g.buy_stock_count = 20 # 最终买入股票数量(从100只里选20只持仓)

    g.pre_future=’’ # 存储上期持仓的期货合约代码(初始化空值)
    g.futures_margin_rate = 0.10 # 期货保证金比例(10%,即1倍杠杆)
    g.futures_symbol = ‘IC’ # 股指期货标的(IC:中证500股指期货)

    期货合约乘数:IC是200点/元,其他(如IF沪深300)是300点/元

    g.futures_multiplier = (200 if g.futures_symbol==‘IC’ else 300)
    股票相关参数:划定了选股的 “范围”(初选 100 只、最终买 20 只),是后续选股策略的基础;
    期货相关参数:明确交易标的(IC)、保证金比例(计算开仓所需资金)、合约乘数(计算期货盈亏的核心系数,比如 IC 涨 1 点赚 200 元)。

  4. 全局变量初始化函数 set_variables()
    定义策略运行中需要动态更新的全局变量:
    python
    运行
    def set_variables():
    g.t = 0 # 计数器(暂未使用,可能用于调仓计时)
    g.in_position_stocks = [] # 持仓股票列表(初始化空列表,后续存储当前持有的股票代码)
    这些变量会在策略运行中被修改(比如买入股票后,把代码加入 g.in_position_stocks),用于跟踪策略状态。

  5. 回测规则配置函数 set_backtest()
    设置回测的基础规则:
    python
    运行
    def set_backtest():
    set_option(‘use_real_price’, True) # 使用真实价格回测(而非前复权/后复权价格)
    log.set_level(‘order’, ‘warning’) # 屏蔽订单相关的普通日志,只显示警告/错误

    set_slippage(FixedSlippage(0)) # 滑点设置(注释掉,默认使用聚宽默认滑点)

use_real_price=True:让回测更贴近实盘,使用股票 / 期货的真实成交价格;
日志级别设置:避免订单日志刷屏,只关注关键的警告信息;
滑点:注释掉的代码表示 “设置固定滑点为 0”,当前未启用,会使用聚宽默认的市场滑点(更贴近真实交易)。
6. 每日交易前初始化函数 before_trading_start(context)
每个交易日开盘前执行的函数:
python
运行
def before_trading_start(context):
log.info(’---------------------------------------------------------------------’)
set_slip_fee(context) # 调用手续费设置函数
核心作用是每日更新手续费规则,确保不同时间段的手续费符合真实市场情况。
7. 手续费设置函数 set_slip_fee(context)
根据回测时间动态调整交易手续费(贴合 A 股不同时期的手续费标准):
python
运行
def set_slip_fee(context):
dt=context.current_dt # 获取当前回测时间
log.info(type(context.current_dt)) # 打印当前时间的类型(调试用)
# 按时间分段设置手续费(买入/卖出成本,最低5元)
if dt>datetime.datetime(2013,1, 1):
set_commission(PerTrade(buy_cost=0.0003, sell_cost=0.0013, min_cost=5)) # 2013年后:买0.03%,卖0.13%

elif dt>datetime.datetime(2011,1, 1):
    set_commission(PerTrade(buy_cost=0.001, sell_cost=0.002, min_cost=5))  # 2011-2013:买0.1%,卖0.2%
        
elif dt>datetime.datetime(2009,1, 1):
    set_commission(PerTrade(buy_cost=0.002, sell_cost=0.003, min_cost=5))  # 2009-2011:买0.2%,卖0.3%
            
else:
    set_commission(PerTrade(buy_cost=0.003, sell_cost=0.004, min_cost=5))  # 2009年前:买0.3%,卖0.4%

核心逻辑:A 股手续费曾多次调整,这段代码让回测的手续费随时间变化,更贴近真实交易成本;
手续费计算规则:PerTrade 表示按笔收费,buy_cost/sell_cost 是费率(如 0.0003 = 万 3),min_cost=5 是最低收费(不足 5 元按 5 元算);
注意:代码存在缩进错误(如 dt=context.current_dt 缩进异常),实际运行时需要修正,否则会报错。
三、代码的核心特点
模块化设计:将参数、变量、回测规则拆分为独立函数,便于后续修改和维护;
双资产配置:通过子账户实现股票和股指期货的资金隔离,是 “股票 + 期货对冲” 策略的典型框架;
贴近实盘:动态调整手续费、使用真实价格、设置期货保证金等,让回测结果更可靠;
预留扩展空间:导入了回归分析库、定义了选股数量参数等,为后续添加 “多因子选股”“期货对冲” 等核心逻辑做准备。
总结
这段代码是聚宽平台上的量化回测基础框架,核心完成参数配置、资金拆分(股票 / 期货)、交易规则(手续费 / 滑点)设置;
代码本身无具体交易逻辑(如选股、买卖信号),但搭建了完整的运行环境,可在此基础上添加核心策略;
关键设计是 “子账户” 隔离股票和期货资金,贴合 “股票多头 + 股指期货对冲” 的常见量化策略架构。
image.png整体来看,这个期货动量策略的回测表现偏弱,明显跑输基准「上证指数」,风险调整后收益不足以支撑实盘使用。

整体评估与评级
策略年化收益约 8.45%,而基准年化约 18.09%,主动收益为负,α 仅约 0.045,信息比率为 -0.35,说明在超越基准方面表现欠佳。
夏普比率约 0.25,Sortino 为负(约 -0.59),在最大回撤约 11.2%、年化波动约 17.7% 的前提下,风险调整收益较差。按照常规标准(夏普<0.5 或显著跑输基准)可评为 D(表现较差)。
详细表现解读
收益与基准对比:策略累计收益约 10%,基准约 21.6%,无论绝对收益还是年化收益都明显落后,且负信息比率和较高的跟踪误差(约 22.5%)表明相对收益波动大且方向错误居多。
风险特征:最大回撤 11% 左右本身不算夸张,但在如此回撤水平下只有 8% 年化收益,收益/回撤比不理想,且 downside risk(约 16.4%)配合负的 Sortino,说明下行波动多、盈利阶段不足以覆盖亏损阶段。
风险暴露:β 接近 0(约 -0.0007),说明与股票基准相关性很低,本质上是“独立风险来源”,但在提供多样化的同时,没有给出足够高的风险溢价。
优点与缺点
优点:
最大回撤控制尚可,在 10%–12% 区间,对期货策略来说属于温和水平。
与股票基准相关性极低,可作为多资产组合中的分散化工具(只从相关性角度看)。
image.png
image.png
正在实盘,结果有待考证

最后一次编辑于 5天前 0

暂无评论

推荐阅读