前言

本文是一套面向金融专业学生的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配置

  1. 安装Python扩展
  2. 选择解释器:Ctrl+Shift+PPython: Select Interpreter
  3. 安装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! 🚀