今天本来想用这些因子训练模型制定策略交易的,但是聚宽的换手率总是获取不到,给他改了过后,财务/技术指标全为空,被 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 成都宁时科技有限公司 版权所有