VectorBT量化入门系列:第二章 VectorBT核心功能与数据处理
本教程专为中高级开发者设计,系统讲解VectorBT技术在量化交易中的应用。通过结合Tushare数据源和TA-Lib技术指标,深度探索策略开发、回测优化与风险评估的核心方法。从数据获取到策略部署,全面提升量化交易能力,助力开发者构建高效、稳健的交易系统。
文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。适合量化新手建立系统认知,为策略开发打下基础。
学习对象
- 中高级水平的开发者和数据分析师
- 具备 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)
输出:
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)
输出:
总结
通过本章,你已经掌握了以下内容:
- 数据加载与预处理:从Parquet文件加载数据并进行预处理。
- 时间序列处理:对齐数据、计算滚动窗口指标。
- 技术指标计算:使用TA-Lib计算移动平均线和RSI指标。
- 数据可视化:绘制价格与指标、RSI指标。
风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。