当前位置:首页>python>用 Python 和机器学习打造年化 65% 收益的量化交易策略

用 Python 和机器学习打造年化 65% 收益的量化交易策略

  • 2026-02-07 17:52:33
用 Python 和机器学习打造年化 65% 收益的量化交易策略

欢迎加入专注于财经数据与量化投研的【数据科学实战】知识星球!在这里,您将获取持续更新的《财经数据宝典》和《量化投研宝典》,这两部宝典相辅相成,为您在量化投研道路上提供明确指引。 我们提供了精选的国内外量化投研的 250+ 篇高质量文章,并每日更新最新研究成果,涵盖策略开发、因子分析、风险管理等核心领域。 无论您是量化投资新手还是经验丰富的研究者,星球社区都能帮您少走弯路,事半功倍,共同探索数据驱动的投资世界!

引言

很多人都想跑赢大盘,但真正能做到的却寥寥无几。传统的投资方法往往依赖宏观经济预测或缓慢变化的基本面分析,而市场变化太快,人的直觉和过时的信息很难跟上节奏。

如果我们能让机器来识别市场的潜在规律,系统性地预测哪些行业板块将会表现优异,然后自动调仓,会怎么样?

本文将基于一篇最新的量化金融教程,带你从零搭建一个基于机器学习的板块轮动策略系统。这个策略在 6 年的回测中,将 100 万美元变成了超过 3400 万美元,年化收益率高达 65.86%,夏普比率 2.39,最大回撤仅 27%——远优于标普 500 指数。

核心思路:用机器学习预测板块强弱

传统的板块轮动策略依赖人工判断经济周期,比如在复苏期买入工业股,在衰退期买入消费必需品。但这种方法存在滞后性和主观偏差。

本策略的核心思路是:

  1. 收集历史数据:获取多只股票的调整后收盘价
  2. 特征工程:计算动量指标和波动率指标
  3. 构建标签:标记未来表现最好的板块(避免未来信息泄露)
  4. 训练模型:使用随机森林分类器预测哪些板块将跑赢大盘
  5. 回测验证:模拟交易,验证策略效果

第一步:获取干净的金融数据

金融数据的质量直接决定策略的成败。股票拆分、分红等公司行为如果不处理,回测结果就会失真。

import pandas as pd
import yfinance as yf
import logging

classConfig:
# 回测时间范围
    START_DATE = "2018-01-01"
    END_DATE = "2024-12-31"
# 基准指数
    BENCHMARK_TICKER = "SPY"
# 股票池:覆盖多个行业的流动性较好的美股
    TICKERS = [
'AAPL''MSFT''GOOGL''AMZN''NVDA''JPM''BAC''XOM''CVX',
'KO''PEP''PG''JNJ''UNH''LLY''HD''TSLA''CRM''ADBE',
'NFLX''CMCSA''VZ''T''CAT''GE''NEE'
    ]

classDataLoader:
deffetch_data(self, tickers: list, start_date: str, end_date: str):
"""获取股票历史数据"""
        all_tickers = list(set(tickers + [Config.BENCHMARK_TICKER]))
        logging.info(f"正在获取 {len(all_tickers)} 只股票的数据...")

# auto_adjust=True 自动处理股票拆分和分红,这一点非常关键
        data = yf.download(
            all_tickers,
            start=start_date,
            end=end_date,
            auto_adjust=True,  # 自动调整价格
            group_by='column',
            progress=False
        )

# 处理多层列索引,转换为 Close_AAPL 这样的格式
if isinstance(data.columns, pd.MultiIndex):
            new_columns = []
for col_level0, col_level1 in data.columns:
if col_level1:
                    new_columns.append(f"{col_level0}_{col_level1}")
else:
                    new_columns.append(f"{col_level0}")
            data.columns = new_columns

        close_cols = [col for col in data.columns if'Close'in col]
return data[close_cols]

defhandle_missing_data(self, dataframe: pd.DataFrame) -> pd.DataFrame:
"""处理缺失数据:先前向填充,再删除剩余空值"""
        logging.info(f"处理缺失数据,原始形状: {dataframe.shape}")
        df_filled = dataframe.ffill()  # 前向填充
        df_cleaned = df_filled.dropna()  # 删除剩余空值
        logging.info(f"处理完成,最终形状: {df_cleaned.shape}")
return df_cleaned

第二步:特征工程——提取市场信号

原始价格本身没有预测能力,我们需要从中提取有意义的特征。本策略使用两类特征:

  • 动量特征:价格相对于移动平均线的偏离程度,捕捉趋势
  • 波动率特征:收益率的标准差,衡量风险
classConfig:
# 动量计算的回看周期(天)
    MOMENTUM_LOOKBACK_PERIODS = [2060120]
# 波动率计算的回看周期(天)
    VOLATILITY_LOOKBACK_PERIODS = [2060]
# 股票与板块的映射关系
    TICKER_SECTOR_MAP = {
'AAPL''Technology''MSFT''Technology''GOOGL''Technology',
'AMZN''Technology''NVDA''Technology''TSLA''Technology',
'CRM''Technology''ADBE''Technology''NFLX''Technology',
'JPM''Financials''BAC''Financials',
'XOM''Energy''CVX''Energy',
'KO''Consumer Staples''PEP''Consumer Staples''PG''Consumer Staples',
'JNJ''Healthcare''UNH''Healthcare''LLY''Healthcare',
'HD''Consumer Discretionary',
'CMCSA''Communication Services''VZ''Communication Services''T''Communication Services',
'CAT''Industrials''GE''Industrials',
'NEE''Utilities'
    }

classFeatureEngineer:
defgenerate_momentum_features(self, prices_df: pd.DataFrame, lookback_periods: list):
"""生成动量特征:当前价格相对于移动平均线的偏离"""
        logging.info(f"生成动量特征,回看周期: {lookback_periods}")
        momentum_features = pd.DataFrame(index=prices_df.index)

for col in prices_df.columns:
if'Close_'in col:
                ticker = col.split('Close_')[1]
for period in lookback_periods:
# 计算简单移动平均
                    sma = prices_df[col].rolling(window=period).mean()
# 动量 = (当前价格 - 均线) / 均线
                    momentum_features[f'Momentum_{period}_{ticker}'] = (prices_df[col] - sma) / sma

        logging.info(f"动量特征生成完成,形状: {momentum_features.shape}")
return momentum_features.dropna()

defgenerate_volatility_features(self, prices_df: pd.DataFrame, lookback_periods: list):
"""生成波动率特征:收益率的滚动标准差"""
        logging.info(f"生成波动率特征,回看周期: {lookback_periods}")
        volatility_features = pd.DataFrame(index=prices_df.index)

# 先计算日收益率
        returns_df = prices_df.pct_change()

for col in prices_df.columns:
if'Close_'in col:
                ticker = col.split('Close_')[1]
                returns_col = f'Returns_{ticker}'
for period in lookback_periods:
# 波动率 = 收益率的滚动标准差
                    volatility_features[f'Volatility_{period}_{ticker}'] = returns_df[col].rolling(window=period).std()

        logging.info(f"波动率特征生成完成,形状: {volatility_features.shape}")
return volatility_features.dropna()

第三步:构建标签——避免未来信息泄露

这是整个策略最关键的一步。很多回测之所以失败,就是因为不小心使用了未来的信息来做预测。

我们的目标是预测未来 20 个交易日(约 1 个月)哪些板块表现最好。标签的构建方式是:计算每个板块未来 20 天的平均收益率,选出表现最好的 3 个板块标记为 1,其余标记为 0。

classConfig:
    PREDICTION_HORIZON = 20# 预测未来 20 个交易日的表现
    TOP_SECTORS_TO_PICK = 3# 选择表现最好的 3 个板块

classFeatureEngineer:
defcreate_relative_strength_labels(self, prices_df: pd.DataFrame, 
                                        sector_mapper,
                                        prediction_horizon: int, 
                                        top_sectors: int)
:

"""
        创建相对强度标签
        关键点:使用 shift(-prediction_horizon) 将未来数据"移回"当前
        这样在任意日期 D,标签 y 代表的是 D 之后发生的事情
        """

        logging.info(f"创建标签,预测周期: {prediction_horizon} 天")

# 排除基准指数
        stock_prices = prices_df.drop(columns=[f'Close_{Config.BENCHMARK_TICKER}'], errors='ignore')
        stock_returns = stock_prices.pct_change()

# 核心:将未来收益率移回当前日期
# 这是防止信息泄露的关键操作
        future_returns = pd.DataFrame(index=stock_returns.index)
for col in stock_returns.columns:
# shift(-20) 意味着把 20 天后的数据放到今天
            future_returns[col] = stock_returns[col].shift(-prediction_horizon)

# 按板块聚合未来收益率,然后标记表现最好的板块
# ... 聚合和标记逻辑 ...

        logging.info(f"标签创建完成")
return sector_labels_df.dropna()

第四步:训练机器学习模型

我们使用随机森林分类器来预测板块的相对强弱。随机森林是一种集成学习方法,它结合多棵决策树的预测结果,对噪声数据更加鲁棒。

两个重要的设计决策:

  1. 时间序列切分:按时间顺序划分训练集和测试集,前 80% 用于训练,后 20% 用于测试
  2. 类别权重平衡:由于"最强板块"是少数类,使用 class_weight='balanced' 防止模型偏向多数类
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report, f1_score
import joblib

classConfig:
    MODEL_TYPE = 'RandomForestClassifier'
    MODEL_HYPERPARAMETERS = {
'n_estimators'100,      # 决策树数量
'random_state'42,       # 随机种子,保证可复现
'class_weight''balanced',  # 处理类别不平衡
'max_depth'10# 限制树深度,防止过拟合
    }
    MODEL_PATH = "ml_predictor_model.joblib"

classMLPredictor:
def__init__(self, model_type: str = 'RandomForestClassifier', hyperparameters: dict = None):
        self.model_type = model_type
        self.hyperparameters = hyperparameters if hyperparameters else Config.MODEL_HYPERPARAMETERS
        self.model = self._initialize_model()
        logging.info(f"模型初始化完成: {self.model_type}")

def_initialize_model(self):
"""初始化模型"""
if self.model_type == 'RandomForestClassifier':
return RandomForestClassifier(**self.hyperparameters)
else:
raise ValueError(f"不支持的模型类型: {self.model_type}")

deftrain(self, X: pd.DataFrame, y: pd.Series):
"""训练模型,使用时间序列切分"""
        logging.info("开始训练模型...")
        y = y.astype(int)

# 时间序列切分:按日期排序后,前 80% 训练,后 20% 测试
        unique_dates = X.index.get_level_values('Date').unique().sort_values()
        train_end_date = unique_dates[int(len(unique_dates) * 0.8)]

        X_train = X[X.index.get_level_values('Date') <= train_end_date]
        y_train = y[y.index.get_level_values('Date') <= train_end_date]
        X_test = X[X.index.get_level_values('Date') > train_end_date]
        y_test = y[y.index.get_level_values('Date') > train_end_date]

        logging.info(f"数据划分完成: 训练集 {len(X_train)} 样本,测试集 {len(X_test)} 样本")

# 训练模型
        self.model.fit(X_train, y_train)
        logging.info("模型训练完成")

# 在测试集上评估
ifnot X_test.empty:
            y_pred = self.model.predict(X_test)
            accuracy = accuracy_score(y_test, y_pred)
            f1 = f1_score(y_test, y_pred, average='weighted')
            logging.info(f"测试集准确率: {accuracy:.4f}")
            logging.info(f"测试集 F1 分数: {f1:.4f}")

defpredict(self, X: pd.DataFrame):
"""使用训练好的模型进行预测"""
if self.model isNone:
raise RuntimeError("模型尚未训练")
        logging.info(f"正在预测 {len(X)} 个样本...")
return self.model.predict(X)

defsave_model(self, path: str):
"""保存模型到文件"""
        joblib.dump(self.model, path)
        logging.info(f"模型已保存到 {path}")

模型在测试集上达到了 56% 的准确率。在金融市场这种噪声极大的环境中,这个数字看起来不高,但考虑到随机猜测只有约 27% 的准确率(3 个最强板块 / 11 个板块),这已经是一个有意义的预测优势了。

第五步:回测策略

有了预测模型,接下来就是模拟真实交易。策略引擎每 20 个交易日(约 1 个月)调仓一次:

  1. 查询当天模型预测的最强板块
  2. 卖出所有现有持仓
  3. 将资金平均分配到预测的最强板块对应的股票中
classConfig:
    INITIAL_CAPITAL = 1000000# 初始资金 100 万美元
    REBALANCE_FREQUENCY = 20# 每 20 个交易日调仓一次

classStrategyEngine:
def__init__(self, initial_capital: float, rebalance_frequency: int):
        self.initial_capital = initial_capital
        self.rebalance_frequency = rebalance_frequency
        self.portfolio_value = pd.Series(dtype=float)
        self.holdings = {}  # 持仓:{股票代码: 股数}
        self.capital = initial_capital  # 现金
        logging.info(f"策略引擎初始化,初始资金: ${initial_capital:,.2f}")

defrun_backtest(self, prices_df: pd.DataFrame, sector_predictions_df: pd.DataFrame, sector_mapper):
"""运行回测"""
        logging.info("开始回测模拟...")
        dates = prices_df.index
        self.portfolio_value = pd.Series(index=dates, dtype=float)
        self.benchmark_value = pd.Series(index=dates, dtype=float)

# 计算基准的初始持仓
        initial_spy_price = prices_df.loc[dates[0], f'Close_{Config.BENCHMARK_TICKER}']
        benchmark_shares = self.initial_capital / initial_spy_price
        self.benchmark_value.iloc[0] = self.initial_capital

for i, current_date in enumerate(dates):
# 每天更新基准价值
if i > 0:
                self.benchmark_value.loc[current_date] = benchmark_shares * prices_df.loc[current_date, f'Close_{Config.BENCHMARK_TICKER}']

# 计算当前组合价值(现金 + 持仓市值)
            current_portfolio_value = self.capital
for ticker, shares in self.holdings.items():
iff'Close_{ticker}'in prices_df.columns:
                    current_portfolio_value += shares * prices_df.loc[current_date, f'Close_{ticker}']
            self.portfolio_value.loc[current_date] = current_portfolio_value

# 调仓逻辑:每隔 rebalance_frequency 天执行一次
if i % self.rebalance_frequency == 0:
                logging.info(f"调仓日期: {current_date.strftime('%Y-%m-%d')}")

# 获取当天的板块预测
if current_date in sector_predictions_df.index.get_level_values('Date'):
                    daily_preds = sector_predictions_df.loc[current_date, 'Predicted_Label']
                    top_sectors = daily_preds[daily_preds == 1].index.tolist()
else:
continue

# 找出最强板块对应的股票
                selected_tickers = []
for sector in top_sectors:
                    tickers_in_sector = [t for t, s in sector_mapper.items() if s == sector]
                    selected_tickers.extend(tickers_in_sector)
                selected_tickers = list(set(selected_tickers))

# 执行调仓
                self.rebalance_portfolio(current_date, prices_df, selected_tickers)

        logging.info(f"回测完成,共调仓 {len(dates) // self.rebalance_frequency} 次")
        logging.info(f"最终组合价值: ${self.portfolio_value.iloc[-1]:,.2f}")
        logging.info(f"最终基准价值: ${self.benchmark_value.iloc[-1]:,.2f}")

defrebalance_portfolio(self, date, prices_df, selected_tickers):
"""执行调仓:先清仓,再等权买入目标股票"""
# 清仓:卖出所有持仓,全部转为现金
for ticker, shares in self.holdings.items():
iff'Close_{ticker}'in prices_df.columns:
                self.capital += shares * prices_df.loc[date, f'Close_{ticker}']
        self.holdings = {}

# 如果有目标股票,等权分配资金买入
if selected_tickers:
            allocation_per_stock = self.capital / len(selected_tickers)
for ticker in selected_tickers:
iff'Close_{ticker}'in prices_df.columns:
                    price = prices_df.loc[date, f'Close_{ticker}']
                    shares = allocation_per_stock / price
                    self.holdings[ticker] = shares
            self.capital = 0# 全部资金投入

第六步:性能分析

回测结束后,我们需要全面评估策略的表现。以下是关键指标:

import numpy as np

classPerformanceAnalyzer:
defcalculate_metrics(self, portfolio_returns: pd.Series, benchmark_returns: pd.Series, 
                          risk_free_rate: float = 0.02)
 -> dict:

"""计算关键绩效指标"""
# 累计收益
        cumulative_portfolio = (1 + portfolio_returns).prod() - 1
        cumulative_benchmark = (1 + benchmark_returns).prod() - 1

# 年化收益率 (CAGR)
        years = len(portfolio_returns) / 252# 假设每年 252 个交易日
        cagr_portfolio = (1 + cumulative_portfolio) ** (1 / years) - 1
        cagr_benchmark = (1 + cumulative_benchmark) ** (1 / years) - 1

# 年化波动率
        vol_portfolio = portfolio_returns.std() * np.sqrt(252)
        vol_benchmark = benchmark_returns.std() * np.sqrt(252)

# 夏普比率 = (年化收益 - 无风险利率) / 年化波动率
        sharpe_portfolio = (cagr_portfolio - risk_free_rate) / vol_portfolio
        sharpe_benchmark = (cagr_benchmark - risk_free_rate) / vol_benchmark

# 最大回撤
        cumulative = (1 + portfolio_returns).cumprod()
        running_max = cumulative.cummax()
        drawdown = (cumulative - running_max) / running_max
        max_drawdown = drawdown.min()

        metrics = {
'累计收益(策略)'f'{cumulative_portfolio:.2%}',
'累计收益(基准)'f'{cumulative_benchmark:.2%}',
'年化收益率(策略)'f'{cagr_portfolio:.2%}',
'年化收益率(基准)'f'{cagr_benchmark:.2%}',
'夏普比率(策略)'f'{sharpe_portfolio:.2f}',
'夏普比率(基准)'f'{sharpe_benchmark:.2f}',
'最大回撤(策略)'f'{max_drawdown:.2%}',
        }

for k, v in metrics.items():
            logging.info(f"  {k}{v}")

return metrics

回测结果

经过 6 年的回测(2018–2024),策略表现如下:

指标
策略
基准(SPY)
累计收益
33.19 倍
1.45 倍
年化收益率
65.86%
13.70%
夏普比率
2.39
0.66
最大回撤
-27.09%
-33.72%
Alpha
39.46%

策略不仅收益远超基准,而且风险控制也更好——最大回撤比基准还低 6 个百分点。夏普比率 2.39 意味着每承担一单位风险,策略能获得 2.39 单位的超额收益,这在量化投资领域是非常优秀的数字。

未来改进方向

这个策略只是一个起点,还有很多可以优化的方向:

  1. 尝试更强的模型:可以试试 XGBoost、LightGBM 等梯度提升模型,或者神经网络
  2. 增加更多特征:加入宏观经济指标(利率、通胀)、基本面数据(市盈率、营收增长)
  3. 优化资金分配:使用风险平价、均值方差优化等更高级的组合构建方法
  4. 加入交易成本:真实交易中需要考虑佣金、滑点等成本
  5. 动态调仓频率:根据市场波动率动态调整调仓周期

总结

本文介绍了如何用 Python 构建一个完整的机器学习驱动的板块轮动策略,涵盖了从数据获取、特征工程、模型训练到回测分析的全流程。

关键要点:

  • 数据质量是基础:必须使用经过调整的价格数据,处理好缺失值
  • 避免未来信息泄露:这是量化策略最常见的错误,通过 shift() 操作确保标签只使用未来数据
  • 时间序列切分:训练集和测试集必须按时间顺序划分,不能随机打乱
  • 处理类别不平衡:使用 class_weight='balanced' 让模型重视少数类

虽然模型预测准确率只有 56%,但这个微小的优势在长期复利作用下,足以产生惊人的超额收益。量化投资的精髓就在于:找到一个可重复的、有统计优势的策略,然后系统性地执行它。

参考文章

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

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

核心权益如下:

  1. 赠送《财经数据宝典》完整文档,汇集多年财经数据维护经验
  2. 赠送《量化投研宝典》完整文档,汇集多年量化投研领域经验
  3. 赠送《PyBroker-入门及实战》视频课程,手把手学习量化策略开发
  4. 每日分享高质量量化投研文章(已更新 180+篇)、代码和相关资料
  5. 定期更新高频财经数据
  6. 参与年度不少于 10 次专属直播与录播课程
  7. 与核心开发者直接交流,解决实际问题
  8. 获取专业微信群交流机会和课程折扣

星球已有丰富内容积累,包括量化投研论文、财经高频数据、 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-02-08 01:20:46 HTTP/2.0 GET : https://f.mffb.com.cn/a/467402.html
  2. 运行时间 : 0.095401s [ 吞吐率:10.48req/s ] 内存消耗:4,657.98kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=582c9e37898bca7135aa33eb77bd48c3
  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.000561s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000602s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000352s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000409s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000490s ]
  6. SELECT * FROM `set` [ RunTime:0.000269s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000551s ]
  8. SELECT * FROM `article` WHERE `id` = 467402 LIMIT 1 [ RunTime:0.000435s ]
  9. UPDATE `article` SET `lasttime` = 1770484846 WHERE `id` = 467402 [ RunTime:0.001961s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000229s ]
  11. SELECT * FROM `article` WHERE `id` < 467402 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000904s ]
  12. SELECT * FROM `article` WHERE `id` > 467402 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.010301s ]
  13. SELECT * FROM `article` WHERE `id` < 467402 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.006079s ]
  14. SELECT * FROM `article` WHERE `id` < 467402 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.003208s ]
  15. SELECT * FROM `article` WHERE `id` < 467402 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000831s ]
0.097035s