• 164种盈利交易策略 [Paper to Profit]

    164种盈利交易策略

    以及如何生成更多10,000种策略

    The Garden of Earthly Delights

    正如我在上一篇文章中提到的(点击查看),我设计并开发了一种借助生成式AI快速构建交易系统的方法。虽然这听起来像是灾难的配方,但通过将问题限制在一个非常具体的子集并仅关注少数几个因素,结果实际上非常惊人。

    从875个候选策略中,我手动筛选出259个有潜力的策略。通过主成分分析(Principal Component Analysis),我发现许多策略在利用的因素上存在“重叠”。最终,我将列表精简为164种全新且独特的投资组合分配系统,这些系统往往优于我所参考的最先进基准。

    我是如何做到的

    想先探索这些策略?点击下方查看164种交易策略目录:

    查看目录

    流程

    创意生成

    原始生成过程非常简单。正如我在上一篇文章(点击查看)中讨论的,我将问题分解为一个非常具体且抽象的需求。我只需要开发一个单一功能,输入输出格式、数值范围、预期等都有明确要求。因此,我设计了一个简洁、明确且强大的提示(prompt),用于生成创意(参见此处)。每次生成可一次性产出100个创意,输入到大型语言模型(LLM)后,我特别关注技术分析系统以保持简洁。

    Step 1 Ideation Flow

    生成的输出是类似这样的创意草稿:

    • Adaptive EMA Crossover
      • 使用短期和长期EMA,其长度根据近期波动率调整(波动率高→EMA周期短)。
      • Scores = current_price × (EMA_short/EMA_long)。
    • Volatility-Scaled Momentum
      • 在窗口期内计算动量并除以近期实现波动率。
      • Scores ∝ momentum/σ,倾向于稳定的强趋势。
    • RSI Extremum Reversion
      • 对每项资产计算窗口期内的RSI;若RSI>70,score = current_price×(1–(RSI–70)/30);若<30,score=current_price×(1+(30–RSI)/30);否则为当前价格。
    • Bollinger Band Trend
      • 基于移动平均线构建±2σ带;价格突破上带时,score = current_price×(1 + breach_pct);突破下带时,score=current_price×(1 – breach_pct);在带内时回归均值。
    • Keltner Channel Fade
      • 使用基于ATR的通道;内部移动时scores = channel_midpoint,触及通道时score = current_price × (1 – sign(touch)_k_(distance/channel_width))。

    这些草稿都被存入一个单一文本文件。我生成了875种独特策略,但感觉系统开始重复生成类似策略,于是进入实施阶段。

    实施阶段

    随后,我使用了相同的提示,但稍作修改用于代码生成。我每次生成20个系统,分批输出到一个“实施库”中,基本上就是一个文件列表。

    Good Googly Moogly

    验证阶段

    875个编程策略已经不错,但我需要一种方法来筛选它们。我编写了一个简单的评估器,读取所有文件,提取类,并在我的`portwine`回测系统内运行(点击获取)。

    评估器输出权益曲线可视化、交易费用分析以及原始输出,以便未来进一步评估。不出所料,部分策略存在错误,因此我不得不调试和修复一些问题,整合代码等。即使如此,某些策略仍然格式错误,被淘汰。

    Validation / Evaluation Step 2

    在尽可能多地获取策略输出后,我手动浏览了大量图像文件夹。我在单一资产组合(CL, KO, PG, PEP, MMM, TGT, JNJ, LOW, MDT, MCD)上运行每个策略以保持简单,并测试了8种回溯窗口和再平衡周期配置(7天回溯每周再平衡、30天回溯每月再平衡等)。

    如果一个策略在每种配置下持续优于等权重基准,则保留,否则丢弃,最终剩下259个策略。

    随后我进行了PCA分析,以了解策略之间的相似度。发现80%的方差仅由14个系统解释,集中度极高。注意,此例中策略总数为2070,因为每个参数配置被视为一个独立的“策略”。

    PCA Analysis

    为去除重复,我运行了一个简单的相关性过滤,淘汰高度相关的系统。可以使用更复杂的方法深入分析PCA结果,但对我来说这已足够。

    Correlation Filter

    最终结果?保留了164种策略,占比18.75%。以下是它们的表现。


    策略分类

    最终策略分为以下类别,其中均值回归和动量策略占比最高。这并不令人意外,因为我用来创建这个元系统的基本模型特别使用了这两个因素。

    • 均值回归策略(Mean Reversion Strategies)
      • 价格预期在偏离后回归中心趋势。
    • 趋势跟随/动量策略(Trend Following / Momentum Strategies)
      • 价格预期沿当前方向继续。
    • 基于移动平均线的预测(Moving Average Based Predictions)
      • MA本身(或其投影)作为价格预测。
    • 统计与时间序列建模(Statistical & Time Series Modeling)
      • 使用正式统计模型预测价格。
    • 信号处理与过滤方法(Signal Processing & Filtering Approaches)
      • 应用滤波器去噪价格序列或识别主导频率。
    • 基于模式和事件的策略(Pattern-Based & Event-Driven Strategies)
      • 由特定图表模式或事件触发的预测。
    • 横截面相对价值与统计套利(Cross-Sectional Relative Value & Statistical Arbitrage)
      • 利用资产间的相对错定价或协同运动。
    • 波动率与范围策略(Volatility & Range Based Strategies)
      • 直接使用波动率或价格范围特征进行预测,而不仅是构建区间。

    前三大策略

    在164种策略中,三种策略脱颖而出,月度再平衡策略的年化复合增长率(CAGR)均超过20%,表现极为强劲。

    SquaredDiffMean

    • 基于标准化差异`(SMA – EMA) / current_price`预测价格变动。预测价格 = `current_price * (1 + (SMA – EMA) / current_price)`。若SMA > EMA,意味着预测上涨。
    • 超参数
      • 90天回溯期
      • 月度再平衡
    • 含费用CAGR:21.80%

    SquaredDiffMean


    EntropyDivergence

    • 计算资产回报的Shannon熵。低熵表明趋势,形成基于动量的预测;高熵表明噪音,形成向移动平均线回归的均值回归预测。
    • 超参数
      • 90天回溯期
      • 月度再平衡
    • 含费用CAGR:20.95%

    EntropyDivergence


    RecursiveEnvelope

    • 递归更新包络线中心(当前价格的EMA,参数为`alpha`)及其宽度(`recent_vol / center`的EMA,参数为`alpha`)。预测当前平滑包络线中心。
    • 超参数
      • 180天回溯期
      • 月度再平衡
    • 含费用CAGR:20.38%

    RecursiveEnvelope


    完整目录

    为方便浏览,我创建了一个简单的静态网站,包含所有策略在各个时间框架下的预计算回测结果。你可以查看所有164种策略及其8种超参数组合。

    点击下方按钮查看完整目录:

    查看完整目录

    如果你喜欢这篇文章,请订阅以获取更多优秀的策略和交易内容。感谢你的支持!

  • 我们终于能将ChatGPT用作量化分析师吗? [Quantpedia]

    我们终于能将ChatGPT用作量化分析师吗?

    标签: AI, 资产配置, 资产类别选择, ChatGPT, 因子投资, 机器学习, 动量, 自研, 量化分析师, Smart Beta

    在我们之前的两篇文章文章中,我们探讨了利用人工智能回测交易策略的想法。自那以后,AI技术持续发展,像ChatGPT这样的工具已从简单的问答助手演变为可能有助于开发和测试投资策略的复杂工具——至少一些领域内较为乐观的声音是这样认为的。距离我们首次实验已过去一年多时间,鉴于目前围绕大型语言模型(LLMs)实用性的热议,我们认为现在是时候重新审视这一话题。因此,我们的目标是评估当今的AI模型作为准初级量化分析师的表现如何——不仅突出其有前景的用例,同时也指出仍然存在的局限性。

    模型选择

    首先,我们需要选择一个适合此任务的模型。我们探索了使用Claude AI、Gemini Advanced(前身为Deep Research)以及ChatGPT的选项,这些是当今使用最广泛的一些AI工具。AI模型的进步非常迅速;有些模型在特定子任务上表现更好,有些则较差;然而,从我们的角度来看,这些模型之间没有显著差异。因此,基于我们的需求——数据插补、代码解释和推理能力,我们选择了ChatGPT作为主要工具进行分析。在决定使用具体版本时,我们选择了GPT-4o模型,因为它整体上证明是最通用的。我们也考虑了GPT-4.5模型(OpenAI宣传其为更适合分析任务的模型),但由于它预计很快将被弃用,我们认为基于它撰写的文章不会有持久的相关性。

    我们的目标

    正如本文标题所暗示,我们的目标是探究AI是否可以协助创建交易策略的过程,或者即使不是整个过程,至少是否能将部分过程外包给AI,并且我们是否仍能信任其结果。为此,我们决定采用一个简单的模型——我们与ChatGPT合作,要求它协助我们创建一个资产配置策略,使用三种资产:股票、固定收益和商品。

    我们的测试基于2015年7月7日至2025年4月17日的数据,投资组合包括SPY(SPDR S&P 500 ETF Trust)、IEF(iShares 7-10 Year Treasury Bond ETF)和DBC(Invesco DB Commodity Index Tracking Fund)。

    初步尝试

    当数据准备好后(我们遇到了一些问题,但稍后会总结),实施一个简单的交易策略,如固定百分比配置,是一项相对容易的任务。简单策略涉及不考虑市场条件,将固定比例的资本分配给不同资产。例如,你可能将60%的资金分配给股票,30%给债券,10%给商品。在代码中,这仅仅意味着将每种资产的回报乘以目标权重,然后相加得到投资组合回报。你不需要复杂的指标或动态再平衡,只需要对时间序列数据进行基本算术运算。这种策略非常适合AI自动化和测试的起步,因为逻辑简单且可以在数据集上统一应用。

    AI模型还能做得更多。它不仅可以为这种基本策略编写代码,还能主动提出一些策略建议。因此,我们从一个朴素策略开始,并要求AI建议我们修改分配比例,这些比例是合理且合理的,并建议一些在回报、Sharpe比率和Calmar比率方面更具盈利性的策略。

    Figure 1: Equity curve for each asset in investment universe and naive portfolio.

    图1:投资组合中每种资产及朴素投资组合的权益曲线

    Figure 2: Equity curves of basic fixed asset allocation strategies suggested by AI.

    图2:AI建议的基本固定资产配置策略的权益曲线

    建议改进

    在运行基本的固定资产配置策略并检查其表现后,下一步显而易见:我们能做得更好吗? 创建一个固定权重的简单投资组合是一回事,但市场很少如此配合。因此,我们要求ChatGPT不仅测试朴素策略(及其变体),还要帮助提出可能改进结果的合理修改,而不使整个过程过于复杂。

    这就是事情变得更有趣的地方。我们没有仅仅分配静态权重,而是探索了一些小的变化:如果在市场低迷时期稍微多配置一些债券,或者在强劲上升趋势中略微增加股票敞口会怎样?我们特意避免跳入复杂的机器学习模型或制度切换技术。这里的目标是适度引入足够的结构以反映现实世界的思维,例如根据近期表现或波动性进行调整。ChatGPT可以处理这些(尽管并非没有问题),但最终它能够建议重新配置投资组合权重或应用基本过滤器以避免重大回撤。通过这些提示,我们获得了以下权益曲线:

    Figure 3: Equity curves for advanced strategies.

    图3:高级策略的权益曲线

    组合与优化

    一旦我们看到主动资产配置策略可以提升表现,下一个挑战是找到一个更平衡的策略——不仅在纸面上表现良好,而且感觉上也稳健且合理。很容易陷入调整参数和选择指标的最佳周期以挤出略高的Sharpe比率,但总有权衡。一种策略在一个周期内看起来很棒,但在另一个周期内可能完全失效。

    为此,我们要求ChatGPT帮助我们通过调整关键参数(在我们的案例中主要是时间框架)来测试策略的不同版本。我们的目的不是盲目优化以获得最佳结果,而是要了解策略对变化的敏感程度。如果参数的小幅变动导致表现大幅波动,那就是一个危险信号。

    最终版本的根据ChatGPT的资产配置策略如下:

    Final Asset Allocation Strategy

    描述的策略具有以下特性:

    策略 年化回报 年化波动率 Sharpe比率 最大回撤 Calmar比率
    Volatility Scaled Momentum 6.49% 11.93% 0.5440 -23.19% 0.2800
    Risk Parity 2.43% 6.59% 0.3686 -16.07% 0.1511
    Dual Momentum 5.32% 11.86% 0.4484 -23.19% 0.2292
    SMA Filter 4.54% 11.46% 0.3959 -35.65% 0.1272
    Adaptive Asset Allocation 6.53% 11.28% 0.5790 -22.41% 0.2915
    Optimized Trend Following 9.58% 12.79% 0.7491 -20.55% 0.4663
    Blended Portfolio 5.83% 9.38% 0.6220 -18.13% 0.3217

    表1:ChatGPT指导下的建议策略回报

    以下是建议的主动策略和最终策略(棕色)的权益曲线:

    Figure 4: Equity curves for advanced strategies compared with analyst-guided strategy.

    图4:高级策略与分析师指导策略的权益曲线对比

    以下是AI执行稳健性测试的结果,以确保我们使用的参数窗口(如回溯周期或再平衡间隔)不是偶然选择导致异常结果的值。

    Figure 5: Robustness tests for ChatGPT strategy

    图5:ChatGPT策略的稳健性测试

    表现良好的方面

    到目前为止,这似乎是一个令人满意的故事,对吧?我们要求ChatGPT提供策略,最后我们得到了一个。相比大约18个月前我们进行的分析,整个过程无疑是一个显著的升级。ChatGPT在量化金融领域表现出色,可以为资产配置策略提出多种变化,并总能为分析的下一步提供建议。量化分析的探索部分处理得很好。ChatGPT是一个AI聊天机器人,因此它能够传达许多想法并进行雄辩的讨论。

    然而,问题来了——它仍然是一个聊天机器人,而不是数据分析师,而且聊天机器人的主要焦点是让你对“聊天”感到满意。这意味着什么?它往往过于乐观和奉承——它不“思考”,它回答问题并试图让你愿意继续对话。很多时候,ChatGPT在提出其想法或分析时犯下极其幼稚的错误;然而,它却将结果呈现为有史以来最好的策略/想法。不断重新检查分析中的各个步骤真的很累人。

    出现的问题

    那么,我们遇到了哪些问题,当您尝试将聊天机器人作为量化金融的助手时应该注意什么?

    数据准备

    我们在处理数据时遇到了一些问题。最初,我们尝试通过ChatGPT直接从互联网获取数据,但这是不可行的——因此我们不得不自己提供数据。这导致了一些意想不到的问题。由于我们使用的日期格式为DD.MM.YYYY,数字的小数分隔符为逗号,ChatGPT在正确解释数据时确实遇到了困难。最可靠的方法是将数据提供为ChatGPT更熟悉的格式——通常日期使用YYYY-MM-DD,小数点使用点号。以这种方式准备数据集将使交互更顺畅,减少分析过程中的误解。

    数据损坏

    在输入的数据集上运行多个模型后,我们遇到了一些问题。在某些情况下,数据顺序意外改变;在其他情况下,数据的大部分被丢失。这导致输出明显不正确或与我们预期不一致。结果如下:

    Figure 6a: Data corruption
    Figure 6b: Data corruption

    图6a和6b:数据损坏

    这个问题与处理我们数据的内存工作方式密切相关。我们经常不得不重新上传相同的数据集,因为它在分析过程中被遗忘或以各种方式损坏(我们不了解损坏的原因)。这将使未来在测试中保持一致性变得更加困难,并突出了在这种设置中处理大型数据集的局限性。

    最终,如果您想进行自己的测试分析,我们强烈建议为聊天机器人提供自己的数据。由于ChatGPT在初始数据处理中容易出错,如果您依赖ChatGPT本身的数据,您将无法发现它所犯的一些错误。

    验证的必要性

    在使用AI创建策略时,您通常希望绘制权益曲线,计算基本绩效指标等。然而,模型可能会以自己的方式解释这些任务,这并不总是符合您的预期。有时问题一眼就能看出来,但更多时候,您需要仔细检查代码。最常见的错误通常出现在数据格式化、策略功能的实现以及回报、风险和回撤的计算方式上。

    另一个相关问题是理论上承诺过多,而在实际代码中交付不足。这通常意味着模型描述了例如由三个规则应用于数据集的策略,但只实现了其中的两个。在我们的案例中,策略本应包含动量、波动率和相关性。然而,相关性未在实现中使用。

    幻觉(Hallucinations)

    在AI的上下文中,这通常指模型生成的信息事实上不正确或捏造,尽管听起来可能合理。——ChatGPT

    在我们的案例中,我们同时探索多种策略,并旨在仅分析其中最成功的表现。这种设置增加了错误被忽视的风险——尤其是当模型看似正确执行每个步骤,但实际上跳过或错误应用了策略逻辑的部分时。如果不仔细审查,这些不一致可能导致对策略有效性的误导性结论。

    Hallucination Example

    当我们获取此策略的代码并进行自己的分析时,我们得到的结果与模型有显著不同。

    指标 数值
    年化回报 1.74%
    年化波动率 2.58%
    Sharpe比率 0.6760
    最大回撤 -7.89%
    Calmar比率 0.2208

    表2:在ChatGPT外部运行代码的结果

    在第二次将数据上传到模型后,它产生的结果与我们的一致。ChatGPT第一次是如何计算出更好的比率的?为什么它们不同?我们不知道。

    这让我们回到了分析过程中的一个重要部分——我们(用户,人类)必须在分析的每一步验证结果。无论这一步看起来多么微小或无关紧要,这都是绝对必要的。ChatGPT有时会产生完全捏造的数字(即使它为计算这些数字所建议的代码是正确的)。

    循环对话

    当我们发现计算的绩效指标有错误时,我们希望了解为什么会发生这种情况。在几次后续提示后,模型围绕各种解释打转——数据差异、策略结构的不一致或参数调整。然而,我们(正确地)指出这些都不适用,因为我们只是运行了ChatGPT提供的确切代码在最初提供的数据集上。即使要求模型在相同输入上重新运行其代码,我们发现自己陷入了一个循环,AI继续回避问题,而不是承认或纠正错误的计算。这表明使用AI调试或测试策略的一个关键限制:虽然它可能看起来自信,但它并不总是能可靠地追溯自身错误的原因。

    如果我们退后一步,仅使用AI进行策略创意头脑风暴,我们可能会遇到类似的问题。模型往往会执着于一个基本概念,并倾向于围绕它构建一切。例如,如果我们从一个基于某个标准选择前N个资产的策略开始,模型可能继续只建议将此选择步骤视为必不可少的变体。除非我们明确表示不想使用该标准,否则它可能会一直是每个新提案的核心部分。这突出了一个常见的局限性:AI倾向于锚定初始方向,除非被明确引导,否则难以探索完全不同的想法。

    过度优化的倾向

    作为分析师,ChatGPT倾向于成为一台优化机器。它给出的建议或认为值得探究的想法往往会为策略增加自由度,因此策略越来越过度优化于过去的数据。ChatGPT(目前)无法很好地泛化,通常选择表现最佳的策略版本,然后寻找为何它是最好的解释,并试图进一步改进。从聊天机器人的角度来看这是合乎逻辑的,但如果你想构建一个稳健的交易策略,这并不是最好的想法。因此,ChatGPT的建议往往价值有限,通常最好提示它朝与它建议不同的方向继续。总的来说,分析时由人类掌舵比盲目依赖聊天机器人要好。

    结论

    人工智能是一个强大的工具,可以协助许多任务。它擅长自上而下地提出想法,为测试起草代码大纲,并在您遇到问题时偶尔帮助您找到新方向。然而,需要记住几个重要的局限性。例如,您仍然需要为分析自行提供数据,仔细检查代码中可能存在的许多错误,并且在未经验证的情况下不要完全信任模型输出的绩效指标(甚至图表)。

    自从我们上一篇文章以来,AI取得了显著进展。它可以帮助自动化工作流程的部分内容并节省宝贵时间。然而,即使有了这些进步,错误的潜力仍然很高。这是您在尝试与之合作时需要计算的风险。AI是一个经典工具,就像一把锋利的刀——您可以用它制作许多有用的东西,或者如果您不知道自己在做什么,就可能割伤自己的手指。

    作者:
    David Belobrad, Quant Analyst, Quantpedia
    Radovan Vojtko, Head of Research, Quantpedia

  • 解锁跨资产潜力:组合构建新方法 [Alpha Architect]

    [“Daily Wraps”] Christian Goulding 和 Campbell Harvey 在其研究《Investment Base Pairs》中提出了一种突破性的组合构建框架,挑战了现代金融学中的传统方法。他们的研究聚焦于利用跨资产信息优化投资策略并提升各类资产的收益。以下是对这项研究的概述:…… – Sun, 01 Jun 2025 05:15:04 +0000 (https://quantocracy.com/redirect.php?key=Z3QuPRKTea&source=feedburner)