VectorBT量化入门系列:第二章 VectorBT核心功能与数据处理

发布于:2025-04-09 ⋅ 阅读:(30) ⋅ 点赞:(0)

VectorBT量化入门系列:第二章 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 生产环境部署与监控

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

本章将深入讲解VectorBT的核心功能,包括数据加载与预处理、时间序列处理、技术指标计算以及数据可视化。通过本章的学习,你将掌握VectorBT在数据处理方面的应用。

2.1 数据加载与预处理

在量化交易中,数据是策略开发的基础。VectorBT提供了强大的工具来加载和处理数据。我们将结合Tushare和Parquet文件格式,完成数据的加载与预处理。

2.1.1 数据加载

我们已经学会了如何从Tushare获取数据并存储为Parquet文件。现在,我们将使用VectorBT加载这些数据。

import pandas as pd


def load_data_from_parquet(file_path: str) -> pd.DataFrame:
    """从Parquet文件加载数据。

    :param file_path: 输入文件路径
    :return: 加载的DataFrame
    """
    return pd.read_parquet(file_path)


# 示例:加载贵州茅台的数据
data = load_data_from_parquet("./data/600519.SH.parquet")
print(data.tail())

输出:

               open     high      low    close       vol
trade_date                                              
2024-12-25  1538.80  1538.80  1526.10  1530.00  17123.39
2024-12-26  1534.00  1538.78  1523.00  1527.79  18286.51
2024-12-27  1528.90  1536.00  1519.50  1528.97  20759.32
2024-12-30  1533.97  1543.96  1525.00  1525.00  25129.82
2024-12-31  1525.40  1545.00  1522.01  1524.00  39354.45

2.1.2 数据预处理

在加载数据后,通常需要进行预处理,包括处理缺失值、标准化数据等。

def preprocess_data(df: pd.DataFrame) -> pd.DataFrame:
    """数据预处理。

    :param df: 输入的DataFrame
    :return: 预处理后的DataFrame
    """
    # 处理缺失值
    df = df.fillna(method="ffill")  # 用前一个非缺失值填充

    # 标准化数据(可选)
    # df = (df - df.mean()) / df.std()

    return df


# 示例:预处理数据
data = preprocess_data(data)
print(data.isnull().sum())

输出:

open     0
high     0
low      0
close    0
vol      0
dtype: int64

2.2 时间序列数据处理

时间序列数据是量化交易的核心。VectorBT提供了丰富的工具来处理时间序列数据。

2.2.1 数据对齐

在多资产策略中,不同资产的时间序列可能不完全对齐。VectorBT可以自动对齐数据。

def align_data(
    df1: pd.DataFrame, df2: pd.DataFrame
) -> tuple[pd.DataFrame, pd.DataFrame]:
    """对齐两个时间序列数据。

    :param df1: 第一个时间序列数据
    :param df2: 第二个时间序列数据
    :return: 对齐后的两个DataFrame
    """
    # 找到两个数据的共同索引
    common_index = df1.index.intersection(df2.index)

    # 对齐数据
    df1_aligned = df1.loc[common_index]
    df2_aligned = df2.loc[common_index]

    return df1_aligned, df2_aligned


# 示例:对齐两个股票的数据
data1 = load_data_from_parquet("./data/600519.SH.parquet")  # 贵州茅台
data2 = load_data_from_parquet("./data/000858.SZ.parquet")  # 五粮液
data1_aligned, data2_aligned = align_data(data1, data2)
print(data1_aligned.tail())
print(data2_aligned.tail())

输出:

               open     high      low    close       vol
trade_date                                              
2024-12-25  1538.80  1538.80  1526.10  1530.00  17123.39
2024-12-26  1534.00  1538.78  1523.00  1527.79  18286.51
2024-12-27  1528.90  1536.00  1519.50  1528.97  20759.32
2024-12-30  1533.97  1543.96  1525.00  1525.00  25129.82
2024-12-31  1525.40  1545.00  1522.01  1524.00  39354.45
              open    high     low   close        vol
trade_date                                           
2024-12-25  143.48  143.88  142.58  143.08   96139.52
2024-12-26  143.12  143.23  141.85  142.49  104768.25
2024-12-27  142.60  142.95  141.57  142.52  134450.59
2024-12-30  142.02  143.17  141.00  141.21  163671.80
2024-12-31  141.22  143.60  140.01  140.04  245218.67

2.2.2 滚动窗口计算

滚动窗口计算是时间序列分析中的常见操作,用于计算移动平均线等指标。

def calculate_rolling_mean(df: pd.DataFrame, window: int = 20) -> pd.DataFrame:
    """计算滚动均值。

    :param df: 输入的DataFrame
    :param window: 滚动窗口大小
    :return: 包含滚动均值的DataFrame
    """
    df["rolling_mean"] = df["close"].rolling(window=window).mean()
    return df


# 示例:计算20日均线
data = calculate_rolling_mean(data, window=20)
print(data[["close", "rolling_mean"]].tail())

输出:

             close  rolling_mean
trade_date                      
2024-12-25  143.08      145.8465
2024-12-26  142.49      145.7710
2024-12-27  142.52      145.5585
2024-12-30  141.21      145.2490
2024-12-31  140.04      144.9015

2.3 技术指标计算与TA-Lib集成

VectorBT支持与TA-Lib集成,用于计算各种技术指标。我们将展示如何使用TA-Lib计算常用指标。

2.3.1 计算移动平均线

import talib


def calculate_moving_averages(
    df: pd.DataFrame, fast_window: int = 10, slow_window: int = 30
) -> pd.DataFrame:
    """计算快线和慢线的移动平均线。

    :param df: 输入的DataFrame
    :param fast_window: 快线窗口大小
    :param slow_window: 慢线窗口大小
    :return: 包含移动平均线的DataFrame
    """
    df["fast_ma"] = talib.SMA(df["close"], timeperiod=fast_window)
    df["slow_ma"] = talib.SMA(df["close"], timeperiod=slow_window)
    return df


# 示例:计算10日和30日均线
data = calculate_moving_averages(data, fast_window=10, slow_window=30)
print(data[["close", "fast_ma", "slow_ma"]].tail())

输出:

             close  fast_ma     slow_ma
trade_date                             
2024-12-25  143.08  145.031  146.637667
2024-12-26  142.49  144.098  146.271000
2024-12-27  142.52  143.546  145.978667
2024-12-30  141.21  143.208  145.708000
2024-12-31  140.04  142.723  145.427667

2.3.2 计算RSI指标

def calculate_rsi(df: pd.DataFrame, timeperiod: int = 14) -> pd.DataFrame:
    """计算RSI指标。

    :param df: 输入的DataFrame
    :param timeperiod: RSI周期
    :return: 包含RSI指标的DataFrame
    """
    df["rsi"] = talib.RSI(df["close"], timeperiod=timeperiod)
    return df


# 示例:计算14日RSI
data = calculate_rsi(data, timeperiod=14)
print(data[["close", "rsi"]].tail())
             close        rsi
trade_date                   
2024-12-25  143.08  43.149944
2024-12-26  142.49  41.925951
2024-12-27  142.52  42.016017
2024-12-30  141.21  39.160030
2024-12-31  140.04  36.756888

2.4 数据可视化与探索性分析

数据可视化是理解数据的重要工具。VectorBT提供了简洁的可视化工具,帮助我们快速分析数据。

2.4.1 绘制价格与指标

import plotly.graph_objects as go
from plotly.subplots import make_subplots


def plot_price_with_indicators(
    df: pd.DataFrame, title: str = "Price and Indicators"
) -> None:
    """使用Plotly绘制价格与指标。

    :param df: 输入的DataFrame
    :param title: 图表标题
    """
    # 创建子图
    fig = make_subplots(rows=1, cols=1)

    # 绘制收盘价
    fig.add_scatter(
        x=df.index,
        y=df["close"],
        mode="lines",
        name="Close Price",
        line=dict(color="blue"),
        row=1,
        col=1,
    )

    # 绘制快速移动平均线
    fig.add_scatter(
        x=df.index,
        y=df["fast_ma"],
        mode="lines",
        name="Fast MA",
        line=dict(color="orange"),
        row=1,
        col=1,
    )

    # 绘制慢速移动平均线
    fig.add_scatter(
        x=df.index,
        y=df["slow_ma"],
        mode="lines",
        name="Slow MA",
        line=dict(color="green"),
        row=1,
        col=1,
    )

    # 设置图表标题和轴标签
    fig.update_layout(
        title=title, xaxis_title="Date", yaxis_title="Price", template="vbt_dark"
    )

    # 显示图表
    fig.show()


# 示例:绘制价格与移动平均线
plot_price_with_indicators(data)

输出:

plot_price_with_indicators

2.4.2 绘制RSI指标

def plot_rsi(df: pd.DataFrame, title: str = "RSI Indicator") -> None:
    """使用Plotly绘制RSI指标。

    :param df: 输入的DataFrame
    :param title: 图表标题
    """
    # 创建子图
    fig = make_subplots(rows=1, cols=1)

    # 绘制RSI指标
    fig.add_scatter(
        x=df.index,
        y=df["rsi"],
        mode="lines",
        name="RSI",
        line=dict(color="blue"),
        row=1,
        col=1,
    )

    # 添加超买和超卖水平线
    fig.add_hline(
        y=70,
        line=dict(color="red", dash="dash"),
        annotation_text="Overbought",
        annotation_position="top right",
        row=1,
        col=1,
    )

    fig.add_hline(
        y=30,
        line=dict(color="green", dash="dash"),
        annotation_text="Oversold",
        annotation_position="bottom right",
        row=1,
        col=1,
    )

    # 设置图表标题和轴标签
    fig.update_layout(
        title=title, xaxis_title="Date", yaxis_title="RSI", template="vbt_dark"
    )

    # 设置Y轴范围
    fig.update_yaxes(range=[0, 100], row=1, col=1)

    # 显示图表
    fig.show()


# 示例:绘制RSI指标
plot_rsi(data)

输出:

plot_rsi

总结

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

  1. 数据加载与预处理:从Parquet文件加载数据并进行预处理。
  2. 时间序列处理:对齐数据、计算滚动窗口指标。
  3. 技术指标计算:使用TA-Lib计算移动平均线和RSI指标。
  4. 数据可视化:绘制价格与指标、RSI指标。

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


网站公告

今日签到

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