公司动态
Python量化交易实战:从时间序列分析到AI策略开发
最近在金融科技领域AI与量化交易的结合越来越紧密但很多开发者反映入门门槛高、资料零散。本文将用十天时间带你系统掌握Python金融分析与量化交易全流程从基础的时间序列分析到AI驱动的因子选股策略每个环节都提供可运行的代码示例和实战技巧。无论你是金融背景想学习编程还是程序员想进入量化领域这套教程都能帮你快速上手。学完后你将能够独立完成金融数据获取、策略回测和自动化交易系统搭建。1. 量化交易基础概念1.1 什么是量化交易量化交易是通过数学模型和计算机程序进行投资决策的方法。与传统主观交易不同量化交易依赖数据分析和算法模型能够消除情绪干扰实现系统性、纪律性的交易。核心特点包括数据驱动基于历史数据和实时行情系统化有明确的入场、出场规则可回测策略可以在历史数据上验证效果自动化程序自动执行交易指令1.2 AI在量化交易中的应用人工智能技术为量化交易带来了新的突破。机器学习算法能够从海量数据中发现非线性规律深度学习模型可以捕捉市场中的复杂模式。主要应用场景因子挖掘使用神经网络自动发现有效因子择时模型基于LSTM等时序模型预测价格走势风险控制通过异常检测识别市场异常状态组合优化利用强化学习动态调整资产配置1.3 金融时间序列分析基础金融时间序列分析是量化交易的基石。股票价格、交易量、收益率等数据都具有明显的时间序列特性需要专门的分析方法。关键概念包括平稳性时间序列的统计特性不随时间变化自相关性当前值与历史值的相关关系波动率聚类大幅波动往往聚集出现季节性周期性出现的规律性模式2. 环境准备与工具配置2.1 Python环境搭建量化交易开发推荐使用Anaconda发行版它集成了常用的数据科学库方便环境管理。# 创建专用的量化交易环境 conda create -n quant python3.9 conda activate quant # 安装核心依赖包 pip install numpy pandas matplotlib seaborn pip install jupyter notebook2.2 金融数据获取库# 安装金融数据相关库 pip install yfinance akshare tushare pip install pandas-datareader # 技术分析指标库 pip install ta-lib2.3 量化交易框架# 回测框架 pip install backtrader zipline # 实盘交易接口谨慎使用仅用于学习 pip install easytrader vnpy2.4 开发工具配置推荐使用VS Code或Jupyter Notebook进行开发。VS Code需要安装Python扩展和Jupyter扩展提供代码补全和调试功能。# 测试环境是否正常 import pandas as pd import numpy as np import yfinance as yf print(环境配置成功) print(fPandas版本: {pd.__version__}) print(fNumPy版本: {np.__version__})3. 金融时间序列分析实战3.1 数据获取与预处理首先学习如何获取和清洗金融数据这是所有分析的基础。import pandas as pd import numpy as np import yfinance as yf import matplotlib.pyplot as plt # 获取股票数据 def get_stock_data(symbol, start_date, end_date): 获取股票历史数据 stock yf.download(symbol, startstart_date, endend_date) return stock # 示例获取茅台股票数据 maotai get_stock_data(600519.SS, 2020-01-01, 2023-12-31) print(maotai.head()) # 数据清洗 def clean_finance_data(data): 金融数据清洗函数 # 检查缺失值 print(f缺失值统计:\n{data.isnull().sum()}) # 向前填充缺失值 data.fillna(methodffill, inplaceTrue) # 计算收益率 data[daily_return] data[Close].pct_change() data[log_return] np.log(data[Close] / data[Close].shift(1)) return data cleaned_data clean_finance_data(maotai)3.2 基本统计分析了解数据的基本统计特性是量化分析的第一步。def basic_analysis(data): 金融时间序列基本分析 # 描述性统计 print(描述性统计:) print(data[[Open, High, Low, Close, Volume]].describe()) # 收益率分析 returns data[daily_return].dropna() print(f\n收益率统计:) print(f平均日收益率: {returns.mean():.4f}) print(f收益率标准差: {returns.std():.4f}) print(f夏普比率: {returns.mean()/returns.std():.4f}) # 可视化 plt.figure(figsize(15, 10)) plt.subplot(2, 2, 1) data[Close].plot(title价格走势) plt.ylabel(价格) plt.subplot(2, 2, 2) returns.hist(bins50, alpha0.7) plt.title(收益率分布) plt.subplot(2, 2, 3) data[Volume].plot(title成交量) plt.ylabel(成交量) plt.subplot(2, 2, 4) returns.rolling(30).std().plot(title30日滚动波动率) plt.ylabel(波动率) plt.tight_layout() plt.show() basic_analysis(cleaned_data)3.3 时间序列特性检验金融时间序列具有独特的统计特性需要进行专门的检验。from statsmodels.tsa.stattools import adfuller from statsmodels.graphics.tsaplots import plot_acf, plot_pacf def time_series_tests(data): 时间序列特性检验 returns data[daily_return].dropna() # 平稳性检验ADF检验 adf_result adfuller(returns) print(fADF统计量: {adf_result[0]:.4f}) print(fP值: {adf_result[1]:.4f}) print(序列平稳 if adf_result[1] 0.05 else 序列非平稳) # 自相关分析 plt.figure(figsize(12, 4)) plt.subplot(1, 2, 1) plot_acf(returns, lags30, axplt.gca()) plt.title(自相关函数) plt.subplot(1, 2, 2) plot_pacf(returns, lags30, axplt.gca()) plt.title(偏自相关函数) plt.tight_layout() plt.show() # 波动率聚类检验 volatility returns.rolling(20).std() plt.figure(figsize(10, 6)) plt.plot(returns.index, returns.values, alpha0.7, label收益率) plt.plot(volatility.index, volatility.values, label波动率, colorred) plt.legend() plt.title(收益率与波动率波动率聚类现象) plt.show() time_series_tests(cleaned_data)4. 量化因子构建与分析4.1 技术指标因子技术指标是量化策略中常用的因子类型反映价格和成交量的变化规律。import talib def calculate_technical_factors(data): 计算技术指标因子 # 移动平均线 data[MA5] talib.SMA(data[Close], timeperiod5) data[MA20] talib.SMA(data[Close], timeperiod20) data[MA60] talib.SMA(data[Close], timeperiod60) # 布林带 data[upper_band], data[middle_band], data[lower_band] talib.BBANDS( data[Close], timeperiod20, nbdevup2, nbdevdn2 ) # RSI指标 data[RSI] talib.RSI(data[Close], timeperiod14) # MACD指标 data[MACD], data[MACD_signal], data[MACD_hist] talib.MACD(data[Close]) # 成交量指标 data[Volume_MA5] talib.SMA(data[Volume], timeperiod5) return data # 计算技术因子 factor_data calculate_technical_factors(cleaned_data) # 因子可视化 def plot_technical_factors(data): 可视化技术因子 plt.figure(figsize(15, 12)) # 价格和移动平均线 plt.subplot(3, 2, 1) plt.plot(data[Close], label收盘价) plt.plot(data[MA5], label5日均线) plt.plot(data[MA20], label20日均线) plt.legend() plt.title(价格与移动平均线) # 布林带 plt.subplot(3, 2, 2) plt.plot(data[Close], label收盘价) plt.plot(data[upper_band], label上轨, linestyle--) plt.plot(data[lower_band], label下轨, linestyle--) plt.legend() plt.title(布林带) # RSI plt.subplot(3, 2, 3) plt.plot(data[RSI]) plt.axhline(y70, colorr, linestyle--) plt.axhline(y30, colorg, linestyle--) plt.title(RSI指标) plt.ylim(0, 100) # MACD plt.subplot(3, 2, 4) plt.plot(data[MACD], labelMACD) plt.plot(data[MACD_signal], label信号线) plt.bar(data.index, data[MACD_hist], label柱状线, alpha0.3) plt.legend() plt.title(MACD指标) plt.tight_layout() plt.show() plot_technical_factors(factor_data)4.2 量价关系因子量价关系是技术分析的核心反映资金流向和市场情绪。def calculate_volume_price_factors(data): 计算量价关系因子 # 价格变化 data[price_change] data[Close] - data[Open] data[price_change_pct] data[price_change] / data[Open] # 量价配合度 data[volume_price_ratio] data[Volume] / data[Volume].rolling(20).mean() data[price_volume_corr] data[Close].rolling(20).corr(data[Volume]) # OBV能量潮 data[OBV] talib.OBV(data[Close], data[Volume]) # 资金流向指标 data[MFI] talib.MFI(data[High], data[Low], data[Close], data[Volume], timeperiod14) return data volume_factor_data calculate_volume_price_factors(factor_data)4.3 因子有效性检验构建因子后需要检验其预测能力确保因子在统计上显著。from scipy import stats def factor_effectiveness_test(data, factor_name, forward_period5): 因子有效性检验 # 计算未来收益率 data[future_return] data[Close].pct_change(forward_period).shift(-forward_period) # 去除缺失值 test_data data[[factor_name, future_return]].dropna() # IC分析信息系数 ic_series test_data[factor_name].rolling(20).corr(test_data[future_return]) ic_mean ic_series.mean() ic_std ic_series.std() ic_ir ic_mean / ic_std # 信息比率 print(f因子 {factor_name} 有效性检验:) print(fIC均值: {ic_mean:.4f}) print(fIC标准差: {ic_std:.4f}) print(f信息比率: {ic_ir:.4f}) # t检验 correlation test_data[factor_name].corr(test_data[future_return]) n len(test_data) t_stat correlation * np.sqrt(n-2) / np.sqrt(1-correlation**2) p_value 2 * (1 - stats.t.cdf(abs(t_stat), n-2)) print(f相关性: {correlation:.4f}) print(ft统计量: {t_stat:.4f}) print(fP值: {p_value:.4f}) print(因子显著 if p_value 0.05 else 因子不显著) return ic_series # 测试RSI因子的有效性 ic_rsi factor_effectiveness_test(volume_factor_data, RSI)5. 机器学习在量化交易中的应用5.1 特征工程与数据准备机器学习模型的效果很大程度上取决于特征质量。from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split def prepare_ml_features(data, target_period5): 准备机器学习特征 # 计算目标变量未来N日收益率 data[target] data[Close].pct_change(target_period).shift(-target_period) # 特征列表 feature_columns [ MA5, MA20, MA60, RSI, MACD, Volume_MA5, price_change_pct, volume_price_ratio, OBV, MFI ] # 创建滞后特征 for col in feature_columns: for lag in [1, 2, 3, 5]: data[f{col}_lag{lag}] data[col].shift(lag) # 添加技术指标的变化率 for col in feature_columns: data[f{col}_change] data[col].pct_change() # 选择最终特征 all_features [col for col in data.columns if col not in [target, Open, High, Low, Close, Volume]] # 去除缺失值 ml_data data[all_features [target]].dropna() X ml_data[all_features] y ml_data[target] # 数据标准化 scaler StandardScaler() X_scaled scaler.fit_transform(X) return X_scaled, y, all_features, scaler X, y, feature_names, scaler prepare_ml_features(volume_factor_data) print(f特征维度: {X.shape}) print(f目标变量维度: {y.shape})5.2 机器学习模型构建使用多种机器学习算法构建预测模型。from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor from sklearn.linear_model import LinearRegression from sklearn.svm import SVR from sklearn.metrics import mean_squared_error, r2_score import warnings warnings.filterwarnings(ignore) def build_ml_models(X, y, test_size0.2): 构建机器学习模型 # 划分训练测试集 X_train, X_test, y_train, y_test train_test_split(X, y, test_sizetest_size, shuffleFalse) # 定义模型 models { Linear Regression: LinearRegression(), Random Forest: RandomForestRegressor(n_estimators100, random_state42), Gradient Boosting: GradientBoostingRegressor(n_estimators100, random_state42), SVM: SVR(kernelrbf, C1.0) } results {} for name, model in models.items(): # 训练模型 model.fit(X_train, y_train) # 预测 y_pred model.predict(X_test) # 评估指标 mse mean_squared_error(y_test, y_pred) r2 r2_score(y_test, y_pred) results[name] { model: model, mse: mse, r2: r2, predictions: y_pred } print(f{name}:) print(f MSE: {mse:.6f}) print(f R²: {r2:.4f}) return results, X_test, y_test model_results, X_test, y_test build_ml_models(X, y)5.3 模型结果分析与可视化分析不同模型的预测效果选择最优模型。def analyze_model_results(results, X_test, y_test, feature_names): 分析模型结果 # 预测结果对比 plt.figure(figsize(15, 10)) # 真实值与预测值对比 plt.subplot(2, 2, 1) for name, result in results.items(): plt.plot(result[predictions][:100], labelf{name}预测, alpha0.7) plt.plot(y_test.values[:100], label真实值, colorblack, linewidth2) plt.legend() plt.title(模型预测效果对比) plt.ylabel(收益率) # 模型性能比较 plt.subplot(2, 2, 2) model_names list(results.keys()) r2_scores [results[name][r2] for name in model_names] plt.bar(model_names, r2_scores) plt.title(模型R²分数比较) plt.xticks(rotation45) # 特征重要性随机森林 plt.subplot(2, 2, 3) rf_model results[Random Forest][model] feature_importance rf_model.feature_importances_ top_features_idx np.argsort(feature_importance)[-10:] plt.barh(np.array(feature_names)[top_features_idx], feature_importance[top_features_idx]) plt.title(随机森林特征重要性Top 10) # 预测误差分布 plt.subplot(2, 2, 4) best_model_name model_names[np.argmax(r2_scores)] best_predictions results[best_model_name][predictions] errors y_test - best_predictions plt.hist(errors, bins50, alpha0.7) plt.title(f{best_model_name}预测误差分布) plt.xlabel(预测误差) plt.tight_layout() plt.show() return best_model_name best_model analyze_model_results(model_results, X_test, y_test, feature_names) print(f最佳模型: {best_model})6. 量化策略开发与回测6.1 策略逻辑设计基于机器学习模型预测结果设计交易策略。class MLTradingStrategy: 机器学习交易策略类 def __init__(self, model, scaler, feature_names, data): self.model model self.scaler scaler self.feature_names feature_names self.data data self.signals [] def generate_signals(self, threshold0.02): 生成交易信号 signals [] for i in range(len(self.data)): if i 60: # 确保有足够的数据计算特征 signals.append(0) continue # 获取当前特征 current_features [] for feature in self.feature_names: if feature in self.data.columns: current_features.append(self.data[feature].iloc[i]) else: current_features.append(0) # 处理缺失特征 # 特征标准化 features_scaled self.scaler.transform([current_features]) # 模型预测 prediction self.model.predict(features_scaled)[0] # 生成信号 if prediction threshold: signal 1 # 买入 elif prediction -threshold: signal -1 # 卖出 else: signal 0 # 持有 signals.append(signal) self.data[signal] signals self.signals signals return signals def calculate_returns(self, initial_capital100000): 计算策略收益 data self.data.copy() data data.iloc[60:] # 从有信号的地方开始 data[position] data[signal].shift(1) # 第二天执行信号 data[position].fillna(0, inplaceTrue) # 计算持仓变化 data[holdings] data[position] * data[Close] data[cash] initial_capital - (data[position] * data[Close]).cumsum() data[total] data[holdings] data[cash] data[returns] data[total].pct_change() return data # 使用最佳模型构建策略 best_model_obj model_results[best_model][model] strategy MLTradingStrategy(best_model_obj, scaler, feature_names, volume_factor_data) signals strategy.generate_signals() returns_data strategy.calculate_returns()6.2 回测结果分析全面评估策略的性能表现。def analyze_strategy_performance(returns_data, benchmark_dataNone): 分析策略性能 strategy_returns returns_data[returns].dropna() # 基本性能指标 total_return (returns_data[total].iloc[-1] / returns_data[total].iloc[0] - 1) * 100 annual_return total_return / (len(strategy_returns) / 252) * 100 volatility strategy_returns.std() * np.sqrt(252) * 100 sharpe_ratio annual_return / volatility if volatility ! 0 else 0 # 最大回撤 cumulative (1 strategy_returns).cumprod() peak cumulative.expanding().max() drawdown (cumulative - peak) / peak max_drawdown drawdown.min() * 100 print(策略性能指标:) print(f总收益率: {total_return:.2f}%) print(f年化收益率: {annual_return:.2f}%) print(f年化波动率: {volatility:.2f}%) print(f夏普比率: {sharpe_ratio:.2f}) print(f最大回撤: {max_drawdown:.2f}%) # 可视化回测结果 plt.figure(figsize(15, 10)) # 净值曲线 plt.subplot(2, 2, 1) plt.plot(returns_data.index, returns_data[total] / returns_data[total].iloc[0], label策略净值) if benchmark_data is not None: benchmark_normalized benchmark_data[Close] / benchmark_data[Close].iloc[0] plt.plot(benchmark_data.index, benchmark_normalized, label基准净值, alpha0.7) plt.legend() plt.title(策略净值曲线) plt.ylabel(净值) # 收益率分布 plt.subplot(2, 2, 2) plt.hist(strategy_returns, bins50, alpha0.7) plt.title(策略收益率分布) plt.xlabel(日收益率) # 回撤曲线 plt.subplot(2, 2, 3) plt.fill_between(drawdown.index, drawdown.values * 100, 0, alpha0.3) plt.title(策略回撤曲线) plt.ylabel(回撤百分比 (%)) # 月度收益热力图 plt.subplot(2, 2, 4) returns_data[year_month] returns_data.index.strftime(%Y-%m) monthly_returns returns_data.groupby(year_month)[returns].sum() # 创建月度收益矩阵 years sorted(set([ym[:4] for ym in monthly_returns.index])) months [01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12] returns_matrix [] for year in years: year_returns [] for month in months: key f{year}-{month} year_returns.append(monthly_returns.get(key, 0) * 100) returns_matrix.append(year_returns) plt.imshow(returns_matrix, cmapRdYlGn, aspectauto) plt.colorbar(label月收益率 (%)) plt.title(月度收益热力图) plt.xlabel(月份) plt.ylabel(年份) plt.xticks(range(12), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) plt.yticks(range(len(years)), years) plt.tight_layout() plt.show() return { total_return: total_return, annual_return: annual_return, volatility: volatility, sharpe_ratio: sharpe_ratio, max_drawdown: max_drawdown } performance analyze_strategy_performance(returns_data)7. 风险控制与资金管理7.1 仓位管理策略科学的仓位管理是量化交易成功的关键。class PositionManagement: 仓位管理类 def __init__(self, max_position_ratio0.1, stop_loss0.05, take_profit0.15): self.max_position_ratio max_position_ratio # 单票最大仓位 self.stop_loss stop_loss # 止损比例 self.take_profit take_profit # 止盈比例 self.positions {} # 当前持仓 def calculate_position_size(self, account_value, signal_strength, volatility): 计算仓位大小 # 基于信号强度和波动率动态调整仓位 base_size account_value * self.max_position_ratio volatility_adjust 0.1 / volatility if volatility 0.1 else 1.0 adjusted_size base_size * signal_strength * volatility_adjust return min(adjusted_size, account_value * self.max_position_ratio) def check_exit_conditions(self, current_price, entry_price, position_type): 检查退出条件 if position_type 1: # 多头持仓 profit_ratio (current_price - entry_price) / entry_price if profit_ratio -self.stop_loss: return stop_loss elif profit_ratio self.take_profit: return take_profit elif position_type -1: # 空头持仓 profit_ratio (entry_price - current_price) / entry_price if profit_ratio -self.stop_loss: return stop_loss elif profit_ratio self.take_profit: return take_profit return hold # 风险控制示例 risk_manager PositionManagement() account_value 100000 signal_strength 0.8 # 信号强度 volatility 0.02 # 波动率 position_size risk_manager.calculate_position_size(account_value, signal_strength, volatility) print(f建议仓位大小: {position_size:.2f}元)7.2 投资组合优化通过组合投资分散风险提高风险调整后收益。from scipy.optimize import minimize class PortfolioOptimizer: 投资组合优化类 def __init__(self, returns_data, risk_free_rate0.02): self.returns_data returns_data self.risk_free_rate risk_free_rate self.n_assets returns_data.shape[1] def portfolio_stats(self, weights): 计算组合统计量 portfolio_return np.sum(self.returns_data.mean() * weights) * 252 portfolio_volatility np.sqrt(np.dot(weights.T, np.dot(self.returns_data.cov() * 252, weights))) sharpe_ratio (portfolio_return - self.risk_free_rate) / portfolio_volatility return portfolio_return, portfolio_volatility, sharpe_ratio def minimize_volatility(self, target_returnNone): 最小化波动率 constraints [{type: eq, fun: lambda x: np.sum(x) - 1}] # 权重和为1 bounds tuple((0, 1) for _ in range(self.n_assets)) # 不允许做空 if target_return is not None: # 目标收益约束 constraints.append({type: eq, fun: lambda x: np.sum(self.returns_data.mean() * x) * 252 - target_return}) # 初始权重 init_weights np.array([1/self.n_assets] * self.n_assets) # 优化目标最小化波动率 result minimize(lambda w: self.portfolio_stats(w)[1], init_weights, methodSLSQP, boundsbounds, constraintsconstraints) return result.x # 组合优化示例假设有多个资产 def demo_portfolio_optimization(): 投资组合优化演示 # 生成模拟资产收益数据 np.random.seed(42) n_assets 4 n_periods 1000 # 生成相关收益数据 means [0.0005, 0.0003, 0.0007, 0.0004] # 日收益率均值 cov_matrix np.array([ [0.0004, 0.0002, 0.0001, 0.0003], [0.0002, 0.0003, 0.0002, 0.0001], [0.0001, 0.0002, 0.0005, 0.0002], [0.0003, 0.0001, 0.0002, 0.0004] ]) # 协方差矩阵 returns np.random.multivariate_normal(means, cov_matrix, n_periods) returns_df pd.DataFrame(returns, columns[Asset1, Asset2, Asset3, Asset4]) # 组合优化 optimizer PortfolioOptimizer(returns_df) optimal_weights optimizer.minimize_volatility(target_return0.15) print(最优权重分配:) for i, weight in enumerate(optimal_weights): print(f资产{i1}: {weight:.2%}) return optimal_weights optimal_weights demo_portfolio_optimization()8. 实盘交易注意事项8.1 实盘与回测的差异实盘交易面临许多回测中不存在的问题需要特别注意。class LiveTradingConsiderations: 实盘交易注意事项 def __init__(self): self.considerations { slippage: 滑点实际成交价格与预期价格的差异, commission: 手续费交易产生的费用, liquidity: 流动性大额交易对市场的影响, data_latency: 数据延迟实时数据的时效性, execution_speed: 执行速度订单执行的时间延迟, market_impact: 市场冲击交易行为对价格的影响 } def estimate_slippage(self, order_size, daily_volume, volatility): 估计滑点成本 # 简单的滑点估计模型 volume_ratio order_size / daily_volume slippage volatility * volume_ratio * 100 # 滑点百分比 return min(slippage, 1.0) # 最大滑点限制为1% def calculate_transaction_costs(self, order_value, commission_rate0.0003): 计算交易成本 commission order_value * commission_rate stamp_tax order_value * 0.001 if order_value 0 else 0 # 印花税买入免征 total_cost commission stamp_tax return total_cost def check_liquidity(self, symbol, data): 检查流动性 avg_volume data[Volume].mean() avg_turnover data[Volume].mean() * data[Close].mean() liquidity_score min(avg_volume / 1e6, 1.0) # 标准化流动性评分 return { avg_volume: avg_volume, avg_turnover: avg_turnover, liquidity_score: liquidity_score } # 实盘考虑因素示例 live_trading LiveTradingConsiderations() # 计算交易成本示例 order_value 50000 # 5万元订单 costs live_trading.calculate_transaction_costs(order_value) print(f交易成本估计: {costs:.2f}元) # 滑点估计示例 slippage live_trading.estimate_slippage(100000, 10000000, 0.02) print(f预计滑点: {slippage:.2f}%)8.2 实盘系统架构设计稳健的实盘交易系统架构。class LiveTradingSystem: 实盘交易系统架构 def __init__(self): self.components { data_feed: 数据源实时行情数据接口, strategy_engine: 策略引擎信号生成逻辑, risk_manager: 风控模块仓位和风险控制, order_manager: 订单管理委托和成交处理, portfolio_manager: 组合管理资产配置, monitoring_system: 监控系统实时监控和报警 } def system_architecture(self): 系统架构设计 architecture 实盘交易系统架构 1. 数据层 - 实时行情接入股票、期货、期权 - 历史数据存储和管理 - 基本面数据整合 2. 策略层 - 信号生成模块 - 模型预测服务 - 策略参数配置 3. 执行