简介这是一份面向量化投资初学者与进阶者的股票期权分析资源包围绕股票与期权的挑选展开融合预测性分析、交易建议与计算器工具。内容源自作者自建的Excel原型并整合了网络采集的Excel片段涵盖数据分析、数据科学、推荐引擎、决策预测、博弈论及机器学习等模块。第一个选项卡提供摘要分析输入股票代码即可依据历史波动率估算30天乃至一年的价格区间并基于Wycoff方法给出牛熊市算法判断第二个选项卡为推荐功能辅助用户筛选标的。资源包大小约325.82MB以zip压缩包形式提供内含CSS样式文件与Excel原型等主要文件类型其中Excel原型是整套分析逻辑的构建基础CSS用于站点界面呈现。目前已有162人学习关注。读者可借此理解从Excel原型到Python分析工具的迁移思路掌握波动率预测、Wycoff方法应用及推荐系统搭建的完整框架适合希望将机器学习与博弈论引入期权交易决策的实践者参考。1. 从一张期权链截图说起这个项目到底在算什么很多人第一次打开期权链看到几十列 Greeks、IV、成交量、未平仓量脑子是懵的。这个项目解决的就是这个场景给定一组股票和期权数据帮你筛选出值得关注的标的用预测性分析给出方向性建议再用内置计算器把盈亏、概率、期望值算清楚。它不是交易终端也不是行情推送工具而是一个偏研究型的分析框架适合想用 Python 做量化分析、又不想从零搭轮子的开发者。技术栈上pandas 做数据处理scikit-learn 或类似库做预测matplotlib 或 plotly 做可视化计算器模块独立封装方便你替换成自己的定价模型。关键词里的 decision-making、recommendation-system、game-theory 都落在它的建议模块里不是摆设。2. 项目架构拆解数据层、分析层、建议层怎么串起来2.1 目录结构长什么样拿到源码包后先别急着跑 main。我一般会先看目录判断这个项目的分层逻辑。这个项目的典型结构大致如下options-stock-analyzer/ ├── data/ │ ├── raw/ # 原始行情数据csv 或 parquet │ └── processed/ # 清洗后的特征数据 ├── src/ │ ├── data_loader.py # 数据读取与对齐 │ ├── feature_engine.py # 特征工程算 IV、历史波动率等 │ ├── predictor.py # 预测模型封装 │ ├── recommender.py # 建议生成逻辑 │ ├── calculator.py # 期权定价与盈亏计算器 │ └── visualizer.py # 图表输出 ├── notebooks/ │ └── exploration.ipynb # 探索性分析 ├── config.yaml # 参数配置 ├── requirements.txt └── main.py # 入口这个结构的好处是职责清晰data_loader 只管读数据和对齐时间戳feature_engine 只做特征predictor 只负责训练和推理recommender 把预测结果和规则结合calculator 独立可测。你二次开发时想换模型只动 predictor想改建议逻辑只动 recommender不会牵一发动全身。2.2 数据加载与对齐别小看时间戳股票和期权数据的时间对齐是第一个坑。股票有交易日历期权有到期日两者频率可能不一致。项目里 data_loader.py 的核心逻辑大概是这样import pandas as pd def load_and_align(stock_path, option_path, freq1D): 读取股票和期权数据按指定频率对齐。 stock_path: 股票 csv 路径含 date, close, volume option_path: 期权 csv 路径含 date, expiry, strike, type, iv, oi freq: 重采样频率默认日频 stock pd.read_csv(stock_path, parse_dates[date]) option pd.read_csv(option_path, parse_dates[date, expiry]) # 股票按日重采样取收盘价和成交量 stock stock.set_index(date).resample(freq).agg({ close: last, volume: sum }).dropna() # 期权按日聚合计算加权平均 IV 和总未平仓量 option_agg option.groupby(date).apply( lambda x: pd.Series({ avg_iv: (x[iv] * x[oi]).sum() / x[oi].sum(), total_oi: x[oi].sum(), pc_ratio: x[x[type] put][oi].sum() / x[oi].sum() }) ).reset_index() # 按日期合并 merged pd.merge(stock, option_agg, ondate, howinner) return merged这里有几个参数值得注意freq 可以改成 1W 做周频分析适合持仓周期长的策略pc_ratio 是 put/call 比率常用来判断市场情绪avg_iv 用未平仓量加权比简单平均更能反映真实交易重心。如果你拿到的数据字段名不同改一下 agg 里的键就行。常见做法是先把原始数据统一成 date, close, volume, iv, oi 这几列后面所有模块都省事。2.3 特征工程把原始数据变成模型能吃的信号feature_engine.py 负责从对齐后的数据里提取特征。这个项目里比较关键的特征包括历史波动率、IV 溢价、动量、成交量变化率。代码大致如下import numpy as np def build_features(df, window20): 构建特征矩阵。 df: 对齐后的 DataFrame含 close, avg_iv, total_oi, pc_ratio window: 滚动窗口默认 20 日 feat pd.DataFrame(indexdf.index) # 历史波动率对数收益率的滚动标准差年化 log_ret np.log(df[close] / df[close].shift(1)) feat[hv] log_ret.rolling(window).std() * np.sqrt(252) # IV 溢价隐含波动率减去历史波动率 feat[iv_premium] df[avg_iv] - feat[hv] # 动量过去 window 日收益率 feat[momentum] df[close] / df[close].shift(window) - 1 # 成交量变化率 feat[vol_change] df[volume] / df[volume].rolling(window).mean() - 1 # put/call 比率变化 feat[pc_change] df[pc_ratio].diff() # 去掉 NaN feat feat.dropna() return featwindow 这个参数很关键20 日适合短线60 日适合中线。iv_premium 为正说明期权可能偏贵卖方策略更有优势为负则相反。momentum 和 vol_change 用来判断趋势和资金关注度。这些特征直接喂给预测模型不需要再做标准化因为树模型对量纲不敏感。如果你用线性模型记得加一步 StandardScaler。2.4 预测模型不追求高准确率追求可解释性predictor.py 封装了训练和推理逻辑。这个项目默认用梯度提升树或随机森林因为特征里有非线性关系而且树模型能输出特征重要性方便你判断哪些信号在起作用。核心代码from sklearn.ensemble import GradientBoostingClassifier from sklearn.model_selection import TimeSeriesSplit import joblib class Predictor: def __init__(self, n_estimators100, max_depth3, learning_rate0.1): self.model GradientBoostingClassifier( n_estimatorsn_estimators, max_depthmax_depth, learning_ratelearning_rate ) def train(self, X, y): X: 特征矩阵 y: 标签1 表示未来 window 日上涨0 表示下跌 tscv TimeSeriesSplit(n_splits5) for train_idx, val_idx in tscv.split(X): self.model.fit(X.iloc[train_idx], y.iloc[train_idx]) score self.model.score(X.iloc[val_idx], y.iloc[val_idx]) print(fValidation accuracy: {score:.4f}) def predict_proba(self, X): return self.model.predict_proba(X)[:, 1] def save(self, path): joblib.dump(self.model, path) def load(self, path): self.model joblib.load(path)这里用 TimeSeriesSplit 而不是随机划分是因为金融数据有时间顺序随机划分会引入未来信息导致虚高准确率。n_estimators 和 max_depth 控制模型复杂度默认值偏保守防止过拟合。learning_rate 调小一点通常更稳。训练完可以看 feature_importances_如果 iv_premium 和 momentum 排前面说明模型学到了东西。3. 建议模块与计算器从预测到可执行方案3.1 建议生成规则和模型怎么结合recommender.py 把预测概率和规则结合输出具体建议。比如预测上涨概率大于 0.6 且 IV 溢价为正建议卖出看跌期权概率小于 0.4 且 IV 溢价为负建议买入看跌期权。代码结构def generate_recommendation(prob, iv_premium, pc_ratio, threshold0.6): prob: 预测上涨概率 iv_premium: IV 溢价 pc_ratio: put/call 比率 threshold: 概率阈值 if prob threshold and iv_premium 0: return 卖出看跌期权, 高概率上涨且期权偏贵适合收权利金 elif prob 1 - threshold and iv_premium 0: return 买入看跌期权, 低概率上涨且期权便宜适合博方向 elif prob threshold and iv_premium 0: return 买入看涨期权, 高概率上涨且期权便宜适合博方向 elif prob 1 - threshold and iv_premium 0: return 卖出看涨期权, 低概率上涨且期权偏贵适合收权利金 else: return 观望, 信号不明确等待更好机会threshold 可以调0.6 偏保守0.55 更激进。pc_ratio 可以作为辅助过滤比如 pc_ratio 过高说明市场过度悲观反而可能反转。这个模块的好处是逻辑透明你可以直接改规则不用重新训练模型。3.2 计算器期权定价与盈亏模拟calculator.py 是独立模块用 Black-Scholes 公式算理论价再算不同策略的盈亏。核心代码import numpy as np from scipy.stats import norm def black_scholes(S, K, T, r, sigma, option_typecall): S: 标的现价 K: 行权价 T: 到期时间年 r: 无风险利率 sigma: 波动率 option_type: call 或 put d1 (np.log(S / K) (r 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T)) d2 d1 - sigma * np.sqrt(T) if option_type call: price S * norm.cdf(d1) - K * np.exp(-r * T) * norm.cdf(d2) else: price K * np.exp(-r * T) * norm.cdf(-d2) - S * norm.cdf(-d1) return price def simulate_pnl(S_range, K, T, r, sigma, option_type, premium, positionlong): 模拟不同标的价下的盈亏。 S_range: 标的价范围数组 premium: 期权权利金 position: long 或 short pnl [] for S in S_range: intrinsic max(S - K, 0) if option_type call else max(K - S, 0) if position long: pnl.append(intrinsic - premium) else: pnl.append(premium - intrinsic) return np.array(pnl)S_range 可以用 np.linspace 生成比如从现价的 80% 到 120%。premium 是你实际成交的权利金不是理论价。position 区分买方和卖方。这个计算器可以扩展成多腿策略比如价差、跨式只要把各腿的盈亏加总就行。3.3 可视化让结果一眼看懂visualizer.py 负责画图包括价格走势、IV 曲线、盈亏图。常见做法是用 matplotlib 或 plotly。比如画盈亏图import matplotlib.pyplot as plt def plot_pnl(S_range, pnl, K, titlePL Simulation): plt.figure(figsize(10, 6)) plt.plot(S_range, pnl, labelPL) plt.axhline(0, colorgray, linestyle--) plt.axvline(K, colorred, linestyle--, labelStrike) plt.xlabel(Underlying Price) plt.ylabel(Profit / Loss) plt.title(title) plt.legend() plt.grid(True) plt.show()K 是行权价红色虚线标出来方便看盈亏平衡点。如果做多腿策略把各腿的 pnl 加总再画。plotly 的好处是可以交互鼠标悬停看具体数值适合做报告。4. 跑起来环境、配置、常见报错4.1 环境准备与依赖安装项目依赖不多主要是 pandas、numpy、scikit-learn、scipy、matplotlib。建议用虚拟环境python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate pip install -r requirements.txtrequirements.txt 里通常会有版本号比如 pandas1.3, scikit-learn1.0。如果装不上先升级 pip。常见做法是固定版本避免不同环境跑出不同结果。4.2 配置文件怎么改config.yaml 里一般有数据路径、模型参数、阈值等。比如data: stock_path: data/raw/stock.csv option_path: data/raw/option.csv freq: 1D model: n_estimators: 100 max_depth: 3 learning_rate: 0.1 recommendation: threshold: 0.6改数据路径指向你的文件freq 可以改 1W。threshold 调低会更激进调高更保守。改完直接跑 main.py。4.3 运行入口与输出解读main.py 一般是这样from src.data_loader import load_and_align from src.feature_engine import build_features from src.predictor import Predictor from src.recommender import generate_recommendation from src.calculator import black_scholes, simulate_pnl from src.visualizer import plot_pnl import yaml with open(config.yaml) as f: cfg yaml.safe_load(f) df load_and_align(cfg[data][stock_path], cfg[data][option_path], cfg[data][freq]) feat build_features(df) # 假设标签已经准备好 X feat.drop(columns[label]) y feat[label] model Predictor(**cfg[model]) model.train(X, y) prob model.predict_proba(X.iloc[[-1]])[0] rec, reason generate_recommendation(prob, feat[iv_premium].iloc[-1], feat[pc_ratio].iloc[-1], cfg[recommendation][threshold]) print(f建议: {rec}, 理由: {reason})输出会打印建议和理由。如果报 KeyError检查特征列名是否匹配如果准确率异常高检查标签有没有未来信息泄露。5. 避坑与常见问题血泪经验汇总5.1 时间戳对齐失败现象merge 后数据行数骤减。原因股票和期权日期格式不一致或者时区不同。解决统一用 pd.to_datetime 转换加 utcTrue再检查交集。5.2 特征里有未来信息现象验证准确率 90% 以上实盘一塌糊涂。原因用了未来数据算特征比如用当日收盘价算当日波动率。解决所有滚动计算加 shift(1)确保只用历史数据。5.3 IV 数据缺失严重现象avg_iv 大量 NaN。原因期权链数据不完整很多合约没有成交。解决过滤掉 oi 为 0 的合约或者用插值补全但插值要谨慎容易引入偏差。5.4 模型过拟合现象训练集准确率 95%验证集 55%。原因树太深或特征太多。解决减小 max_depth增加 min_samples_leaf或者用交叉验证调参。5.5 计算器结果和实际成交价差太多现象理论价 5 块实际成交 7 块。原因用了历史波动率而不是隐含波动率或者没考虑买卖价差。解决sigma 用市场 IVpremium 用实际成交价别用理论价。6. 二次开发换模型、加策略、接数据源这个项目最值钱的地方是分层清晰你可以在任何一层动刀。换模型最直接在 predictor.py 里把 GradientBoostingClassifier 换成 XGBoost 或 LightGBM接口不变只要保证 fit 和 predict_proba 方法一致。我一般会先跑一遍基线再换模型对比特征重要性如果重要特征变了说明模型学到了不同东西值得深挖。加策略的话recommender.py 里的规则可以扩展成多条件组合。比如加入 game-theory 的思路当 pc_ratio 极高且 iv_premium 为正说明市场过度恐慌期权卖方有优势。你可以把规则写成打分制每个条件加分总分超过阈值才出建议。这样比硬阈值灵活。接数据源是另一个常见需求。项目默认读 csv你可以改成从数据库或 API 拉。常见做法是写一个 DataAdapter 类把不同来源的数据统一成 date, close, volume, iv, oi 格式后面所有模块不用改。验证方法很简单用同一份数据分别走 csv 和 API看输出是否一致。最后说一个我踩过的坑有次我改了特征工程忘了同步更新 config.yaml 里的特征列表结果模型训练时列对不上报了一堆 KeyError。从那以后我每次改特征都强制走一遍单元测试确保输入输出维度一致。希望帮到你。本文还有配套的精品资源点击获取