本方案由EasyQuant AI量化助手提供。问题背景很多 PTrade 新手使用order()下单时只能按固定股数买卖当账户资金、股票价格或已有持仓发生变化后仓位很难自动调整。order_target_value()的作用是将某只股票的市值调整到指定目标值适合定期调仓、均线策略和组合策略。实现思路本示例以单只股票趋势策略为例计算短期与长期均线金叉时将目标仓位调整为账户资金的一定比例死叉时将目标市值调整为 0实现清仓下单前检查未完成订单防止策略重复提交委托。完整代码示例def initialize(context): # 股票代码上交所使用 .SS深交所使用 .SZ g.security 510300.SS # 目标仓位比例例如 50% 资金 g.target_position_ratio 0.50 # 均线参数 g.fast_window 5 g.slow_window 20 # 设置股票池 set_universe([g.security]) log.info(策略初始化完成%s % g.security) def handle_data(context, data): security g.security # 获取历史收盘价 close_data get_history( security, countg.slow_window 2, frequency1d, fields[close] ) # 数据不足时不交易 if close_data is None or len(close_data) g.slow_window 1: log.info(历史数据不足跳过本次处理) return close_list list(close_data[close]) # 计算当前短期、长期均线 fast_ma_now sum(close_list[-g.fast_window:]) / g.fast_window slow_ma_now sum(close_list[-g.slow_window:]) / g.slow_window # 计算上一交易日短期、长期均线 fast_ma_prev sum( close_list[-g.fast_window - 1:-1] ) / g.fast_window slow_ma_prev sum( close_list[-g.slow_window - 1:-1] ) / g.slow_window # 金叉和死叉信号 buy_signal ( fast_ma_now slow_ma_now and fast_ma_prev slow_ma_prev ) sell_signal ( fast_ma_now slow_ma_now and fast_ma_prev slow_ma_prev ) # 若有未完成订单本周期不重复下单 open_orders get_open_orders(security) if open_orders: log.info(%s 存在未完成订单跳过本次调仓 % security) return # 当前可用资金与目标市值 available_cash context.portfolio.cash total_value context.portfolio.total_value target_value total_value * g.target_position_ratio # 金叉调仓到目标市值 if buy_signal: log.info( 金叉信号当前短均线 %.3f长均线 %.3f目标市值 %.2f % (fast_ma_now, slow_ma_now, target_value) ) order_id order_target_value(security, target_value) log.info(调仓委托已提交order_id%s % str(order_id)) # 死叉目标市值设为 0清仓 elif sell_signal: log.info( 死叉信号当前短均线 %.3f长均线 %.3f执行清仓 % (fast_ma_now, slow_ma_now) ) order_id order_target_value(security, 0) log.info(清仓委托已提交order_id%s % str(order_id)) else: log.info( 无调仓信号账户可用资金%.2f账户总资产%.2f % (available_cash, total_value) ) def after_trading_end(context, data): # 收盘后检查策略内未完成订单 open_orders get_open_orders() if open_orders: log.info(收盘后仍有未完成订单%s % str(open_orders)) else: log.info(当日无未完成订单)注意事项order_target_value()是“调到目标市值”不是每次额外买入目标市值。调仓前调用get_open_orders()可以避免分钟策略反复提交相同委托。context.portfolio.cash和context.portfolio.total_value应以实际 PTrade 环境返回字段为准。A 股存在最小交易单位、涨跌停、停牌和 T1 等约束目标仓位不一定能一次成交。回测结果应加入佣金、滑点并在模拟盘验证后再考虑实盘。总结order_target_value()适合实现“根据目标比例自动调仓”的策略。相比固定股数下单它更容易适应资金变化也更适合组合交易和定期再平衡。本方案由EasyQuant AI量化助手提供。