资源加载中... loading...

量化交易趋势策略首选框架:CTA交易库

Author: ianzeng123, Created: 2024-05-09 10:50:04, Updated: 2024-06-13 14:12:11

img

在进行商品期货量化交易时,一个出色的交易框架可以帮助交易者提供全方位的支持和智能功能。它不仅能够帮助方便获取和处理市场数据,开发和测试交易策略,还能够实时执行交易指令,管理风险,生成报告并进行分析。选择一个方便好用的交易框架是每个交易者都不可或缺的重要步骤,它将帮助大家在激烈的市场竞争中轻装上阵,实现策略的快速迭代和优化,从而提高交易效率和盈利概率,确保在复杂多变的市场中能够稳健前行,更有可能把握每一个交易机会。

具体来说,当涉及商品期货量化交易时,一个出色的交易框架应该在以下方面提供支持:

  1. 数据获取和处理:一个可靠的交易框架能够方便获取获取市场数据,包括商品期货的品种,价格和持仓以及账户信息等。

  2. 策略开发和调试:交易框架应该提供一个灵活的编程环境,使交易员能够快速开发和测试自己的交易策略。这包括编写交易信号生成、风险管理模型和头寸管理规则等。

  3. 实时交易和执行:一旦交易策略经过回测验证并且交易员准备好实际交易,交易框架应该能够连接到实时市场数据源,并且能够执行交易指令。这包括下单、监视订单执行和处理交易成本等功能。

  4. 风险管理和监控:交易框架应该提供风险管理工具,帮助交易员管理他们的头寸和风险水平。这包括设置止损、止盈和头寸大小等。交易框架还应该能够监控交易员的交易活动,及时发出警报并采取必要的措施来避免过度风险暴露。

  5. 报告和分析:交易框架应该能够生成交易报告,并提供分析工具来帮助交易员评估他们的交易表现。这包括回测报告、交易日志、风险指标和收益分析等。

  6. 实盘优化功能:一个优秀的交易框架应该能够根据预设的规则和条件,添加更多实用性功能,优化实盘运行。比如多品种交易,自动执行移仓等操作。这样的功能可以帮助交易员优化他们的头寸管理策略,以适应市场的变化并最大化收益。

所以呢,一个出色的交易框架应该提供全面的支持,从策略开发到实际交易的整个过程,并且包括必要的工具和功能来帮助交易员在竞争激烈的市场中取得成功。

优宽量化作为专业开放的金融量化平台,致力于为大家提供高效、稳定、易用的量化交易解决方案。因此开发了CTA交易库,特别适合于趋势策略的研究、回测、实盘交易等多样化需求,本文就展开为大家进行一下详细的介绍。

CTA交易库是优宽量化内置的模版类库中的交易框架。交易类库的使用方法非常简单,作为一个内置的模板类库,我们只需勾选使用就可以。当然,如果你希望构建自己的交易类库,也可以从这个公开的类库源码开始。这份代码附带了详细的注释,供大家参考学习。通过使用交易类库,大家可以从繁琐的交易参数设置细节中解脱出来,更加专注于策略本身的编写,提升策略的执行效率。

image

交易类库包含三个交易框架,分别是单品种控制对象$.NewPositionManager(),多品种控制对象$.NewTaskQueue(),以及CTA交易库$.CTA,前面两个框架适合于单品种或者多品种便捷的交易操作(包括高频策略等)。但是针对于趋势策略,CTA交易库的优势就凸显出来。

CTA交易库用于实现基于交易所行情和持仓信息的自动交易策略。它可以根据一系列设定的规则和条件执行买入和卖出操作。该函数接受三个参数:contractType(合约类型)、onTick(回调函数)和interval(轮询间隔,可以省略)。

$.CTA = function(contractType, onTick, interval) {
    var r = onTick.records // 获取K线信息
    // 利用K线计算交易信号
    ...
    // 进行交易操作(n代表具体交易手数)
    return n 
}

下面我们介绍下CTA库主要的功能特性:

自动匹配主力合约

在量化交易的回测和实盘操作中,正确处理主力合约的标识和移仓操作对于策略的准确性和实用性至关重要。

一、回测中的主力合约移仓换月

在量化回测中,我们常采用“期货代码+888”来代表特定品种的主力合约,以便处理连续合约数据。然而,主力合约间的移仓换月操作若处理不当,尤其是连续合约间的价格差异,会导致策略收益计算出现显著偏差,影响回测结果的准确性。为了解决这一问题,CTA交易库提供了自动移仓换月的功能,它能够在回测环境中模拟实际的合约转换过程,确保策略收益计算的连续性和精确性,从而提高回测结果的可靠性,帮助交易者更准确地评估和优化他们的交易策略。

二、实盘操作中的合约识别与CTA库的解决方案

  1. 实盘合约错误:在实盘交易系统中,直接使用期货代码+888可能会导致合约无法被识别,因为实盘中并不存在以888结尾的合约代码。

  2. CTA库的映射功能:CTA交易库具备内置函数,能够识别888代码并将其映射为当前策略周期内的具体主力合约代码,解决了实盘中合约识别的问题。

  3. 自动移仓换月:CTA库支持在回测和实盘中自动进行移仓换月操作,简化了交易者手动调仓的过程,同时确保了策略在不同合约间的平滑过渡,提高了回测的准确性。

三、CTA交易库的灵活性

  1. 跨品种映射:CTA交易库不仅能够处理单一品种的主力合约映射,还可以根据交易者的需求,实现跨品种的映射。例如,通过设置i000/rb888,可以根据铁矿石的指数K线来交易螺纹钢的主力合约。

  2. 多品种交易支持:CTA交易库支持多品种的量化交易。交易者可以通过简单的英文逗号分隔合约代码,如"FG888,SA888",可以来同时交易玻璃和纯碱的主力合约。

便捷调取合约属性

在量化交易框架中,便捷地调取合约属性对于策略的实施至关重要。CTA库通过其onTick回调函数提供了这一便捷性,该函数在每次行情更新时被触发。onTick函数接收一个对象作为参数,该对象包含了进行交易决策所需的所有关键信息:

  • records:提供当前行情数据的列表,允许交易者查看历史行情记录,进行趋势分析。
  • symbol:标识当前正在交易的合约代码,确保策略针对正确的合约执行。
  • detail:包含当前交易合约的详细信息,如持仓数量限制、保证金率、价格最小变动单位(跳数)、合约乘数等,这些信息对于计算和风险管理至关重要。
  • account:提供交易账户的综合信息,包括账户的当前资金状况,有助于交易者了解整体财务状况。
  • position:反映当前合约的具体持仓信息,包括持仓数量(多头持仓为正,空头持仓为负)、持仓平均价格、以及持仓的盈亏状况。
  • positions:提供所有交易合约的持仓汇总信息,便于交易者进行多合约管理。

与传统方法相比,过去交易者需要通过exchange函数逐一获取合约、账户和持仓信息,CTA库的这种集成方式极大地简化了数据获取过程。交易者可以直接从onTick回调函数提供的对象中提取所需的属性信息,从而更加高效地进行交易状态判断和策略实施,无需编写额外的代码来单独调用和整合这些数据。这种设计不仅提升了交易策略的执行效率,也降低了编程难度和出错的可能性,使得交易者可以更专注于策略本身的开发和完善。

简约交易逻辑编写

在CTA库中,交易操作的设计简化了期货交易的流程。与传统方法相比,CTA库的交易执行通过return语句来完成,其中交易操作的参数n决定了具体的交易行为:

  1. 开仓逻辑:当当前持仓数量position.amount为0,即没有任何仓位时,参数n的正值表示开多头仓位,负值表示开空头仓位。这个值直接对应要开仓的手数。

  2. 平仓与对冲逻辑:如果position.amount非零,表明已持有仓位。此时,参数n与当前持仓进行比较,以决定是平仓、对冲还是新开仓。例如,持有三手空仓(position.amount为-3)时:

    • n为2,意味着平掉两手中的空仓,剩余一手空仓保持不变。
    • n为4,意味着平掉所有三手空仓,并且由于n的绝对值大于持仓量,还会开一手多头仓位。
  3. 简化的趋势策略操作:CTA库的这种设计特别适用于趋势策略,其中交易方向经常需要从多头转向空头,或从空头转向多头。通过智能地使用return语句和参数n,策略代码可以更加简洁,减少了交易逻辑的复杂性。

通过上述逻辑,CTA库允许交易者以一种直观且高效的方式执行交易操作,从而简化了策略的编写和执行过程。这种简化不仅提升了交易策略的开发效率,还有助于降低操作错误,确保策略逻辑的清晰和准确实施。

我们示范一个趋势策略,来看下具体的代码是多么简约:

function main() {
    $.CTA("FG888", function(st) {
        if (st.records.length < 20) {
            return
        }
        var emaSlow = TA.EMA(st.records, 20)
        var emaFast = TA.EMA(st.records, 5)
        var cross = $.Cross(emaFast, emaSlow);
        
        if (st.position.amount <= 0 && cross > 2) {
            Log("金叉周期: ", cross);
            Log("当前持仓: ", st.position);
            return st.position.amount < 0 ? 2 : 1
        } else if (st.position.amount >= 0 && cross < -2) {
            Log("死叉周期", cross);
            Log("当前持仓: ", st.position);
            return st.position.amount > 0 ? -2 : -1
        }
    });
}

在CTA库中实现的趋势策略代码示例展示了如何以简洁的方式编写交易逻辑:

  1. CTA函数调用:首先,通过调用$.CTA函数并传入合约代码"FG888"和回调函数,初始化了CTA交易逻辑。回调函数接收一个参数st,它包含了包括K线、账户和持仓信息在内的综合数据。

  2. 数据记录检查:通过检查st.records.length,确保市场数据记录的数量不少于20条。如果数据不足,策略不会执行任何操作,直接返回。

  3. 计算指数移动平均线(EMA):使用TA.EMA函数计算两个不同周期的EMA,一个是20周期的慢速EMA,另一个是5周期的快速EMA。

  4. 判断均线交叉:通过$.Cross函数判断快速EMA和慢速EMA是否发生交叉,cross变量表示上穿或下穿的周期数。

  5. 金叉死叉逻辑

    • 金叉:当快速EMA上穿慢速EMA,且cross值大于2(意味着上穿已持续至少两个周期),如果当前没有多头仓位或持有空头仓位,策略将执行平空开多操作。具体操作取决于当前持仓:

      • 持有空头仓位时(st.position.amount < 0),先平仓两手,然后开仓一手多头(return 2)。
      • 没有持仓时(st.position.amount == 0),直接开仓一手多头(return 1)。
    • 死叉:当快速EMA下穿慢速EMA,且cross值小于-2(意味着下穿已持续至少两个周期),如果当前持有多头仓位或没有持仓,策略将执行平多开空操作。具体操作取决于当前持仓:

      • 持有多头仓位时(st.position.amount > 0),先平仓两手,然后开仓一手空头(return -2)。
      • 没有持仓时(st.position.amount == 0),直接开仓一手空头(return -1)。
  6. 日志记录:在执行交易操作前,策略通过Log函数记录金叉或死叉的周期数以及当前持仓情况,便于分析和调试。

通过上述逻辑,CTA库的趋势策略示例展示了如何利用简约的代码实现复杂的交易逻辑。这种设计不仅简化了策略的编写,还提高了策略的可读性和可维护性,使得交易者可以快速响应市场变化,执行精确的交易操作。

我们看一下回测结果,可以看到伴随金叉和死叉指标,多头和空头不断的对调开平仓,符合策略的交易逻辑。总体来说,这段代码使用了CTA函数进行了简单的均线交叉策略的编写,希望从这个例子中,大家可以学习认识下CTA函数。

image

image

可以看到呢,优宽量化平台的CTA交易库为商品期货量化交易提供了一个全面而强大的工具集。它不仅简化了策略开发和测试的过程,还通过自动化的功能,如自动移仓和实时交易执行,极大地提高了交易的效率和精确度。此外,CTA交易库的简洁性和易用性,使得即使是初学者也能快速上手,而经验丰富的交易员则可以更专注于策略的创新和优化。

随着量化交易的普及和发展,选择一个合适的交易框架变得尤为重要。优宽量化平台的CTA交易库,凭借其全面的功能和用户友好的设计,无疑能够帮助交易者在复杂多变的市场中保持竞争力,实现稳健的交易表现。无论是对于个人投资者还是专业机构,CTA交易库都提供了一个坚实的基础,以支持他们在量化交易的道路上不断前行,从而帮助实现长期而可持续的投资回报。


更多内容