Python金融数据挖掘入门:从基础到爬虫的完整学习路径
前言
本文是一套面向金融专业学生的Python课程笔记,基于《Python金融数据挖掘》教材,涵盖从基础语法到网络爬虫的完整学习路径。
课程定位:不是计算机专业的Python课,而是金融+数据的交叉课程——用Python解决金融数据分析的实际问题。
课程大纲
01_intro_to_python.md # Python基础
02_numpy_usage.md # NumPy科学计算
03_pandas_usage.md # Pandas数据分析
04_regression.md # 线性回归
05_datareader.md # 数据源获取
06_crawler.md # 网络爬虫
第一章:Python基础
关键字与标识符
# Python关键字(不能用作变量名)
False class from or
None continue global pass
True def if raise
and del import return
as elif in try
assert else is while
async except lambda with
await finally nonlocal yield
break for not
命名规范
| 风格 | 适用场景 | 示例 |
|---|---|---|
| 小写+下划线 | 变量名、函数名 | my_variable |
| 大写 | 全局常量 | MAX_COUNT |
| 驼峰式 | 类名 | MyClass |
| 前导下划线 | 私有成员 | _protected, __private |
动态类型
x = 10 # 整数
x = "Hello" # 字符串
x = [1, 2, 3] # 列表
# Python不需要声明类型,解释器自动推断
多重赋值
a, b, c = 1, 2, 3
x, y = y, x # 交换两个变量
第二章:NumPy科学计算
NumPy是Python科学计算的基础库,核心是ndarray(N维数组)。
为什么用NumPy?
# Python列表 vs NumPy数组
import numpy as np
# 列表:存储不同类型,速度慢
list_data = [1, 2, 3, 4, 5]
# ndarray:同类型,速度快(底层C实现)
arr = np.array([1, 2, 3, 4, 5])
# 性能对比
%timeit [x**2 for x in range(10000)] # 列表推导式
%timeit np.arange(10000)**2 # NumPy向量化
# NumPy通常快10-100倍
数组创建
# 从列表创建
arr = np.array([1, 2, 3])
# 特殊数组
np.zeros(10) # 全0数组
np.ones((3, 4)) # 全1矩阵
np.eye(5) # 单位矩阵
np.arange(0, 10, 2) # 等差序列
np.linspace(0, 1, 100) # 等间隔序列
# 随机数组
np.random.randn(3, 4) # 标准正态分布
np.random.randint(0, 10, (3, 3)) # 随机整数
数组操作
arr = np.array([[1, 2, 3], [4, 5, 6]])
arr.shape # (2, 3)
arr.reshape(3, 2) # 变形
arr.T # 转置
arr.flatten() # 展平
# 切片(视图,不复制数据)
arr[0, :] # 第一行
arr[:, 1] # 第二列
arr[arr > 3] # 布尔索引
金融应用示例
import numpy as np
# 计算收益率
prices = np.array([100, 102, 101, 105, 103])
returns = np.diff(prices) / prices[:-1]
# array([ 0.02 , -0.0098, 0.0396, -0.019 ])
# 计算累计收益
cum_returns = np.cumprod(1 + returns) - 1
# 年化收益率
annual_return = (1 + cum_returns[-1]) ** (252 / len(returns)) - 1
第三章:Pandas数据分析
Pandas是Python数据分析的核心库,提供Series(一维)和DataFrame(二维)两种数据结构。
DataFrame基础
import pandas as pd
# 创建DataFrame
df = pd.DataFrame({
'date': ['2024-01-01', '2024-01-02', '2024-01-03'],
'price': [100, 102, 101],
'volume': [1000, 1200, 800]
})
# 基本操作
df.head() # 前5行
df.info() # 数据类型信息
df.describe() # 统计摘要
df.shape # 行列数
数据选择
# 列选择
df['price']
df[['price', 'volume']]
# 行选择
df[0:2] # 切片
df.loc[0] # 标签索引
df.iloc[0] # 位置索引
# 条件筛选
df[df['price'] > 100]
df[(df['price'] > 100) & (df['volume'] > 1000)]
数据处理
# 缺失值处理
df.dropna() # 删除缺失值
df.fillna(0) # 填充缺失值
df.fillna(method='ffill') # 前向填充
# 数据排序
df.sort_values('price', ascending=False)
# 分组聚合
df.groupby('category')['price'].mean()
# 合并数据
pd.merge(df1, df2, on='date')
pd.concat([df1, df2])
金融数据处理
# 读取股票数据
df = pd.read_csv('stock_data.csv', parse_dates=['date'])
df.set_index('date', inplace=True)
# 计算技术指标
df['MA5'] = df['close'].rolling(5).mean()
df['MA20'] = df['close'].rolling(20).mean()
df['returns'] = df['close'].pct_change()
# 重采样(日线→月线)
monthly = df['close'].resample('M').last()
第四章:线性回归
Statsmodels实现
import statsmodels.api as sm
# 准备数据
X = df[['feature1', 'feature2']]
y = df['target']
# 添加常数项(截距)
X = sm.add_constant(X)
# 拟合模型
model = sm.OLS(y, X).fit()
# 查看结果
print(model.summary())
# R², 系数, p值, 置信区间等
Scikit-learn实现
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
# 划分训练集/测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 训练模型
model = LinearRegression()
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 评估
print(f"R² = {r2_score(y_test, y_pred):.4f}")
print(f"RMSE = {mean_squared_error(y_test, y_pred, squared=False):.4f}")
第五章:数据源获取
常用数据源
| 数据源 | 类型 | 特点 |
|---|---|---|
| Tushare | A股数据 | 免费额度,API接口 |
| AkShare | 多品种 | 开源,接口丰富 |
| Wind | 全市场 | 专业终端,收费 |
| Yahoo Finance | 全球股票 | 免费,英文接口 |
AkShare示例
import akshare as ak
# 获取股票数据
df = ak.stock_zh_a_hist(
symbol="000001",
period="daily",
start_date="20240101",
end_date="20241231"
)
# 获取期货数据
df = ak.futures_main_sina(symbol="MA0") # 甲醇主力合约
第六章:网络爬虫
技术栈
| 库 | 用途 | 特点 |
|---|---|---|
| requests | HTTP请求 | 简单易用 |
| BeautifulSoup | HTML解析 | 语法直观 |
| lxml | XML/HTML解析 | 性能优异 |
| selenium | 浏览器自动化 | 处理动态页面 |
| re | 正则表达式 | 文本匹配 |
正则表达式速查
import re
# 常用模式
. # 任意字符(除换行)
^ # 字符串开始
$ # 字符串结束
* # 零次或多次
+ # 一次或多次
? # 零次或一次
{n} # 恰好n次
[] # 字符集
\d # 数字 [0-9]
\w # 字母数字 [a-zA-Z0-9_]
\s # 空白字符
| # 或
() # 分组
爬虫示例
import requests
from bs4 import BeautifulSoup
# 发送请求
url = "https://example.com/data"
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(url, headers=headers)
# 解析HTML
soup = BeautifulSoup(response.text, 'lxml')
# 提取数据
titles = soup.find_all('h2', class_='title')
for title in titles:
print(title.text)
反爬策略
# 1. 设置User-Agent
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
# 2. 使用代理
proxies = {"http": "http://proxy:port"}
response = requests.get(url, proxies=proxies)
# 3. 随机延时
import time
import random
time.sleep(random.uniform(1, 3))
# 4. 处理Cookie
session = requests.Session()
session.get(url) # 自动处理Cookie
开发环境配置
推荐配置
# 安装Anaconda
# 下载: https://www.anaconda.com/download/
# 创建虚拟环境
python -m venv finance_env
source finance_env/bin/activate # Linux/Mac
finance_env\Scripts\activate # Windows
# 安装依赖
pip install numpy pandas matplotlib seaborn scipy scikit-learn
pip install statsmodels akshare requests beautifulsoup4 lxml
VS Code配置
- 安装Python扩展
- 选择解释器:
Ctrl+Shift+P→Python: Select Interpreter - 安装Jupyter扩展(运行.ipynb文件)
学习路径建议
第1周: Python基础(变量、数据类型、控制流)
↓
第2周: NumPy(数组操作、向量化计算)
↓
第3周: Pandas(DataFrame、数据处理)
↓
第4周: 线性回归(OLS、模型评估)
↓
第5周: 数据源(Tushare、AkShare)
↓
第6周: 网络爬虫(requests、BeautifulSoup)
常见问题
Q: NumPy和Pandas什么时候用哪个?
# NumPy:数值计算、矩阵运算
np.dot(A, B) # 矩阵乘法
np.linalg.inv(A) # 矩阵求逆
# Pandas:数据处理、表格操作
df.groupby('sector').mean() # 分组聚合
df.merge(df1, df2) # 数据合并
Q: 如何处理缺失值?
# 删除
df.dropna()
# 填充
df.fillna(0) # 固定值
df.fillna(df.mean()) # 均值
df.fillna(method='ffill') # 前向填充
df.fillna(method='bfill') # 后向填充
Q: 爬虫被封怎么办?
# 1. 降低频率
time.sleep(random.uniform(2, 5))
# 2. 使用代理池
proxy_list = ['http://proxy1:port', 'http://proxy2:port']
proxy = random.choice(proxy_list)
# 3. 使用Selenium(模拟浏览器)
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(url)
总结
| 章节 | 核心内容 | 金融应用 |
|---|---|---|
| Python基础 | 变量、控制流、函数 | 数据处理基础 |
| NumPy | 数组、向量化 | 收益率计算、矩阵运算 |
| Pandas | DataFrame、数据处理 | 股票数据分析 |
| 回归 | OLS、模型评估 | 因子分析、预测 |
| 数据源 | API接口 | 获取实时行情 |
| 爬虫 | requests、解析 | 抓取财经新闻 |
这套课程从基础到实战,适合金融专业学生快速入门Python数据分析。
课程资料:
F:\202507\intermediate_python,7个Markdown文件,覆盖Python金融数据挖掘的核心技能。
Stay tuned! 🚀