3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant (聚宽) 平台进行期货量化交易时,理解 order_value() 和 order_target_value() 函数中的参数至关重要。针对您的三个问题,下面为您详细解答:
**乘数(合约乘数)**是指一手期货合约所代表的标的物的实际数量或价值倍数。因为期货交易是以“手”为单位的,而不是像股票那样以“股”为单位。
4000 * 10 = 40000 元。4000 * 300 = 1200000 元(120万)。在 API 的计算公式 value = 最新价 * 手数 * 保证金率 * 乘数 中,乘数用于将“报价”转化为“实际合约价值”。
value 等于保证金是什么意思?输入 value=15 会怎样?在 JoinQuant 的期货 API 中,order_value(security, value) 和 order_target_value(security, value) 里的 value 参数,直接代表的是你要动用的“保证金金额”,而不是合约的总价值。
value=15,绝对不是下单调整期货至价值 85。value=15 时,系统会认为您想拿出 15元人民币 作为保证金去开仓。系统会根据公式反推手数:手数 = value / (最新价 * 保证金率 * 乘数)注意区分两个函数:
order_value(security, value):增量下单。花费 value 金额的保证金去买入/卖出期货。order_target_value(security, value):目标下单。调整该合约的持仓,使其占用的保证金达到 value 金额。value = context.portfolio.total_value * 0.15 收益率很低,感觉钱没用出去?您感觉“没有把全部钱用出去”是完全正确的。原因有以下几点:
原因一:您只动用了 15% 的资金作为保证金(没有利用期货的杠杆)
假设您的总资产是 100 万,value = 100万 * 0.15 = 15万。您拿出了 15 万作为保证金去开仓。
如果该品种的保证金率刚好是 15%(0.15),那么这 15 万保证金对应的合约总价值 = 15万 / 0.15 = 100万。
这意味着,您虽然只花了 15 万的保证金,但您持有的期货合约总价值是 100 万,刚好等于您的总资产。这相当于1倍杠杆(无杠杆),和您全仓买入 100 万股票的波动率是一样的。剩下的 85 万资金作为可用资金闲置在账户里充当安全垫。如果您想追求高收益(高杠杆),您需要提高 value 的比例,但要注意爆仓风险。
原因二:资金门槛导致向下取整(零头无法成交)
期货必须是整数手交易。假设一手 IF 股指期货需要 18 万保证金。如果您的总资产是 100 万,15% 就是 15 万。系统计算发现 15 万 < 18 万,不足以开 1 手 IF,于是实际下单手数为 0。您的资金完全没有用出去,收益率自然接近于 0。
原因三:使用了 order_value 而不是 order_target_value
如果您在 handle_data 中每天调用 order_value(sec, total_value * 0.15),这意味着您每天都在追加 15% 的保证金去开新仓,直到资金耗尽。如果您本意是“维持 15% 的仓位”,应该使用 order_target_value。
为了弄清楚您的钱到底有没有用出去,建议在策略中加入 log.info 打印日志:
def handle_data(context, data):
# 计算目标保证金
target_margin = context.portfolio.total_value * 0.15
# 打印下单前的可用资金和总资产
log.info("当前总资产: %.2f, 准备使用的保证金: %.2f, 可用资金: %.2f" %
(context.portfolio.total_value, target_margin, context.portfolio.available_cash))
# 建议使用 order_target_value 来控制目标仓位
order_target_value('RB9999.XSGE', target_margin, side='long')
# 打印当前持仓占用的保证金
if 'RB9999.XSGE' in context.portfolio.long_positions:
pos = context.portfolio.long_positions['RB9999.XSGE']
log.info("实际持仓手数: %d, 实际占用保证金: %.2f" % (pos.total_amount, pos.value * 0.15)) # 假设保证金率0.15
通过查看日志中的“实际持仓手数”,您就能立刻明白资金是否因为不足一手而被闲置了。