Bootstrap

【Python量化金融实战】-第1章:Python量化金融概述:1.3 常用工具库:NumPy、Pandas、Matplotlib、Scikit-learn、TA-Lib

本章节主要介绍了Python中几个常用的工具库,如NumPy、Pandas、Matplotlib、Scikit-learn和TA-Lib,涵盖了从基础数值计算到复杂机器学习建模以及技术指标计算等多个方面。

👉 点击关注不迷路
👉 点击关注不迷路

1.3 常用工具库:NumPy、Pandas、Matplotlib、Scikit-learn、TA-Lib

本章节主要介绍了Python中几个常用的工具库,如NumPy、Pandas、Matplotlib、Scikit-learn和TA-Lib,涵盖了从基础数值计算到复杂机器学习建模以及技术指标计算等多个方面,具体内容如下:

1.3.1 NumPy:数值计算基础

功能介绍

NumPy 是 Python 的核心科学计算库,支持多维数组和矩阵运算,适用于高效的数值计算(如收益率计算、统计量分析)。

实战案例:模拟股票价格序列并计算对数收益率统计指标。

import numpy as np

# 生成模拟股票价格(假设每日收益率服从正态分布)
np.random.seed(0)
days = 252  # 一年的交易日数
daily_returns = np.random.normal(loc=0.0001, scale=0.01, size=days) + 1
price = 100 * np.cumprod(daily_returns)  # 用于计算给定数组沿指定轴的累计乘积(cumulative product)

# 计算对数收益率及其统计指标
log_returns = np.log(price[1:] / price[:-1])
print("平均对数收益率:", np.mean(log_returns))
print("对数收益率标准差:", np.std(log_returns))

运行效果

在这里插入图片描述

1.3.2 Pandas:数据处理与分析

功能介绍:

Pandas 提供 DataFrame 结构,擅长处理时间序列数据(如股票价格清洗、移动平均计算)。

实战案例:获取股票数据并生成双均线交易信号

import numpy as np
import pandas as pd
# import yfinance as yf

# 从Yahoo财经数据获取AAPL股票数据,需要自行寻找该网站的数据
# data = yf.download('AAPL', start='2020-01-01', end='2023-01-01')
# 本实验通过本地读取离线文件的形式
data = pd.read_csv(r'./datas/AAPL.csv', encoding='utf8')
# print( data.shape )
df = data[['Close']].copy()

# 计算移动平均线(20日和50日)
df['MA20'] = df['Close'].rolling(20).mean()
df['MA50'] = df['Close'].rolling(50).mean()

# 生成交易信号(金叉/死叉)
df['Signal'] = 0
try:
    # print( np.where(df['MA20'][50:] > df['MA50'][50:], 1, 0) )
    df.loc[50:, 'Signal'] = np.where(df['MA20'][50:] > df['MA50'][50:], 1, 0)
except Exception as e:
    print( e )
df['Position'] = df['Signal'].diff()  # 信号变化点即为交易点

print( 'AAPL股票数据采样时间范围: %s - %s,总数据量:%d' % ( data.Date.min(), data.Date.max(), data.shape[0] ))
print( df.tail(40) )

运行效果

在这里插入图片描述

1.3.3 Matplotlib:数据可视化

功能介绍

Matplotlib 用于绘制专业图表(如价格走势、技术指标可视化)。

实战案例:绘制股价、均线及交易信号。

import numpy as np
import pandas as pd
# import yfinance as yf

# 从Yahoo财经数据获取AAPL股票数据,需要自行寻找该网站的数据
# data = yf.download('AAPL', start='2020-01-01', end='2023-01-01')
# 本实验通过本地读取离线文件的形式
data = pd.read_csv(r'./datas/AAPL.csv', encoding='utf8')
# print( data.shape )
df = data[['Close']].copy()

# 计算移动平均线(20日和50日)
df['MA20'] = df['Close'].rolling(20).mean()
df['MA50'] = df['Close'].rolling(50).mean()

# 生成交易信号(金叉/死叉)
df['Signal'] = 0
try:
    # print( np.where(df['MA20'][50:] > df['MA50'][50:], 1, 0) )
    df.loc[50:, 'Signal'] = np.where(df['MA20'][50:] > df['MA50'][50:], 1, 0)
except Exception as e:
    print( e )
df['Position'] = df['Signal'].diff()  # 信号变化点即为交易点

import matplotlib.pyplot as plt

plt.figure(figsize=(12, 6))
plt.plot(df['Close'], label='Close Price', alpha=0.5)
plt.plot(df['MA20'], label='20-day MA', linestyle='--')
plt.plot(df['MA50'], label='50-day MA', linestyle='--')

# 标记买卖信号
buy_signals = df[df['Position'] == 1]
sell_signals = df[df['Position'] == -1]
plt.scatter(buy_signals.index, buy_signals['Close'], marker='^', color='g', s=100, label='Buy')
plt.scatter(sell_signals.index, sell_signals['Close'], marker='v', color='r', s=100, label='Sell')

plt.title('AAPL Price with Moving Averages')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()

运行效果

在这里插入图片描述

1.3.4 Scikit-learn:机器学习建模

功能介绍

Scikit-learn 提供机器学习算法(如预测股价涨跌、因子模型)。

实战案例:使用逻辑回归预测次日涨跌。

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import numpy as np
import pandas as pd
# import yfinance as yf

# 从Yahoo财经数据获取AAPL股票数据,需要自行寻找该网站的数据
# data = yf.download('AAPL', start='2020-01-01', end='2023-01-01')
# 本实验通过本地读取离线文件的形式
data = pd.read_csv(r'./datas/AAPL.csv', encoding='utf8')
# print( data.shape )
df = data[['Close']].copy()

# 构建特征(过去5日收益率)和标签(次日涨跌)
df['Return'] = df['Close'].pct_change()
df['Label'] = np.where(df['Return'].shift(-1) > 0, 1, 0)  # 1表示上涨

for lag in range(1, 6):
    df[f'Lag{lag}'] = df['Return'].shift(lag)

df.dropna(inplace=True)
X = df[['Lag1', 'Lag2', 'Lag3', 'Lag4', 'Lag5']]
y = df['Label']

# 划分数据集并训练模型,2/8比例
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)
model = LogisticRegression()
model.fit(X_train, y_train)

# 计算分类器准确率,评估模型
y_pred = model.predict(X_test)
# print( pd.DataFrame( [y_test, y_pred] ) )

print("模型准确率:", accuracy_score(y_test, y_pred))

运行效果

在这里插入图片描述

1.3.5 TA-Lib:技术指标计算

功能介绍

TA-Lib 提供 150+ 技术指标(如 RSI、MACD),简化策略开发。

实战案例

计算 RSI 并识别超买超卖信号。

import talib as ta
import numpy as np
import pandas as pd
# import yfinance as yf
import matplotlib.pyplot as plt

# 从Yahoo财经数据获取AAPL股票数据,需要自行寻找该网站的数据
# data = yf.download('AAPL', start='2020-01-01', end='2023-01-01')
# 本实验通过本地读取离线文件的形式
data = pd.read_csv(r'./datas/AAPL.csv', encoding='utf8')
# print( data.shape )
df = data[['Close']].copy()

# 计算 RSI
# RSI一般指相对强弱指标。 相对强弱指标,是指期货市场和股票市场中最为著名的摆动指标
df['RSI'] = ta.RSI(df['Close'], timeperiod=14)

# 生成交易信号
df['Overbought'] = (df['RSI'] > 70).astype(int)
df['Oversold'] = (df['RSI'] < 30).astype(int)

# 可视化 RSI
plt.figure(figsize=(12, 4))
plt.plot(df['RSI'], label='RSI')
plt.axhline(70, linestyle='--', color='r', label='Overbought')  # 用于在图表中绘制水平线
plt.axhline(30, linestyle='--', color='g', label='Oversold')  # 用于在图表中绘制水平线
plt.title('RSI Indicator')
plt.legend()
plt.show()

运行结果

在这里插入图片描述

1.3.6 综合应用示例

实战案例一:结合上述工具库,构建完整的量化策略流程。

import talib as ta
import numpy as np
import pandas as pd
# import yfinance as yf
import matplotlib.pyplot as plt

# 1. 数据获取与处理
# 从Yahoo财经数据获取AAPL股票数据,需要自行寻找该网站的数据
# data = yf.download('AAPL', start='2020-01-01', end='2023-01-01')

# 本实验通过本地读取离线文件的形式
data = pd.read_csv(r'./datas/AAPL.csv', encoding='utf8')
# print( data.shape )
df = data[['Close']].copy()

# 2. 计算技术指标(TA-Lib)
df['RSI'] = ta.RSI(df['Close'])
df['MA20'] = df['Close'].rolling(20).mean()

print( df.RSI.unique() )
print( df.head( 10 ) )

# 3. 生成信号:RSI超卖且价格上穿20日均线
df['Signal'] = np.where((df['RSI'] < 40) & (df['Close'] > df['MA20']), 1, 0)

# 4. 可视化(Matplotlib)
plt.figure(figsize=(12, 6))
plt.plot(df['Close'], label='Price')
plt.plot(df['MA20'], label='20-day MA')
plt.scatter(df[df['Signal'] == 1].index, df[df['Signal'] == 1]['Close'],
            marker='^', color='g', s=100, label='Buy Signal')
plt.title('AAPL Trading Strategy')
plt.legend()
plt.show()

运行结果

在这里插入图片描述

输出说明

以上代码展示了从数据获取、指标计算到策略可视化的完整流程,体现了各工具库在量化金融中的协同作用。

实战案例二:股票数据分析与技术指标策略

本案例将实现以下功能:

  • 使用Pandas获取并清洗股票数据
  • 使用NumPy计算收益率和波动率
  • 使用TA-Lib生成技术指标···
  • 使用Matplotlib可视化分析结果
  • 使用Scikit-learn构建简单的价格预测模型
1. 数据获取与清洗(Pandas
import talib as ta
import numpy as np
import pandas as pd
# import yfinance as yf
import matplotlib.pyplot as plt

# 1. 数据获取与处理
# 从Yahoo财经数据获取AAPL股票数据,需要自行寻找该网站的数据
# data = yf.download('AAPL', start='2020-01-01', end='2023-01-01')

# 本实验通过本地读取离线文件的形式
data = pd.read_csv(r'./datas/AAPL.csv', encoding='utf8')
# print( data.shape )
df = data[['Close']].copy()

# 数据清洗
data = data[['Open', 'High', 'Low', 'Close', 'Volume']]  # 选择关键列
data = data.dropna()  # 删除缺失值
data['Returns'] = data['Close'].pct_change()  # 计算日收益率

print(data.head())
2. 收益率分析(NumPy
import numpy as np

# 计算年化波动率
daily_volatility = np.std(data['Returns'].dropna())
annualized_vol = daily_volatility * np.sqrt(252)

# 生成正态分布模拟
sim_returns = np.random.normal(
    loc=data['Returns'].mean(),
    scale=daily_volatility,
    size=1000
)

print(f"年化波动率: {annualized_vol:.2%}")
3. 技术指标分析(TA-Lib
import talib

# 计算技术指标
data['SMA_20'] = talib.SMA(data['Close'], timeperiod=20)
data['RSI_14'] = talib.RSI(data['Close'], timeperiod=14)
data['MACD'], _, _ = talib.MACD(data['Close'])

# 生成交易信号
data['Signal'] = np.where(data['MACD'] > 0, 1, -1)
4. 数据可视化(Matplotlib
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 'SimHei' 是黑体,你也可以尝试 'KaiTi' 或其他支持中文的字体
plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8))

# K线图
candlestick = data[['Open', 'High', 'Low', 'Close']].iloc[:30]
ax1.plot(data['SMA_20'], label='20日均线')
ax1.set_title('价格与均线')

在这里插入图片描述

5. 价格预测模型(Scikit-learn
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

data.dropna(inplace=True)   # 剔除空数据,或者空数据默认填充0
# 特征工程
features = data[['SMA_20', 'RSI_14', 'Volume']].shift(1).dropna()
target = data['Close'].pct_change().dropna()

# 划分数据集
train_size = int(len(features)*0.8)
X_train, X_test = features[:train_size], features[train_size:]
y_train, y_test = target[:train_size], target[train_size:]

# 训练模型
model = LinearRegression()
model.fit(X_train, y_train)

# 评估模型
preds = model.predict(X_test)
mse = mean_squared_error(y_test, preds)
print(f"预测MSE: {mse:.6f}")

在这里插入图片描述

6.案例输出说明
  • 数据特征:包含开盘价、最高价、最低价、收盘价、交易量和技术指标
  • 策略逻辑:
    • MACD线上穿0轴时生成买入信号
    • MACD线下穿0轴时生成卖出信号
  • 模型应用:使用技术指标预测次日收益率
  • 可视化输出:
    • 价格与均线走势图
    • MACD指标变化图
7.工具库协同工作流程图

在这里插入图片描述

8.关键知识点总结

通过这个案例,可以清晰看到Python工具链在量化金融中的典型工作流程。实际应用中还需考虑:

  • 策略回测框架(如Backtrader
  • 风险管理模块
  • 实时数据接口
  • 高频数据处理优化
  • 其他

📢 下期预告:《【Python量化金融实战】-第1章:Python量化金融概述:1.4 开发环境搭建:Jupyter Notebook、VS Code、PyCharm

;