欢迎访问369期货网 369会员登录 注册

当前位置: 主页 > 期货量化

量化交易实战20 - 重要因子与决策树和随机森林(三)用重要因子和随机森林去制定策略(附完整代码)

时间:2025-10-14 16:06|来源:369期货网|作者:369期货网|点击:

今天本来想用这些因子训练模型制定策略交易的,但是聚宽的换手率总是获取不到,给他改了过后,财务/技术指标全为空,被 dropna() 清空了。然后就一直异常!!!!

图片

为了不报错,我又改了一下,结果就这样了!!!!

然后科创板限价保护,我又把688的票剔除了!!!

于是就变成这样了。

图片

全是不交易,认真的吗?

换手率对策略的影响太大了!!居然不能直接获取,逆天!!!

真的会崩溃啊,折磨每一个敲代码的人。

我又不想写PT和QMT的策略,我怕万一有人胆大直接给我拿去用了。

大家注意,我都是用的聚宽的!!!

因为高手不需要我的代码,新手不会改我的代码。

我真的绷不住了,先这样吧,反正也是仅供参考。不想改了,明天还要上班,等周末时间多一点了我再改出来。

完整代码附上:

    # ===================== 1. 库引用 =====================from sklearn.ensemble import RandomForestRegressorfrom jqlib.technical_analysis import *import pandas as pdimport datetime as dt# ===================== 2. 初始化 =====================def initialize(context):    set_params()    set_backtest()    set_variables()# ---------------- 2.1 参数 ----------------def set_params():    g.tc         = 10    g.stocknum   = 6    g.ret        = -0.05# ---------------- 2.2 回测条件 ----------------def set_backtest():    set_benchmark('000001.XSHG')    set_option('use_real_price', True)    log.set_level('order', 'error')# ---------------- 2.3 全局变量 ----------------def set_variables():    g.days     = 0    g.if_trade = False    g.stocks   = []    g.feasible = []# ===================== 3. 每日开盘前 =====================def before_trading_start(context):    g.days += 1    if g.days % g.tc == 0:        g.if_trade = True        g.stocks   = get_index_stocks('000300.XSHG')        g.feasible = set_feasible_stocks(g.stocks)        set_slip_fee()# ---------------- 3.1 可交易股票(剔除科创板 688***) ----------------def set_feasible_stocks(stock_list):    paused_info  = [get_current_data()[s].paused for s in stock_list]    star_market  = [s.startswith('688') for s in stock_list]  # 科创板    df = pd.DataFrame({        'paused': paused_info,        'star':   star_market    }, index=stock_list)    # 未停牌 + 非科创板    return list(df.index[~df.paused & ~df.star])# ---------------- 3.2 滑点 & 手续费 ----------------def set_slip_fee():    set_slippage(FixedSlippage(0.02))    set_commission(PerTrade(buy_cost=0.0001, sell_cost=0.0006, min_cost=5))# ===================== 4. 每日盘中 =====================def handle_data(context, data):    if not g.if_trade:        return    list_to_buy  = stocks_to_buy(context)    list_to_sell = stocks_to_sell(context, list_to_buy)    sell_operation(list_to_sell)    buy_operation(context, list_to_buy)    g.if_trade = False# ===================== 5. 机器学习选股 =====================def get_rff(context, stock_list):    today     = context.current_dt.date()    yesterday = today - dt.timedelta(days=1)    # 基本面    q = query(valuation.code, valuation.market_cap, valuation.turnover_ratio).filter(        valuation.code.in_(stock_list))    dataset = get_fundamentals(q, date=yesterday)    if dataset.empty:        return pd.DataFrame(columns=['pred'])    # 技术面    try:        dataset['bias'] = list(BIAS(stock_list, yesterday)[0].values())        dataset['dma']  = list(DMA(stock_list,  yesterday)[0].values())        dataset['ma']   = list(MA(stock_list,   yesterday).values())        dataset['mtm']  = list(MTM(stock_list,  yesterday).values())    except Exception as e:        log.error('技术指标异常:%s' % e)        return pd.DataFrame(columns=['pred'])    dataset.rename(columns={'turnover_ratio': 'turnover'}, inplace=True)    dataset.set_index('code', inplace=True)    dataset.dropna(inplace=True)    if dataset.empty:        return pd.DataFrame(columns=['pred'])    X = dataset.drop('market_cap', axis=1)    y = dataset['market_cap']    reg = RandomForestRegressor(random_state=20, n_estimators=50)    reg.fit(X, y)    factor = pd.DataFrame(reg.predict(X), index=y.index, columns=['pred'])    return factor.sort_values('pred', ascending=True)# ===================== 6. 买卖决策 =====================def stocks_to_buy(context):    list_to_buy = []    day1 = context.current_dt.date()    day2 = day1 - dt.timedelta(days=5)    hs300_close = get_price('000300.XSHG', day2, day1, '1d', ['close'])['close'].values    if len(hs300_close) < 2:        return []    hs300_ret = hs300_close[-1] / hs300_close[0] - 1    if hs300_ret > g.ret:        factor = get_rff(context, g.feasible)        if not factor.empty:            # 再次剔除科创板(兜底)            list_to_buy = [c for c in factor.index if not c.startswith('688')][:g.stocknum]    return list_to_buydef stocks_to_sell(context, list_to_buy):    list_to_sell = []    day1 = context.current_dt.date()    day2 = day1 - dt.timedelta(days=5)    hs300_close = get_price('000300.XSHG', day2, day1, '1d', ['close'])['close'].values    hs300_ret   = hs300_close[-1] / hs300_close[0] - 1 if len(hs300_close) >= 2 else 0    for stock in list(context.portfolio.positions.keys()):        pos = context.portfolio.positions[stock]        if hs300_ret <= g.ret or \           pos.price < pos.avg_cost * 0.95 or \           stock not in list_to_buy:            list_to_sell.append(stock)    return list_to_sell# ---------------- 6.1 下单 ----------------def sell_operation(list_to_sell):    for s in list_to_sell:        order_target_value(s, 0)def buy_operation(context, list_to_buy):    hold_num = len(context.portfolio.positions)    if hold_num >= g.stocknum:        return    cash = context.portfolio.available_cash    per_cash = cash / (g.stocknum - hold_num) if (g.stocknum - hold_num) else 0    for s in list_to_buy:        if s not in context.portfolio.positions:            order_target_value(s, per_cash)            hold_num += 1            if hold_num >= g.stocknum:                break

    为什么不让人直接用我的代码,因为我是券商的呀,不能提供代码。

    说个离谱的事情,要是有人用了我的代码片段造成亏损,公司可以把我开了........

    真的是离大谱,所以我都是用的不能实盘的聚宽代码。

    破大防,今天这个策略我真的,从没敲过这个头疼的代码。


    编辑推荐

    Copyright © 2024-2025 成都宁时科技有限公司 版权所有

    蜀ICP备2022023994号