VectorBT量化入门系列:第四章 高级策略开发与优化

发布于:2025-04-11 ⋅ 阅读:(35) ⋅ 点赞:(0)

VectorBT量化入门系列:第四章 高级策略开发与优化

本教程专为中高级开发者设计,系统讲解VectorBT技术在量化交易中的应用。通过结合Tushare数据源和TA-Lib技术指标,深度探索策略开发、回测优化与风险评估的核心方法。从数据获取到策略部署,全面提升量化交易能力,助力开发者构建高效、稳健的交易系统。
文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。适合量化新手建立系统认知,为策略开发打下基础。

VectorBT

学习对象

  • 中高级水平的开发者和数据分析师
  • 具备 Python 编程基础和一定的数据分析能力
  • 对量化交易和金融数据处理有一定了解
  • 熟悉 A 股市场,了解 Tushare 数据源和 TA-Lib 技术指标

教程目标

  • 系统学习 VectorBT 技术,掌握其在量化交易中的应用
  • 熟练使用 Tushare 数据源获取 A 股市场数据,并使用 Parquet 文件存储
  • 掌握基于 VectorBT 的策略开发、回测和性能评估流程
  • 学会使用 TA-Lib 计算技术指标,并将其应用于交易策略
  • 理解并实现多因子策略、机器学习策略等高级策略
  • 掌握策略优化、风险管理以及策略组合的方法
  • 能够独立构建和评估量化交易策略,并部署到生产环境

教程目录

第一章 VectorBT基础与环境搭建

1.1 VectorBT简介与应用场景
1.2 环境搭建与依赖安装
1.3 数据源与Tushare集成
1.4 数据存储与Parquet文件格式

第二章:VectorBT核心功能与数据处理

2.1 数据加载与预处理
2.2 时间序列数据处理
2.3 技术指标计算与TA-Lib集成
2.4 数据可视化与探索性分析

第三章:VectorBT策略回测基础

3.1 策略定义与实现
3.2 回测流程与关键参数
3.3 性能评估指标与解读
3.4 策略优化与参数调整

第四章:高级策略开发与优化

4.1 多因子策略开发
4.2 机器学习策略集成
4.3 风险管理与交易成本模拟
4.4 策略组合与资产配置

第五章:VectorBT性能评估与分析

5.1 性能评估框架
5.2 统计指标与回测报告
5.3 敏感性分析与压力测试
5.4 策略对比与选择标准

第六章:VectorBT实战案例

6.1 基于MACD的动量策略
6.2 基于RSI的均值回归策略
6.3 多因子选股策略
6.4 机器学习预测策略

第七章:VectorBT扩展与最佳实践

7.1 自定义指标与策略
7.2 高效回测与并行计算
7.3 代码优化与性能提升
7.4 生产环境部署与监控

第四章 高级策略开发与优化

本章将深入探讨如何开发更复杂的交易策略,并通过优化提升策略表现。我们将涵盖多因子策略、机器学习策略、风险管理以及策略组合等内容。

4.1 多因子策略开发

多因子策略结合多个技术指标来生成交易信号,通常能提高策略的鲁棒性。

4.1.1 定义多因子信号

import vectorbt as vbt
import pandas as pd
import talib


def generate_multi_factor_signals(df: pd.DataFrame) -> pd.DataFrame:
    # 计算动量因子 (Momentum)
    # 动量因子是过去20天的收益率均值
    df["Momentum"] = df["close"].pct_change(periods=20).rolling(window=20).mean()
    # pct_change(periods=20) 计算每20天的收益率
    # rolling(window=20).mean() 计算这些收益率的20天滚动平均值

    # 计算波动性因子 (Volatility)
    # 波动性因子是过去20天的日收益率标准差
    df["Volatility"] = df["close"].pct_change().rolling(window=20).std()
    # pct_change() 计算每天的收益率
    # rolling(window=20).std() 计算这些收益率的20天滚动标准差

    # 计算相对强弱指数 (RSI)
    # RSI 是一个技术分析指标,用于衡量资产价格变动的速度和变化
    df["RSI"] = talib.RSI(df["close"], timeperiod=14)
    # talib.RSI 计算14天的RSI

    # 计算移动平均收敛/发散指标 (MACD)
    # MACD 是一个趋势跟踪动量指标,显示了两条移动平均线之间的关系
    df["MACD"], _, _ = talib.MACD(
        df["close"], fastperiod=12, slowperiod=26, signalperiod=9
    )
    # fastperiod=12: 快速移动平均线的周期
    # slowperiod=26: 慢速移动平均线的周期
    # signalperiod=9: 信号线的周期
    # 返回值包括 MACD 线、信号线和 MACD 柱状图,这里我们只取 MACD 线

    # 给每个因子分配权重
    weights = {"Momentum": 0.3, "Volatility": -0.2, "RSI": 0.3, "MACD": 0.2}

    # 计算合成因子得分
    df["Factor_Score"] = sum([df[col] * weights[col] for col in weights])

    # 设定买入卖出阈值
    buy_threshold = 0.5
    sell_threshold = -0.5

    # 生成交易信号
    df["signal"] = np.where(
        df["Factor_Score"] > buy_threshold,
        1,
        np.where(df["Factor_Score"] < sell_threshold, -1, 0),
    )
    return df

4.1.2 运行多因子策略

def run_multi_factor_strategy(df: pd.DataFrame) -> vbt.Portfolio:
    """运行多因子策略。

    :param df: 包含多因子信号的DataFrame
    :return: 回测结果
    """
    # 创建投资组合
    portfolio = vbt.Portfolio.from_signals(
        close=df["close"],
        entries=df["signal"] == 1,
        exits=df["signal"] == -1,
        freq="D",
        init_cash=100000,
    )

    return portfolio


# 示例:运行多因子策略
data = load_data_from_parquet("./data/600519.SH.parquet")  # 贵州茅台
data = generate_multi_factor_signals(data)
portfolio = run_multi_factor_strategy(data)
# 评估策略性能
evaluate_performance(portfolio)

输出:

总回报率: 31.69%
夏普比率: 0.42
最大回撤: -46.72%
总利润: 31691.35

4.2 机器学习策略集成

机器学习可以用于预测市场走势,从而生成交易信号。我们将使用随机森林模型作为示例。

4.2.1 准备特征和标签

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score


def prepare_features_and_labels(df: pd.DataFrame) -> tuple[pd.DataFrame, pd.Series]:
    """准备机器学习的特征和标签。

    :param df: 输入的DataFrame
    :return: 特征矩阵和标签向量
    """
    # 计算技术指标作为特征
    df["macd"], df["macd_signal"], _ = talib.MACD(df["close"])
    df["rsi"] = talib.RSI(df["close"], timeperiod=14)
    df["bb_upper"], df["bb_middle"], df["bb_lower"] = talib.BBANDS(
        df["close"], timeperiod=20
    )

    # 创建标签(1表示上涨,0表示下跌)
    df["target"] = (df["close"].shift(-1) > df["close"]).astype(int)

    # 去除NaN值
    df.dropna(inplace=True)

    # 分离特征和标签
    X = df[["macd", "rsi", "bb_upper", "bb_lower"]]
    y = df["target"]

    return X, y


# 示例:准备特征和标签
X, y = prepare_features_and_labels(data)

4.2.2 训练和预测

def train_and_predict(X: pd.DataFrame, y: pd.Series) -> pd.Series:
    """训练机器学习模型并进行预测。

    :param X: 特征矩阵
    :param y: 标签向量
    :return: 预测结果
    """
    # 分割数据集
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=42
    )

    # 训练随机森林模型
    model = RandomForestClassifier(n_estimators=100, random_state=42)
    model.fit(X_train, y_train)

    # 预测
    y_pred = model.predict(X_test)

    # 评估模型
    print(f"模型准确率: {accuracy_score(y_test, y_pred):.2%}")

    # 返回预测结果
    return pd.Series(y_pred, index=X_test.index)


# 示例:训练和预测
predictions = train_and_predict(X, y)

输出:

模型准确率: 56.60%

4.3 风险管理与交易成本模拟

风险管理是策略开发的重要组成部分。我们将模拟交易成本和设置止损、止盈点。

4.3.1 模拟交易成本

def simulate_trading_costs(
    df: pd.DataFrame, fee_rate: float = 0.0015, slippage_rate: float = 0.0015
) -> vbt.Portfolio:
    """模拟交易成本。

    :param df: 输入的DataFrame
    :param fee_rate: 交易费用率
    :param slippage_rate: 滑点率
    :return: 包含交易成本的回测结果
    """
    # 重新运行回测,包含交易成本
    portfolio_with_costs = vbt.Portfolio.from_signals(
        close=df["close"],
        entries=df["signal"] == 1,
        exits=df["signal"] == -1,
        freq="D",
        init_cash=100000,
        fees=fee_rate,
        slippage=slippage_rate,
    )

    return portfolio_with_costs


# 示例:模拟交易成本
portfolio_with_costs = simulate_trading_costs(data)
# 评估策略性能
evaluate_performance(portfolio_with_costs)

输出:

总回报率: 25.90%
夏普比率: 0.38
最大回撤: -48.80%
总利润: 25896.88

4.3.2 设置止损和止盈

def run_strategy_with_stop_loss_and_take_profit(
    df: pd.DataFrame, stop_loss: float = 0.03, take_profit: float = 0.07
) -> vbt.Portfolio:
    """运行包含止损和止盈的策略。

    :param df: 输入的DataFrame
    :param stop_loss: 止损率
    :param take_profit: 止盈率
    :return: 回测结果
    """
    # 创建投资组合,包含止损和止盈
    portfolio = vbt.Portfolio.from_signals(
        close=df["close"],
        entries=df["signal"] == 1,
        exits=df["signal"] == -1,
        freq="D",
        init_cash=100000,
        fees=0.0015,
        slippage=0.0015,
        sl_stop=stop_loss,
        tp_stop=take_profit,
    )

    return portfolio


# 示例:运行包含止损和止盈的策略
portfolio_with_sl_tp = run_strategy_with_stop_loss_and_take_profit(
    data, stop_loss=0.05, take_profit=0.10
)
# 评估策略性能
evaluate_performance(portfolio_with_sl_tp)

输出:

总回报率: 8.97%
夏普比率: 0.24
最大回撤: -52.46%
总利润: 8968.03

4.4 策略组合与资产配置

策略组合通过将多个策略或资产组合在一起,分散风险并提高整体表现。

4.4.1 创建策略组合

def create_strategy_portfolio(df: pd.DataFrame) -> vbt.Portfolio:
    """创建策略组合。

    :param portfolios: 包含多个策略的回测结果列表
    :return: 组合后的回测结果
    """

    # 应用策略
    df["signal1"] = generate_signals(df)["signal"]
    df["signal2"] = generate_multi_factor_signals(df)["signal"]

    # 组合信号
    df["combined_signal"] = (df["signal1"] + df["signal2"]) / 2
    df["final_signal"] = np.where(
        df["combined_signal"] > 0.5,
        1,
        np.where(df["combined_signal"] < -0.5, -1, 0),
    )

    # 创建组合投资组合
    combined_portfolio = vbt.Portfolio.from_signals(
        close=df["close"],
        entries=data["final_signal"] == 1,
        exits=data["final_signal"] == -1,
        freq="D",
        init_cash=100000,
        fees=0.001,
        slippage=0.001,
        sl_stop=0.05,
        tp_stop=0.10,
    )

    return combined_portfolio


# 示例:创建策略组合
data = load_data_from_parquet("./data/600519.SH.parquet")
combined_portfolio = create_strategy_portfolio(data)

4.4.2 评估组合性能

def evaluate_portfolio_performance(portfolio: vbt.Portfolio) -> pd.DataFrame:
    """评估组合性能。

    :param portfolio: 组合后的回测结果
    :return: 性能报告
    """
    # 打印关键指标
    evaluate_performance(portfolio)
    # 生成性能报告
    report = generate_performance_report(portfolio)

    return report


# 示例:评估组合性能
evaluate_portfolio_performance(combined_portfolio)

输出:

evaluate_portfolio_performance

性能报告:
Start                         2020-01-02 00:00:00
End                           2024-12-31 00:00:00
Period                         1212 days 00:00:00
Start Value                              100000.0
End Value                           125896.878873
Total Return [%]                        25.896879
Benchmark Return [%]                    34.867257
Max Gross Exposure [%]                      100.0
Total Fees Paid                       3108.780065
Max Drawdown [%]                         48.79735
Max Drawdown Duration           941 days 00:00:00
Total Trades                                    8
Total Closed Trades                             7
Total Open Trades                               1
Open Trade PnL                       12166.653858
Win Rate [%]                            28.571429
Best Trade [%]                          53.223844
Worst Trade [%]                        -14.092116
Avg Winning Trade [%]                   29.915815
Avg Losing Trade [%]                    -6.885613
Avg Winning Trade Duration      283 days 00:00:00
Avg Losing Trade Duration        95 days 00:00:00
Profit Factor                            1.280865
Expectancy                            1961.460716
Sharpe Ratio                             0.375743
Calmar Ratio                             0.147171
Omega Ratio                              1.059886
Sortino Ratio                            0.558034
dtype: object

总结

通过本章,你已经掌握了以下内容:

  1. 多因子策略:如何结合多个技术指标生成交易信号。
  2. 机器学习策略:如何使用机器学习模型预测市场走势。
  3. 风险管理:如何模拟交易成本并设置止损和止盈。
  4. 策略组合:如何将多个策略组合在一起并评估组合性能。

风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。


网站公告

今日签到

点亮在社区的每一天
去签到