AWS Builder 文章

使用 Bedrock AgentCore、Strands Agents 与 Backtrader 构建受治理的 Amazon 交易历史工厂

描述: 生产级 AMZN 研究工厂需要可重复的交易台账、模型风险控制、仅做多政策验证、基准比较、异常处理和可解释分析。构建 Backtrader 策略模板、Amazon Bedrock AgentCore 编排、Strands 治理、AWS 数据血缘以及财务规划披露,用于负责任的机构级头寸管理、FSI 可审计性,以及择时研究与控制。

AMZN 回测文章系列

English 繁体中文 简体中文

描述: 生产级 AMZN 研究工厂需要可重复的交易台账、模型风险控制、仅做多政策验证、基准比较、异常处理和可解释分析。构建 Backtrader 策略模板、Amazon Bedrock AgentCore 编排、Strands 治理、AWS 数据血缘以及财务规划披露,用于负责任的机构级头寸管理、FSI 可审计性,以及择时研究与控制。


免责声明

教育目的:
本文内容仅聚焦于合法的财务规划教育,旨在提升对概念、方法论和分析方法的理解,不推广任何特定证券、策略或市场参与决策。

不构成个性化建议:
本文不提供任何个性化推荐、招揽或保证;在任何情况下,本文教育材料均不明示、暗示或以其他方式表示对未来表现、结果或收益的保证。

数据限制:
由于沙盒环境中无法使用实时数据,上传结果依赖确定性的离线数据,因此输出应被理解为说明性示例,而非实时分析。

仅做多范围:
所有研究表述均限定为仅做多,避免期权、看跌期权、卖空或看空策略,确保讨论整体聚焦于传统资产持有和正向方向性敞口概念。


开篇:将回测转化为交易历史工厂

单次 AMZN 回测可以回答一个研究问题,但机构需要的是可重复的工厂。本文关注每一次获批运行应如何产出相同的证据模式:政策验证、数据集引用、策略版本、参数记录、交易台账、风险摘要、异常日志和审阅备忘录。


定位

本文采用运营模型负责人的口吻,面向量化研究员、风险经理、平台工程师和治理审阅人员。核心信息是:可重复性与策略创造力同样重要。如果两次运行无法通过相同的工件结构进行比较,研究流程就还没有达到委员会审阅标准。


值得解决的客户问题

金融服务团队经常在研究请求与支撑该请求的交易记录之间失去脉络。受治理的工厂通过标准化 AMZN 策略运行的请求、审批、执行、存储和质询方式来解决这一问题。业务问题不仅是分析速度,还包括数月后能否检索到相关证据。


该工作流支持的业务成果

该工厂设计支持可重复的研究受理、标准化交易台账、更清晰的异常处理、一致的工件存储,以及更便捷的独立质询。投资组合团队可以比较策略,风险团队每次都能检查相同字段,技术团队也可以在不拖慢每个研究周期的情况下执行权限控制。


目录

  • 第 1 部分:开篇与市场背景 — 建立 AMZN 择时问题、机构审阅目的、基准意识、披露纪律,以及先证据后配置的框架。
  • 第 2 部分:Agentic 研究架构 — 说明 Bedrock AgentCore 与 Strands 工作流、职责分离、工具权限、审计工件和人工审批边界。
  • 第 3 部分:真实市场数据与基准 — 定义 AMZN 与基准背景、复权 OHLCV 处理、日历对齐、血缘、公司行动和数据质量控制。
  • 第 4 部分:受治理的交易历史工厂实施与代码逻辑 — 将策略逻辑转化为面向机构利益相关方的入场、出场、仓位规模、风险控制和可审阅代码路径语言。
  • 第 5 部分:交易台账制造与头寸管理 — 展示台账字段、回撤审阅、换手率和已实现交易记录如何支持有纪律的头寸管理决策。
  • 第 6 部分:高管结语与治理审阅 — 将技术工作流转换为委员会语言,同时让适当性、实施就绪度和最终决策保留在人类手中。
  • 第 7 部分:工厂治理、数据设置与架构细节 — 将系列重点、Agentic 架构、真实数据设置和治理设计说明归入一个可读的运营模型章节。
  • 第 8 部分:Backtrader Harness、Agent Runtime 与交易历史 Schema — 分离可执行 harness、runtime 草图、择时治理问题和台账 schema,使技术阅读更清晰。
  • 第 9 部分:策略目录与 Backtrader 策略类 — 将策略审阅方法以及 Strategy 16 到 Strategy 20 的代码示例组织为一个策略目录章节。
  • 第 10 部分:高管摘要与最终治理数据说明 — 以委员会可用的摘要语言、生产环境注意事项、最终数据说明和仅限教育边界收尾。

第 1 部分:开篇与市场背景

相关摘要: 建立 AMZN 择时问题,解释为什么回测属于机构审阅范围,并将本文定位为证据生成而非预测。本节将盈利的仅做多头寸与风险纪律、基准意识、披露语言和委员会可用沟通连接起来。

一篇有力的文章应从交易问题开始,而不是从软件开始。仅做多的 Amazon 头寸可能盈利,但仍然受制于择时薄弱、出场纪律不清和敞口过大。因此,本节将回测定位为治理工具,帮助交易台在讨论配置前先解释决策。

先前交付说明中的有用内容在此被吸收为原则:用证据说话,明确假设,避免确定性表述。受众应了解该工作流测试什么、由什么数据支持、可能失败在哪里,以及哪些仍属于人工决策。这比在末尾附上一段重复的实践说明更有力。

市场背景很重要,因为 AMZN 会受到增长偏好、整体股票市场环境、消费者预期、云业务情绪、流动性和估值压力的影响。基准意识可以帮助交易员避免声称每一项收益都来自个股层面的能力。


第 2 部分:Agentic 研究架构

相关摘要: 解释 Bedrock AgentCore、Strands Agents、数据工具、策略生成、Backtrader 执行和结果摘要如何形成受控工作流。本节强调工具权限、职责分离、审计工件,以及任何真实世界投资组合决策前的人工审批。

Agentic 架构分离各项职责。编排器接收请求,数据工具验证 OHLCV 输入,策略生成器准备规则逻辑,Backtrader 工具执行模拟,风险审阅器总结回撤和交易行为,治理检查器验证政策边界。

被吸收后的交付规则体现为架构纪律:每个 agent 动作都应产生证据。一次有用的运行会留下数据引用、代码版本、参数、时间戳、交易台账、指标、图表路径和异常记录。这些工件让投资、技术和风险团队能够审阅输出。

AgentCore 和 Strands Agents 可以加速研究循环,但权限边界至关重要。系统可以运行获批工具并准备备忘录;它不应决定适当性、批准资本配置,或将历史回测转化为业绩承诺。


第 3 部分:真实市场数据与基准

相关摘要: 将 AMZN 定义为研究资产,并将 Nasdaq 100、S&P 500 和 Dow Jones Industrial Average 定义为基准背景。本节解释复权 OHLCV 数据、日历对齐、数据血缘、公司行动处理,以及为什么不应使用编造的市场价格。

数据血缘是一项交易控制。复权价格、公司行动、缺失值、假日日历、供应商变更和基准对齐,都可能改变择时规则的表面行为。本节将数据工程视为投资治理的一部分,而不是后台任务。

AMZN 是可交易资产。Nasdaq 100、S&P 500 和 Dow Jones Industrial Average 分别为增长环境、整体股票风险和蓝筹情绪提供不同视角。工作流应记录为什么使用每个基准,以及每个基准可能在何处造成误导。

本文避免使用编造价格和缺乏支持的业绩主张。如果无法获取数据,应说明限制。如果使用生产数据,应将数据集快照和复权政策与回测工件一并保留。


第 4 部分:受治理的交易历史工厂实施与代码逻辑

相关摘要: 介绍本文使用的策略示例,并解释每条规则如何创建入场和出场条件。本节将信号逻辑与执行逻辑分离,并把代码翻译为通俗的头寸管理控制语言。

策略实施应读起来像一张控制地图。入场逻辑解释为什么开立多头头寸。出场逻辑解释为什么平仓。仓位规模逻辑解释承担多少敞口。风险逻辑解释流程何时覆盖信号。这使非开发人员也能理解代码审阅。

信号逻辑和执行逻辑应保持分离。信号可以识别有利条件,但执行引擎必须检查现有头寸状态、可用现金、佣金、风险止损和目标出场。分离可以提升可审计性并减少隐藏行为。

本文将代码讲解纳入主要策略讨论,而不是作为脱节的说明。每个策略都应根据其台账、回撤、换手率、基准行为和运营可行性来评估,而不是只看标题式收益。

本文特别关注治理、政策验证、交易历史制造、异常处理、工件存储和高管沟通。因此,代码审阅应评估该策略家族是否支持这一业务目标,以及其交易记录是否足够可解释,能够用于机构审阅。


第 5 部分:交易台账制造与头寸管理

相关摘要: 解释交易台账如何通过记录入场、出场、价格、数量、已实现损益、信号原因、回撤行为、换手率和风险调整审阅来支持头寸管理决策。

交易台账是交易台的记忆系统。它记录入场日期、出场日期、价格、数量、总损益、入场原因和出场原因。没有台账,策略只是一个故事。有了台账,委员会可以检查模拟决策的实际序列。

回撤审阅必须先于收益庆祝。一个策略的总收益看起来可能很有吸引力,但在真实压力中却难以持有。台账和回撤路径帮助审阅者判断该规则是否符合授权范围和风险承受能力。

先前的实践说明被吸收到审阅流程中:在得出任何结论前,先解释数据来源、日期范围、策略规则、基准背景、风险指标和台账。本文将其保留在头寸管理章节中,因为它会改变证据的阅读方式。


第 6 部分:高管结语与治理审阅

相关摘要: 将技术工作流转换为委员会语言。本节说明 agents 如何在不替代问责的情况下加速研究,证据应如何被质询,以及专业人员如何继续负责适当性、风险承受能力、数据质量、实施就绪度和最终资本决策。

结语将工厂设计转换为委员会语言。委员会需要知道每次 AMZN 研究运行是否都产生了请求记录、政策结果、数据集引用、策略版本、交易台账、风险摘要、异常日志和保留的工件路径。

agent 不会替代专业人员。Agentic 工具可以标准化执行和存储,但审阅者仍然负责审批、质询、适当性表述和最终资本决策。

有纪律的结语会避免宣传性语言。核心信息是:只有当工件能够被找到、重跑、比较和质询时,才信任这个工厂。


第 7 部分:工厂治理、数据设置与架构细节

相关摘要: 将系列重点、Agentic 架构、真实数据设置和治理设计说明归入一个可读的运营模型章节。

系列重点

本文聚焦于治理、政策验证、交易历史制造和高管沟通。它是四篇技术系列文章中的一篇。该结构已达到发布就绪状态,并避免暴露草稿指令。它保留了演讲辅导的意图,同时将信息转化为面向金融服务受众的精炼章节。


使用 Bedrock AgentCore 与 Strands Agents 的 Agentic 架构

该架构将判断与自动化分离。Quant Orchestrator 接收研究请求并协调专门工具。Strategy Generator 编写或检索 Backtrader 策略类。Market Data Tool 获取 AMZN^NDX^GSPC^DJI 的每日 OHLCV 数据。Risk Summary Agent 计算收益、回撤、敞口、交易次数、胜率、利润因子和相对基准行为。Governance Agent 检查政策边界:仅做多普通股、不使用衍生品、不作缺乏支持的业绩承诺。

该设计适合机构研究,因为它创造了可追溯性。模型不会暗中决定投资组合。相反,agent 调用获批工具,记录输入和输出,并返回一份可由人工委员会质询的备忘录。代码示例使用 Backtrader,因为它提供事件驱动的研究引擎、技术指标、分析器、订单处理和交易统计。


真实数据设置

示例使用 Amazon 普通股作为可交易资产,并使用三个基准指数作为背景:Nasdaq 100 用于增长和科技环境,S&P 500 用于整体美国股票环境,Dow Jones Industrial Average 用于蓝筹风险情绪。在你的环境中运行时,可执行 harness 会通过 yfinance 下载真实的每日数据。本文不编造市场价格或虚构业绩数字。


第 8 部分:Backtrader Harness、Agent Runtime 与交易历史 Schema

相关摘要: 分离可执行 harness、runtime 草图、择时治理问题和台账 schema,使技术阅读更清晰。

用于二十年交易历史的可复用 Backtrader Harness

## file: run_amzn_long_only_backtest.py
## Educational research only. Not investment advice.

import json
from pathlib import Path
from typing import Dict, Type

import backtrader as bt
import pandas as pd
import yfinance as yf

START_DATE = "2006-06-19"
END_DATE = "2026-06-19"
TICKERS = ["AMZN", "^NDX", "^GSPC", "^DJI"]

class TradeLoggerMixin:
    params = dict(risk_per_trade=0.10, stop_loss_pct=0.12, take_profit_pct=0.35)

    def __init__(self):
        self.order = None
        self.entry_price = None
        self.trade_rows = []

    def long_size(self):
        price = self.data0.close[0]
        if price <= 0:
            return 0
        return int((self.broker.getcash() * self.p.risk_per_trade) / price)

    def buy_long(self, reason):
        if self.position or self.order:
            return
        size = self.long_size()
        if size > 0:
            self.entry_reason = reason
            self.order = self.buy(size=size)

    def close_long(self, reason):
        if self.position and not self.order:
            self.exit_reason = reason
            self.order = self.close()

    def risk_exit_check(self):
        if not self.position or self.entry_price is None:
            return
        close = self.data0.close[0]
        if close <= self.entry_price * (1 - self.p.stop_loss_pct):
            self.close_long("risk_stop")
        elif close >= self.entry_price * (1 + self.p.take_profit_pct):
            self.close_long("profit_target")

    def notify_order(self, order):
        if order.status == order.Completed:
            dt = self.data0.datetime.date(0).isoformat()
            if order.isbuy():
                self.entry_date = dt
                self.entry_price = order.executed.price
                self.entry_size = order.executed.size
            else:
                exit_price = order.executed.price
                pnl = (exit_price - self.entry_price) * self.entry_size
                self.trade_rows.append({
                    "entry_date": self.entry_date,
                    "exit_date": dt,
                    "entry_price": round(self.entry_price, 4),
                    "exit_price": round(exit_price, 4),
                    "size": int(self.entry_size),
                    "gross_pnl": round(pnl, 2),
                    "entry_reason": getattr(self, "entry_reason", "signal"),
                    "exit_reason": getattr(self, "exit_reason", "signal"),
                })
                self.entry_price = None
            self.order = None
        elif order.status in [order.Canceled, order.Margin, order.Rejected]:
            self.order = None

    def stop(self):
        self.rets = list(self.trade_rows)

def download_data() -> Dict[str, pd.DataFrame]:
    raw = yf.download(TICKERS, start=START_DATE, end=END_DATE, auto_adjust=True, group_by="ticker", progress=False)
    out = {}
    for ticker in TICKERS:
        frame = raw[ticker].dropna().copy()
        frame.columns = [c.lower() for c in frame.columns]
        frame.index = pd.to_datetime(frame.index)
        out[ticker] = frame
    return out

def run_backtest(strategy_cls: Type[bt.Strategy], strategy_name: str, cash: float = 100000.0):
    data = download_data()
    cerebro = bt.Cerebro(stdstats=False)
    cerebro.broker.setcash(cash)
    cerebro.broker.setcommission(commission=0.0005)
    cerebro.adddata(bt.feeds.PandasData(dataname=data["AMZN"]), name="AMZN")
    cerebro.adddata(bt.feeds.PandasData(dataname=data["^NDX"]), name="NDX")
    cerebro.adddata(bt.feeds.PandasData(dataname=data["^GSPC"]), name="SPX")
    cerebro.adddata(bt.feeds.PandasData(dataname=data["^DJI"]), name="DJI")
    cerebro.addstrategy(strategy_cls)
    cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name="sharpe", timeframe=bt.TimeFrame.Days)
    cerebro.addanalyzer(bt.analyzers.DrawDown, _name="drawdown")
    cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name="trades")
    result = cerebro.run()[0]
    final_value = cerebro.broker.getvalue()
    out_dir = Path("backtest_outputs")
    out_dir.mkdir(exist_ok=True)
    trade_file = out_dir / f"{strategy_name}_trade_history_2006_2026.csv"
    pd.DataFrame(getattr(result, "rets", [])).to_csv(trade_file, index=False)
    report = {
        "strategy": strategy_name,
        "start": START_DATE,
        "end": END_DATE,
        "initial_cash": cash,
        "final_value": final_value,
        "total_return_pct": round((final_value / cash - 1) * 100, 2),
        "sharpe": result.analyzers.sharpe.get_analysis(),
        "drawdown": result.analyzers.drawdown.get_analysis(),
        "trade_analyzer": result.analyzers.trades.get_analysis(),
        "trade_history_file": str(trade_file),
    }
    with open(out_dir / f"{strategy_name}_summary.json", "w") as f:
        json.dump(report, f, indent=2, default=str)
    return report

Agent Runtime 草图

## file: quant_agent_runtime.py
## Illustrative pattern; adapt IAM, networking, approvals, and logging for production.

from bedrock_agentcore import BedrockAgentCoreApp
from strands import Agent, tool

app = BedrockAgentCoreApp()

ALLOWED = {
    "breakout_55": "Breakout55Strategy",
    "ema_cross": "EMACrossStrategy",
    "multi_factor": "MultiFactorEnsembleStrategy",
}

@tool
def validate_policy(strategy_key: str, side: str, derivatives: bool) -> dict:
    if side.lower() != "long_only":
        return {"ok": False, "reason": "Only long-only equity research is allowed."}
    if derivatives:
        return {"ok": False, "reason": "Derivative instruments are outside this workflow."}
    if strategy_key not in ALLOWED:
        return {"ok": False, "reason": "Strategy is not approved in the registry."}
    return {"ok": True, "reason": "Policy accepted."}

@tool
def run_registered_backtest(strategy_key: str) -> dict:
    return {"status": "submitted", "strategy": ALLOWED[strategy_key], "artifact_prefix": f"s3://research/amzn/{strategy_key}/"}

agent = Agent(tools=[validate_policy, run_registered_backtest])

@app.entrypoint
def invoke(payload):
    return agent(payload.get("request", "Run approved AMZN long-only backtest."))

if __name__ == "__main__":
    app.run()

业务问题:择时是治理问题

Amazon 头寸在长期维度上可能盈利,但仍然可能管理不佳。因此,机构需要流程语言,而不仅是业绩语言。研究团队应展示买入了什么、何时买入、为什么买入、何时卖出、为什么卖出,以及该决策相对于主要股票基准的表现。Agentic 工作流让这些证据更容易生成,也更容易被质询。


二十年交易历史 Schema

含义
entry_date 模拟 AMZN 多头头寸开立时的交易日期
exit_date 模拟 AMZN 多头头寸平仓时的交易日期
entry_price Backtrader 模拟入场价格
exit_price Backtrader 模拟出场价格
size 模拟头寸中的 AMZN 股数
gross_pnl 税费和额外实施成本前的总损益
entry_reason 触发入场的信号标签
exit_reason 触发出场的信号、目标或风险控制标签

交易历史很重要,因为它能防止模糊叙事。委员会可以检查利润是来自许多可重复交易还是某个异常时期,出场是否在熊市环境中降低损害,基准过滤是否有帮助,以及换手率能否承受现实的实施成本。


高管表达结语

最终信息聚焦于工厂本身:如果流程无法重复,一次有用的回测并不足够。AgentCore 和 Strands Agents 可以帮助制造一致的审阅记录,而 Backtrader 可以生成交易台账。人工审阅者仍需决定证据是否完整。


来源与数据说明

  • 真实数据工作流:可执行示例使用 yfinance 下载 AMZN^NDX^GSPC^DJI 的每日 OHLCV 数据。
  • 时间范围:2006-06-192026-06-19,受市场假日和数据提供商可用性限制。
  • AWS 设计模式:Bedrock AgentCore runtime 用于 agent 编排,Strands Agents 用于工具协调,AWS 受治理数据模式用于血缘、访问和工件存储。
  • 仅限教育:不构成个性化建议,不构成招揽,也不保证业绩。

主文应用细节 1:交易历史工厂设计

受治理的工厂每次都会创建相同的工件模式:输入记录、策略版本、参数、数据快照、交易台账、风险指标、图表包、异常日志和审阅备忘录。可重复性才是重点。


主文应用细节 2:执行前的政策验证

政策验证应在回测运行前进行。工作流应确认标的范围、仅做多行为、获准的策略键,以及不存在缺乏支持的工具逻辑。这可以防止研究输出违反运营边界。


主文应用细节 3:将异常处理作为治理

数据下载失败、缺失基准、零交易策略、订单被拒或分析器错误,都应成为可见异常。工厂不应把运营问题隐藏在润色后的摘要后面。


主文应用细节 4:工件存储与检索

工厂的价值在于检索。委员会应能够找到产生某项陈述的准确台账、图表、代码和参数集。这正是 AWS 数据控制和 agent 日志成为业务证据的地方。


主文应用细节 5:高管沟通层

高管层摘要应说明发生了什么,但不能过度宣称。它应展示测试了什么、应用了哪些控制、生成了哪些记录、哪些地方失败,以及哪些决策仍由人类作出。


主文应用细节 6:审计就绪生命周期

审计就绪的生命周期涵盖请求、验证、执行、审阅、审批、留存和重跑。本文将工厂定位为一个生命周期,而不仅仅是代码 notebook。


机构审阅视角 1:证据包设计

完整的证据包应包括研究问题、数据来源、复权政策、标的列表、代码版本、参数集、交易台账、回撤画像、指标摘要、异常日志和披露语言。这使投资、风险、技术和合规团队都能审阅回测。


机构审阅视角 2:人工质询工作流

当工作流能够引发质询时,它才算成功。审阅者应询问数据是否干净、规则是否具有经济逻辑、基准是否合适、参数是否稳定、成本是否现实,以及结论是否被限定在证据支持的范围内。


机构审阅视角 3:仅做多政策边界

本文将政策边界保持为仅做多。该边界让工作流聚焦于择时、仓位规模、出场和证据质量,而不是复杂工具构造。它也为治理 agent 提供了拒绝不受支持请求的明确规则。


机构审阅视角 4:图表与台账解读

图表有用,但台账才是审计轨迹。权益曲线可能掩盖集中度,单一收益数字可能掩盖换手率。因此,本文将图表、台账和指标视为互补证据,而不是可相互替代的证明。


机构审阅视角 5:生产就绪检查清单

notebook 并不等于生产环境。生产就绪需要受控数据访问、版本化代码、参数记录、可重复运行、异常处理、工件存储、审批工作流和监控。Agentic 工具应支持这些控制,而不是绕过它们。


机构审阅视角 6:失败模式披露

专业文章应尽早说明失败模式。趋势规则可能来回打脸,动量可能衰竭,波动率过滤器可能滞后,基准过滤器可能排除快速复苏。点明这些风险可以提升可信度,并帮助委员会准备有用的问题。


第 9 部分:策略目录与 Backtrader 策略类

相关摘要: 将策略审阅方法以及 Strategy 16 到 Strategy 20 的代码示例组织为一个策略目录章节。

阅读记录前的策略审阅方法

在阅读策略记录前,对每条规则使用相同的证据顺序:确认数据、识别入场条件、识别出场条件、检查仓位规模假设、审阅回撤、比较基准行为,并记录经验教训。这句话将重复的交付说明转化为文章内部使用的方法。


本文策略目录

  • Strategy 16: StochasticStrengthStrategy — 随机指标强度延续。
  • Strategy 17: CCIMomentumStrategy — Commodity Channel Index 动量入场。
  • Strategy 18: IchimokuLongStrategy — Ichimoku 云趋势过滤。
  • Strategy 19: ParabolicSARStrategy — Parabolic SAR 趋势跟随入场。
  • Strategy 20: MultiFactorEnsembleStrategy — 趋势、动量和市场环境组合。

Strategy 16: StochasticStrengthStrategy

研究目的。 随机指标强度延续。该策略被编写为仅做多 AMZN 择时示例。它可以开立多头头寸、平掉多头头寸,或保持现金状态。它不会创建空头敞口,也不使用期权、看跌期权、互换、期货、保证金或其他衍生工具。

头寸管理审阅。 对于 StochasticStrengthStrategy,交易台应评估随机指标强度延续在考虑成本、回撤和基准背景后,是否增加了有用的择时证据。审阅应检查该规则的交易频率、出场是否可理解、持有期是否符合授权范围,以及该信号是否提供了超越在所有市场环境中简单持有 AMZN 的洞察。

Backtrader 代码。 将此类添加到可复用 harness 下方,然后在受控研究环境中运行 run_backtest(StochasticStrengthStrategy, "StochasticStrengthStrategy")

class StochasticStrengthStrategy(TradeLoggerMixin, bt.Strategy):
    params = dict(period=14, period_dfast=3, risk_per_trade=0.07)
    def __init__(self):
        TradeLoggerMixin.__init__(self)
        self.stoch = bt.ind.StochasticFast(self.data0, period=self.p.period, period_dfast=self.p.period_dfast)
        self.trend = bt.ind.SMA(self.data0.close, period=100)
    def next(self):
        self.risk_exit_check()
        if not self.position and self.data0.close[0] > self.trend[0] and self.stoch.percK[0] > self.stoch.percD[0] and self.stoch.percK[-1] <= self.stoch.percD[-1]:
            self.buy_long("stochastic_strength_cross")
        elif self.position and self.stoch.percK[0] < self.stoch.percD[0]:
            self.close_long("stochastic_cross_exit")

针对 StochasticStrengthStrategy 的 agent 审阅应总结该特定策略运行的信号路径、台账完整性、风险控制活动和仅做多政策状态。


Strategy 17: CCIMomentumStrategy

研究目的。 Commodity Channel Index 动量入场。该策略被编写为仅做多 AMZN 择时示例。它可以开立多头头寸、平掉多头头寸,或保持现金状态。它不会创建空头敞口,也不使用期权、看跌期权、互换、期货、保证金或其他衍生工具。

头寸管理审阅。 对于 CCIMomentumStrategy,交易台应评估 Commodity Channel Index 动量入场在考虑成本、回撤和基准背景后,是否增加了有用的择时证据。审阅应检查该规则的交易频率、出场是否可理解、持有期是否符合授权范围,以及该信号是否提供了超越在所有市场环境中简单持有 AMZN 的洞察。

Backtrader 代码。 将此类添加到可复用 harness 下方,然后在受控研究环境中运行 run_backtest(CCIMomentumStrategy, "CCIMomentumStrategy")

class CCIMomentumStrategy(TradeLoggerMixin, bt.Strategy):
    params = dict(period=20, entry=100, exit=0, risk_per_trade=0.07)
    def __init__(self):
        TradeLoggerMixin.__init__(self)
        self.cci = bt.ind.CCI(self.data0, period=self.p.period)
    def next(self):
        self.risk_exit_check()
        if not self.position and self.cci[0] > self.p.entry and self.cci[-1] <= self.p.entry:
            self.buy_long("cci_momentum_break")
        elif self.position and self.cci[0] < self.p.exit:
            self.close_long("cci_zero_exit")

针对 CCIMomentumStrategy 的 agent 审阅应总结该特定策略运行的信号路径、台账完整性、风险控制活动和仅做多政策状态。


Strategy 18: IchimokuLongStrategy

研究目的。 Ichimoku 云趋势过滤。该策略被编写为仅做多 AMZN 择时示例。它可以开立多头头寸、平掉多头头寸,或保持现金状态。它不会创建空头敞口,也不使用期权、看跌期权、互换、期货、保证金或其他衍生工具。

头寸管理审阅。 对于 IchimokuLongStrategy,交易台应评估 Ichimoku 云趋势过滤在考虑成本、回撤和基准背景后,是否增加了有用的择时证据。审阅应检查该规则的交易频率、出场是否可理解、持有期是否符合授权范围,以及该信号是否提供了超越在所有市场环境中简单持有 AMZN 的洞察。

Backtrader 代码。 将此类添加到可复用 harness 下方,然后在受控研究环境中运行 run_backtest(IchimokuLongStrategy, "IchimokuLongStrategy")

class IchimokuLongStrategy(TradeLoggerMixin, bt.Strategy):
    params = dict(risk_per_trade=0.08)
    def __init__(self):
        TradeLoggerMixin.__init__(self)
        self.ichi = bt.ind.Ichimoku(self.data0)
    def next(self):
        self.risk_exit_check()
        cloud_top = max(self.ichi.senkou_span_a[0], self.ichi.senkou_span_b[0])
        cloud_bottom = min(self.ichi.senkou_span_a[0], self.ichi.senkou_span_b[0])
        if not self.position and self.data0.close[0] > cloud_top and self.ichi.tenkan_sen[0] > self.ichi.kijun_sen[0]:
            self.buy_long("ichimoku_cloud_break")
        elif self.position and self.data0.close[0] < cloud_bottom:
            self.close_long("ichimoku_cloud_exit")

针对 IchimokuLongStrategy 的 agent 审阅应总结该特定策略运行的信号路径、台账完整性、风险控制活动和仅做多政策状态。


Strategy 19: ParabolicSARStrategy

研究目的。 Parabolic SAR 趋势跟随入场。该策略被编写为仅做多 AMZN 择时示例。它可以开立多头头寸、平掉多头头寸,或保持现金状态。它不会创建空头敞口,也不使用期权、看跌期权、互换、期货、保证金或其他衍生工具。

头寸管理审阅。 对于 ParabolicSARStrategy,交易台应评估 Parabolic SAR 趋势跟随入场在考虑成本、回撤和基准背景后,是否增加了有用的择时证据。审阅应检查该规则的交易频率、出场是否可理解、持有期是否符合授权范围,以及该信号是否提供了超越在所有市场环境中简单持有 AMZN 的洞察。

Backtrader 代码。 将此类添加到可复用 harness 下方,然后在受控研究环境中运行 run_backtest(ParabolicSARStrategy, "ParabolicSARStrategy")

class ParabolicSARStrategy(TradeLoggerMixin, bt.Strategy):
    params = dict(af=0.02, afmax=0.20, risk_per_trade=0.07)
    def __init__(self):
        TradeLoggerMixin.__init__(self)
        self.psar = bt.ind.ParabolicSAR(self.data0, af=self.p.af, afmax=self.p.afmax)
    def next(self):
        self.risk_exit_check()
        if not self.position and self.data0.close[0] > self.psar[0] and self.data0.close[-1] <= self.psar[-1]:
            self.buy_long("psar_flip_positive")
        elif self.position and self.data0.close[0] < self.psar[0]:
            self.close_long("psar_flip_exit")

针对 ParabolicSARStrategy 的 agent 审阅应总结该特定策略运行的信号路径、台账完整性、风险控制活动和仅做多政策状态。


Strategy 20: MultiFactorEnsembleStrategy

研究目的。 趋势、动量和市场环境组合。该策略被编写为仅做多 AMZN 择时示例。它可以开立多头头寸、平掉多头头寸,或保持现金状态。它不会创建空头敞口,也不使用期权、看跌期权、互换、期货、保证金或其他衍生工具。

头寸管理审阅。 对于 MultiFactorEnsembleStrategy,交易台应评估趋势、动量和市场环境组合在考虑成本、回撤和基准背景后,是否增加了有用的择时证据。审阅应检查该规则的交易频率、出场是否可理解、持有期是否符合授权范围,以及该信号是否提供了超越在所有市场环境中简单持有 AMZN 的洞察。

Backtrader 代码。 将此类添加到可复用 harness 下方,然后在受控研究环境中运行 run_backtest(MultiFactorEnsembleStrategy, "MultiFactorEnsembleStrategy")

class MultiFactorEnsembleStrategy(TradeLoggerMixin, bt.Strategy):
    params = dict(risk_per_trade=0.09)
    def __init__(self):
        TradeLoggerMixin.__init__(self)
        self.ma50 = bt.ind.SMA(self.data0.close, period=50)
        self.ma200 = bt.ind.SMA(self.data0.close, period=200)
        self.rsi = bt.ind.RSI(self.data0.close, period=14)
        self.macd = bt.ind.MACD(self.data0.close)
        self.spx200 = bt.ind.SMA(self.data2.close, period=200)
    def next(self):
        self.risk_exit_check()
        score = int(self.data0.close[0] > self.ma50[0]) + int(self.ma50[0] > self.ma200[0]) + int(self.rsi[0] > 50) + int(self.macd.macd[0] > self.macd.signal[0]) + int(self.data2.close[0] > self.spx200[0])
        if not self.position and score >= 4:
            self.buy_long("ensemble_score_entry")
        elif self.position and score <= 2:
            self.close_long("ensemble_score_exit")

针对 MultiFactorEnsembleStrategy 的 agent 审阅应总结该特定策略运行的信号路径、台账完整性、风险控制活动和仅做多政策状态。


第 10 部分:高管摘要与最终治理数据说明

相关摘要: 以委员会可用的摘要语言、生产环境注意事项、最终数据说明和仅限教育边界收尾。

委员会使用的高管摘要

这篇工厂文章应被理解为运营模型设计,而不是寻找某个首选 AMZN 信号。它的核心问题是,每次策略运行是否留下足够证据,用于重跑、质询、留存和比较。

最终决策仍由人类作出。Agentic 工具可以标准化请求处理、政策检查、台账生成和工件存储,但不能决定所生成的证据是否足以支持投资组合行动。


最终治理数据说明

  • 真实数据工作流:可执行示例应使用获批的 AMZN、Nasdaq 100、S&P 500 和 Dow Jones Industrial Average 每日 OHLCV 数据。
  • 时间范围:示例设计使用二十年研究窗口,并应在每次运行中记录准确的开始和结束日期。
  • AWS 设计模式:Bedrock AgentCore runtime 可以承载 agent 编排,而 Strands Agents 可以协调工具使用和结果审阅。
  • 仅限教育:不构成个性化建议,不构成招揽,也不保证业绩。