当前位置:首页>python>一键回测整个策略库:让 Python 帮你自动筛选交易策略

一键回测整个策略库:让 Python 帮你自动筛选交易策略

  • 2026-06-27 16:47:37
一键回测整个策略库:让 Python 帮你自动筛选交易策略

用 Python 揭秘均值回归策略:你的收益从何而来?

2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含 500 篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!

引言

测试一个交易策略很有用,但当你的研究真正变得「认真」起来时,往往意味着你手里已经有了一堆策略文件、多个优化器和不同的参数空间。

如果还要一个文件一个文件地手动跑回测,这个过程会很快变得枯燥且低效。一个自然的想法是:能不能写一个脚本,把「一整个文件夹的策略」自动变成「一次完整的研究运行」?

本文就来拆解这样一个自动化回测脚本的实现思路。它能够自动下载行情数据、发现每个策略模块、运行各自的优化器、与买入持有(Buy and Hold)基准对比、保存单独结果、导出资金曲线图、记录失败项,并最终生成一张排名汇总表。对正在学习 Python 量化的同学来说,这是一个非常完整的工程实践范例。


一、整体目标:从「单个文件」到「研究流水线」

这个脚本要解决的核心痛点是:规模化

它的工作流程可以概括为下面这几步:

  1. 1. 选择资产和时间周期
  2. 2. 下载 OHLCV 行情数据
  3. 3. 清洗 K 线数据
  4. 4. 创建买入持有基准
  5. 5. 自动发现每一个策略模块
  6. 6. 运行每个优化器
  7. 7. 保存每个策略的优化结果
  8. 8. 保存「策略 vs 基准」资金曲线图
  9. 9. 提取最优参数与指标
  10. 10. 记录失败项但不中断整个运行
  11. 11. 按收益对完成的策略排序
  12. 12. 导出汇总 CSV 并打印 Top 结果

简单来说,它把一个装满策略文件的文件夹,变成了一份带排名的研究报告。


二、干净的研究起点:导入与基础配置

脚本开头导入了自动化、绘图、数据处理和策略执行所需的工具。

from pathlib import Path   # 管理文件夹与输出路径
import
 argparse            # 处理命令行参数
import
 importlib           # 动态加载策略文件(关键)
import
 re                  # 正则,用于清洗文件名
import
 shutil              # 文件夹操作(删除/重建)

import
 matplotlib
matplotlib.use("Agg")     # 使用非交互式后端,适合在服务器/批处理中保存图片
import
 matplotlib.pyplot as plt

import
 pandas as pd        # 处理结果表格
import
 yfinance as yf      # 下载行情数据

# 让所有策略使用统一的初始资金

from
 vectorbt_strategies.strategy_opt_utils import DEFAULT_INIT_CASH

这里几个核心库的分工很清晰:

  • • importlib:让脚本能够动态加载策略文件,这是「自动发现」的基础
  • • Path:管理文件夹与输出路径
  • • pandas:处理结果表格
  • • yfinance:下载市场数据
  • • matplotlib:绘制资金曲线图

补充说明matplotlib.use("Agg") 必须放在 import matplotlib.pyplot之前调用,这是新手常踩的坑。Agg 是一个不依赖图形界面的后端,专门用来把图片直接保存成文件,非常适合批量运行的场景。

接着定义默认的资产和周期:

asset = "BTC-USD"            # 默认测试比特币
period = "1y"                # 默认回测一年
INIT_CASH = DEFAULT_INIT_CASH  # 统一的初始资金,保证横向可比

默认测试比特币一年的数据,这些值之后可以通过命令行修改,但默认值让脚本「开箱即跑」。


三、排除核心工具模块

策略文件夹里并不是每个 .py 都是「可交易策略」,有些是工具、注册表、调度器或包初始化文件。脚本用一个集合把它们排除掉:

CORE_MODULES = {
    "__init__"
,
    "strategy_opt_utils"
,
    "strategy_registry"
,
    "strategy_dispatcher"
,
}

如果没有这层过滤,脚本可能会去「优化」一个根本不包含策略的辅助文件,导致报错。


四、几个实用的小工具函数

1. 生成安全的文件名

策略名里可能包含空格、符号等不适合做文件路径的字符,需要先「清洗」:

def safe_name(text: str) -> str:
    # 把非字母数字、下划线、点、连字符的字符统一替换为下划线

    return
 re.sub(r"[^A-Za-z0-9_.-]+", "_", text).strip("_")

这样可以让文件名保持可预测,避免保存 CSV 或图片时出现损坏的路径。

2. 展平 yFinance 的多级列

Yahoo Finance 有时会返回多级索引(MultiIndex)列,尤其在分组下载时。脚本会先把它展平:

def flatten_yfinance_columns(data: pd.DataFrame) -> pd.DataFrame:
    if
 isinstance(data.columns, pd.MultiIndex):
        # 如果第二级只有一个取值,去掉第二级

        if
 len(data.columns.get_level_values(1).unique()) == 1:
            data = data.droplevel(1, axis=1)
        # 如果第一级只有一个取值,去掉第一级

        elif
 len(data.columns.get_level_values(0).unique()) == 1:
            data = data.droplevel(0, axis=1)
    return
 data

脚本后续期望的是 OpenHighLowCloseVolume 这样的简单列名,而不是嵌套结构。


五、下载并标准化 OHLCV 数据

数据下载函数负责拉取历史 K 线,并把结果标准化:

def download_ohlcv(symbol: str, period: str, interval: str) -> pd.DataFrame:
    data = yf.download(symbol, period=period, interval=interval, auto_adjust=False)
    data = flatten_yfinance_columns(data)

    # 如果没有返回任何数据,立刻报错,而不是让空数据悄悄流入优化器

    if
 data.empty:
        raise
 ValueError(f"No data returned for {symbol}")

    data = data.dropna(subset=["Close"]).copy()
    close = data["Close"].astype(float)

    # 若 Open/High/Low 缺失,则用 Close 相关值补齐

    data["Open"] = data.get("Open", close.shift(1)).reindex(close.index)\
        .fillna(close.shift(1)).fillna(close).astype(float)
    data["High"] = data.get("High", close).reindex(close.index)\
        .fillna(close).astype(float)
    data["Low"] = data.get("Low", close).reindex(close.index)\
        .fillna(close).astype(float)
    data["Close"] = close

    # 若 Volume 缺失,则填 0

    if
 "Volume" in data.columns:
        data["Volume"] = data["Volume"].reindex(close.index).fillna(0).astype(float)
    else
:
        data["Volume"] = 0.0

    return
 data[["Open", "High", "Low", "Close", "Volume"]]

这个函数确保每个策略都拿到结构一致、完整的 DataFrame。缺失值能补则补,从而让脚本在面对不同资产和数据怪癖时更加稳健。

易错点提醒:「空数据直接报错」是一个很好的工程习惯。如果让空 DataFrame 一路流进优化器,往往会在很深的调用栈里报出莫名其妙的错误,排查起来非常痛苦。在源头就拦截,能省下大量调试时间。


六、构建买入持有基准

没有基准的策略结果几乎没有意义。脚本用同样的收盘价构建一条买入持有资金曲线:

def buy_and_hold_equity(data: pd.DataFrame) -> pd.Series:
    close = data["Close"].astype(float).dropna()
    if
 close.empty:
        raise
 ValueError("Cannot build buy-and-hold benchmark from empty Close data")
    # 用同样的初始资金,按收盘价比例增长

    return
 (INIT_CASH * close / close.iloc[0]).rename("Buy and Hold")

它和每个策略使用相同的初始资金,这样就能直接对比「优化后的策略」与「单纯持有资产」的差别。


七、保存资金曲线图

每个完成的策略都会生成一张资金曲线图:

def save_equity_plot(result, output_dir: Path, symbol: str, period: str, benchmark_equity):
    portfolio = result.best_portfolio       # 取出最优组合
    strategy_equity = portfolio.value()     # 策略的资金曲线

    fig, ax = plt.subplots(figsize=(12, 6))
    # 绘制优化策略曲线

    ax.plot(strategy_equity.index, strategy_equity.values,
            label="Optimized Strategy", linewidth=2.5)
    # 绘制买入持有基准(虚线)

    ax.plot(benchmark_equity.index, benchmark_equity.values,
            label="Buy and Hold", linestyle="--", linewidth=2.2)

    ax.set_title(f"{symbol} {period} - {result.name}")
    ax.set_ylabel("Portfolio Value")
    ax.grid(True, alpha=0.3)
    ax.legend()
    fig.tight_layout()

    # 用安全文件名保存图片

    path = output_dir / f"{safe_name(result.name)}_equity_vs_buy_hold.png"
    fig.savefig(path, dpi=160)
    plt.close(fig)
    return
 path

为什么图很重要?因为一张 CSV 也许会告诉你某个策略收益不错,但图能揭示难看的回撤、漫长的横盘期,或者明显跑输基准的事实


八、自动发现策略模块(核心自动化)

这是整个脚本最关键的一步。它不再手动 import 每个策略文件,而是直接扫描 vectorbt_strategies 文件夹:

def discover_strategy_modules():
    strategy_dir = Path(__file__).resolve().parent / "vectorbt_strategies"
    modules = []
    for
 path in sorted(strategy_dir.glob("*.py")):
        # 跳过核心工具模块

        if
 path.stem in CORE_MODULES:
            continue

        # 动态导入策略模块

        modules.append(importlib.import_module(f"vectorbt_strategies.{path.stem}"))
    return
 modules

这正是脚本可扩展的精髓所在:只要往文件夹里新增一个符合接口约定的策略文件,脚本就能自动发现它,让它成为整次回测的一部分,无需改动主程序。


九、命令行控制:同一引擎,不同数据

脚本支持命令行参数,让你在不同市场和时间周期上复用同一套逻辑:

parser = argparse.ArgumentParser(
    description="Backtest all clean vectorbt strategy optimizers on one download"
)
parser.add_argument("--symbol", default=f"{asset}")
parser.add_argument("--period", default=f"{period}")
parser.add_argument("--interval", default="1d")
args = parser.parse_args()

于是你可以这样跑:

# 测试以太坊,2 年,日线
python backtest_all_strategies.py --symbol ETH-USD --period 2y --interval 1d

# 测试苹果股票,5 年,日线

python backtest_all_strategies.py --symbol AAPL --period 5y --interval 1d

引擎不变,变的只是数据集。


十、创建干净的输出目录

每次运行都会创建一个全新的输出目录,避免新旧结果混在一起:

folder_name = f"{safe_name(args.symbol)}-{safe_name(args.period)}"
output_dir = Path(folder_name)

# 如果目录已存在,先删除再重建,保证干净

if
 output_dir.exists():
    shutil.rmtree(output_dir)
output_dir.mkdir(exist_ok=True)

# 单独存放每个策略优化结果的子目录

per_strategy_dir = output_dir / "per_strategy_results"
per_strategy_dir.mkdir(exist_ok=True)

十一、案例:完整跑通一个策略

下面把「下载数据 → 跑策略 → 存结果」这一条主线串起来看。

1. 下载数据并保存基准

print(f"Downloading {args.symbol} for {args.period} at {args.interval}...")
data = download_ohlcv(args.symbol, args.period, args.interval)

# 构建基准并计算基准收益率

benchmark_equity = buy_and_hold_equity(data)
benchmark_return_pct = (benchmark_equity.iloc[-1] / benchmark_equity.iloc[0] - 1) * 100

# 保存原始数据和基准曲线,保证可复现

data.to_csv(output_dir / "data.csv")
benchmark_equity.to_csv(output_dir / "buy_and_hold_equity.csv", header=True)

2. 遍历每个策略并运行优化器

strategy_modules = discover_strategy_modules()
summary_rows = []   # 汇总排名数据
failures = []       # 失败记录

for
 module in strategy_modules:
    # 优先取 STRATEGY_NAME,否则用模块名

    strategy_name = getattr(module, "STRATEGY_NAME", module.__name__.split(".")[-1])
    print
(f"Backtesting {strategy_name}...")

    try
:
        # 每个模块都需暴露 optimize_strategy 函数

        result = module.optimize_strategy(data, optimize_for="total_return_pct")

        # 给结果补充初始资金和基准收益

        result.results["init_cash"] = INIT_CASH
        result.results["benchmark_return_pct"] = benchmark_return_pct

        # 保存该策略的优化结果表

        result.results.to_csv(
            per_strategy_dir / f"{safe_name(result.name)}_optimization_results.csv",
            index=False
        )

        # 保存资金曲线图

        plot_path = save_equity_plot(
            result, output_dir, args.symbol, args.period, benchmark_equity
        )

        # 取出最优一行

        best_row = result.results.iloc[0].to_dict()

        # 追加一条汇总行

        summary_rows.append({
            "strategy"
: result.name,
            "plot"
: str(plot_path),
            "init_cash"
: INIT_CASH,
            **{f"best_{key}": value for key, value in result.best_params.items()},
            "total_return_pct"
: best_row.get("total_return_pct"),
            "benchmark_return_pct"
: benchmark_return_pct,
            "sharpe"
: best_row.get("sharpe"),
            "rank_score"
: best_row.get("_rank_score"),
            "max_drawdown_pct"
: best_row.get("max_drawdown_pct"),
            "total_trades"
: best_row.get("total_trades"),
            "end_value"
: best_row.get("end_value"),
        })

    except
 Exception as exc:
        # 一个策略失败,不影响整体运行

        failures.append({"strategy": strategy_name, "error": str(exc)})
        print
(f"FAILED {strategy_name}: {exc}")

这里有两个关键设计值得学习:

  • • 统一接口约定:每个策略模块都暴露一个 optimize_strategy 函数,主程序只需按同一方式调用即可,这就是「面向接口编程」的思想。
  • • 失败隔离:用 try / except 把单个策略的异常隔离开。对于大型策略库来说,一个坏掉的模块不应该拖垮整次研究运行,记录下来继续跑就好。

十二、生成最终排行榜

所有模块测试完后,脚本构建汇总 DataFrame 并按收益排序:

summary = pd.DataFrame(summary_rows)
if
 not summary.empty:
    # 按总收益降序排列,缺失值排最后

    summary = summary.sort_values(
        "total_return_pct"
, ascending=False, na_position="last"
    )

# 保存汇总表和失败表

summary.to_csv(output_dir / "summary.csv", index=False)
pd.DataFrame(
    failures, columns=["strategy", "error"]
).to_csv(output_dir / "failures.csv", index=False)

运行结束后,输出文件夹里会包含:

  • • data.csv(原始数据)
  • • buy_and_hold_equity.csv(基准曲线)
  • • summary.csv(排名汇总)
  • • failures.csv(失败记录)
  • • 每个策略的优化结果 CSV
  • • 每个策略的「资金 vs 买入持有」对比图

这就是一份完整的多策略回测报告。

最后,脚本还会在终端直接打印 Top 结果,省去手动打开 CSV 的麻烦:

print(f"\nSaved backtest folder: {output_dir.resolve()}")
print
(f"Strategies completed: {len(summary_rows)}")
print
(f"Strategies failed: {len(failures)}")

if
 not summary.empty:
    print
("\nTop strategies by total return:")
    print
(
        summary[[
            "strategy"
, "total_return_pct", "benchmark_return_pct",
            "sharpe"
, "max_drawdown_pct", "total_trades",
        ]].head(10).to_string(index=False)
    )

延伸理解:从一个示例仪表盘可以看到,比如在 META 一年的回测中,38 个策略里有 27 个为正收益,最佳策略的优化后总收益甚至能远超买入持有基准。但这恰恰提醒我们——这些都是「优化后」的样本内结果,存在过拟合风险。在实盘前,务必再做样本外测试(Out-of-Sample)和前向滚动验证(Walk-Forward),否则漂亮的回测曲线很可能只是「事后诸葛亮」。


总结

当策略研究超过一两个想法时,手动回测就会变得低效。要把研究做扎实,你需要:

  • • 自动化:把重复劳动交给脚本
  • • 一致的数据集:所有策略用同一份数据
  • • 相同的初始资金:保证横向可比
  • • 相同的基准:用买入持有作为统一参照
  • • 统一的输出结构:方便归档和复盘
  • • 批量对比的能力:不必逐个打开模块

本文拆解的这个脚本,正好把上述要素串成了一条完整的研究流水线。它足够简单、易于理解,又足够强大、可以扩展到整个策略库。

它的核心价值,就是把「一个装满策略文件的文件夹」变成「一份带排名的研究报告」。当然,并不是每个策略都能存活下来——而这正是回测的意义所在:它帮你更快地知道哪些策略不行,从而把宝贵的时间花在真正值得深入的候选者上。

对于正在学习 Python 量化的你来说,即使暂时用不上具体的交易逻辑,这套「动态发现模块 + 统一接口 + 失败隔离 + 结果归档」的工程模式,也值得借鉴到任何需要批量处理的项目中。


参考文章

加入专注于财经数据与量化投研的知识星球【数据科学实战】,获取本文完整研究解析、代码实现细节。

财经数据与量化投研知识社区

2026年全面升级已落地!【数据科学实战】知识星球核心权益如下:

  1. 1. 双典系统赋能:获赠《财经数据宝典》与《量化投研宝典》完整文档,凝练多年实战经验,构建系统化知识框架;
  2. 2. 量化因子日更教程(2026重磅新增):每日更新「量化因子专题教程」,配套完整可运行代码与实战案例,深度拆解因子构建、回测与优化全流程;
  3. 3. 量化文章专题教程库:500+篇星球独有高质量教程式文章,系统覆盖策略开发、因子研究、风险管理等核心领域,内容基本每日更新,并配套精选学习资料与实战参考;
  4. 4. 量化投研实战课程:赠送《AKQuant-入门及实战》《PyBroker-入门及实战》视频课程,手把手教学,快速掌握量化策略开发技能;
  5. 5. 财经数据支持:定期更新国内外财经数据,为策略研发提供精准、可靠的数据基础;
  6. 6. 顶尖学者与行业专家分享:年度邀请学术界博士与业界资深专家开展前沿论文精讲与实战案例分享,不少于4场,直击研究前沿与产业实践;
    专家直连答疑:与核心开发者及领域专家实时互动,高效解决投研实战难题;
  7. 7. 专业社群与专属福利:加入高质量交流社群,获取课程折扣及更多独家资源。

星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!

好文推荐

1. 用 Python 打造股票预测系统:Transformer 模型教程(一)

2. 用 Python 打造股票预测系统:Transformer 模型教程(二)

3. 用 Python 打造股票预测系统:Transformer 模型教程(三)

4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)

5. 揭秘隐马尔可夫模型:因子投资的制胜武器

6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用

7. 金融 AI 助手:FinGPT 让你轻松掌握市场分析

8. 量化交易秘籍:为什么专业交易员都在用对数收益率?

9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解

10. 掌握金融波动率模型:完整 Python 实现指南

好书推荐

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 06:41:03 HTTP/2.0 GET : https://f.mffb.com.cn/a/498191.html
  2. 运行时间 : 0.189166s [ 吞吐率:5.29req/s ] 内存消耗:4,510.66kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=fa672aaa9b7525cc80fdc669c79a4f0d
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000539s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000619s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.014370s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.005733s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000642s ]
  6. SELECT * FROM `set` [ RunTime:0.007676s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000790s ]
  8. SELECT * FROM `article` WHERE `id` = 498191 LIMIT 1 [ RunTime:0.014522s ]
  9. UPDATE `article` SET `lasttime` = 1783032063 WHERE `id` = 498191 [ RunTime:0.007219s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.004807s ]
  11. SELECT * FROM `article` WHERE `id` < 498191 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.048044s ]
  12. SELECT * FROM `article` WHERE `id` > 498191 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.002858s ]
  13. SELECT * FROM `article` WHERE `id` < 498191 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000679s ]
  14. SELECT * FROM `article` WHERE `id` < 498191 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001034s ]
  15. SELECT * FROM `article` WHERE `id` < 498191 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001058s ]
0.190733s