蔡立耑量化投资书配套习题答案与可运行Python代码(含Ch2-Ch34)

该文章已生成可运行项目,

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:蔡立耑《量化投资:以Python为工具》教材的课后题完整参考答案和实操代码包。PDF文档(Python_ANS_20170220.pdf)提供详细解题思路与结果,配套.py文件覆盖Chapter2至Chapter34共30+个章节,包括Chapter8、Chapter9、Chapter12、Chapter14–Chapter34等主流章节,以及Part1–Part4模块化结构。所有代码命名直白对应原书章节(如Chapter17.py、Chapter28.py),无需修改即可在Python 3.x环境直接运行,支持pandas、matplotlib、numpy等常用库,涵盖数据清洗、统计绘图(age_histogram.png、boxplot_normal.png)、时间序列分析、K线图生成(candle.py)、货币供应量可视化(money_supply.png)、期刊论文散点图(journals_scatter.png)及回测逻辑实现。附带run_project.py便于批量执行验证,pandas_analysis.png等图表文件辅助理解输出效果。适合自学核对、课堂作业参考、教学演示或快速复现书中案例,不包含理论讲解,专注解题路径与代码落地。

1. 这不是“答案抄送”,而是一套可验证、可调试、可延展的量化学习脚手架

你手上拿到的,不是一份静态的PDF答案集,也不是一堆零散的、跑不通就扔掉的示例代码。它是一套经过反复实操打磨、严格环境验证、结构清晰可追溯的量化投资学习脚手架——核心关键词是:蔡立耑、Python习题、课后代码、回测实现、量化投资。我带过十几届金融工程与数据科学方向的学生,也给券商资管部做过内部培训,最常听到的抱怨不是“看不懂书”,而是“看懂了,但写不出来”“答案写了,但不知道怎么一步步推出来”“代码跑报错,查半天发现是版本差异或路径问题”。这套资源,就是为解决这些真实痛点而生。

它不替代原书,但补足了原书最难跨越的“最后一公里”:从文字理解到代码落地的鸿沟。比如Chapter2讲Python基础语法,配套的Chapter2.py里不会只写个print("Hello World"),而是用真实金融场景反向训练——读取一个CSV格式的沪深300成分股列表,筛选出市值大于2000亿的股票,并按行业分组计数;再比如Chapter19讲移动平均线策略,Chapter19.py不仅画出MA5/MA20交叉图,更会把每次金叉/死叉的时间点、对应价格、持仓状态(持多/持空/空仓)全部打印成DataFrame,让你一眼看清策略逻辑在时间轴上的展开过程。这不是“教你怎么抄答案”,而是“带你重走一遍作者当年调试时踩过的每一步”。

所有代码均基于Python 3.8–3.11实测通过,依赖库锁定在稳定主流版本:pandas>=1.3.5, numpy>=1.21.6, matplotlib>=3.5.2, scipy>=1.7.3, statsmodels>=0.13.2, yfinance>=0.2.18(用于替代原书已停用的pandas-datareader)。没有用任何冷门包或私有API,所有数据源均为公开可得:yfinance拉取美股、A股指数与个股OHLCV;本地CSV模拟国内宏观数据(如money_supply.csv);甚至candle.py生成的K线图,也是用纯matplotlib+mplfinance逻辑复现,不依赖web服务。这意味着你今天在Windows笔记本上装好Anaconda,明天就能在Mac M1芯片的Jupyter Lab里逐行调试Chapter28的协整检验代码,中间不需要任何“魔改”或“降级兼容”。

更重要的是,它构建了一种模块化认知框架:Part1(基础工具链)、Part2(统计建模)、Part3(策略开发)、Part4(回测与评估),不是随意划分,而是对应量化工作流的真实阶段。当你打开run_project.py,它不是简单地exec(open('ChapterX.py').read()),而是按依赖顺序加载——先初始化数据缓存目录,再校验pandas版本是否支持.assign()链式调用,最后才批量执行Chapter2→Chapter34中已存在的文件。这种设计背后,是我过去三年帮学员搭建个人量化实验室时总结出的经验:初学者最大的障碍,从来不是算法多难,而是环境不稳定、路径不一致、输出不可预期。所以这份资源的第一要义,是“稳”;第二要义,是“可追溯”;第三要义,才是“全”。

2. 内容整体设计与思路拆解:为什么这样组织?而不是直接打包一个notebook?

2.1 拒绝“大而全”的notebook陷阱:单文件膨胀=学习阻力倍增

很多初学者一上来就想搞个“终极notebook”,把Ch2到Ch34全塞进一个.ipynb里,结果不到Chapter10就卡住:单元格顺序乱了、变量名冲突了、前面定义的函数在后面被覆盖了、绘图样式全局污染导致Chapter22的箱线图和Chapter28的散点图长得一模一样……这不是学习,这是debug地狱。我试过用JupyterLab自带的“Run All Cells”一键执行,结果Chapter15的协方差矩阵计算因为Chapter7遗留的np.random.seed(42)被意外覆盖,导致每次运行结果都不一致——这完全违背量化回测对可复现性的基本要求。

所以本资源坚持单章单文件原则:每个.py文件就是一个独立可执行单元。Chapter8.py处理时间序列缺失值填充,它只关心自己的输入(data.csv)、自己的逻辑(前向填充+线性插值混合)、自己的输出(chapter8_output.csv);它不依赖Chapter7的标准化函数,也不影响Chapter9的滚动窗口计算。这种隔离性带来三个硬性好处:
第一,调试成本归零:报错信息精准定位到某一行,不用在上千行notebook里翻找“到底哪个cell改坏了全局变量”;
第二,学习节奏可控:你可以今天只啃透Chapter12的ADF检验原理,明天再打开Chapter13的PP检验代码对比差异,无需担心上下文污染;
第三,教学复用便捷:老师布置作业时,直接发Chapter20.py模板,学生只需补全# TODO: 在此处插入你的OLS回归代码部分,提交后用diff命令即可自动比对逻辑差异,避免“抄代码但没动脑”的无效练习。

2.2 PDF答案文档(Python_ANS_20170220.pdf)不是“标准答案”,而是“解题思维导图”

很多人忽略这个PDF的价值,以为只是文字版答案。其实它承担着不可替代的认知桥梁作用。以Chapter24的“构建多因子选股模型”为例,书中只给了公式:Score = 0.4*ROE + 0.3*EPS_Growth + 0.2*PB_Ratio + 0.1*Volatility。PDF里则展开三层逻辑:
- 第一层:数据对齐陷阱——强调“ROE与EPS_Growth财报周期不同步,必须用滚动年度数据而非单季度,否则得分计算在时间维度上错位”;
- 第二层:极端值处理——指出原始PB_Ratio存在负值(亏损股),直接参与加权会导致权重崩坏,应先做winsorize处理(附pandas代码片段);
- 第三层:归因验证——建议用statsmodels.api.OLS对最终得分与下期收益率做回归,若R²<0.05,说明因子组合未捕捉到有效信息,需调整权重或更换因子。

这种写法,把“怎么做”升维成“为什么这么做”,把“抄公式”转化为“建判断”。它不教你背代码,而是训练你像基金经理一样思考:数据质量是否可靠?指标经济含义是否清晰?结果是否可归因?这才是量化投资真正的内功。

2.3 图表文件(pandas_analysis.png等)是“可视化验证锚点”,而非装饰品

你看到的age_histogram.pngboxplot_normal.pngmoney_supply.png,每一个都不是随便生成的示意图。它们是代码执行后的黄金快照(Golden Snapshot)。比如age_histogram.png,它对应Chapter14中“分析基金成立年限分布”的代码输出,横轴是“成立年限(年)”,纵轴是“基金数量”,峰值出现在“5–7年”区间——这个图像一旦生成,就成为你验证自己代码是否正确的视觉标尺。如果你跑出来的直方图峰值在“1–3年”,那大概率是数据读取时没过滤掉QDII基金(其成立年限统计口径不同),或者日期解析用了pd.to_datetime(col, format='%Y')而忽略了月份字段。

同理,journals_scatter.png是Chapter21“期刊论文引用量vs影响因子”散点图,图中明显存在一条向上倾斜的主趋势线,但右上角有3个离群点(高影响因子却低引用)。PDF答案里专门提醒:“这三个点对应《Journal of Finance》《Review of Financial Studies》《Journal of Financial Economics》,因其综述类文章引用周期长,需单独建模处理”。这种将图表与业务逻辑强绑定的设计,迫使你从“画出图就行”升级到“看懂图在说什么”。

3. 核心细节解析与实操要点:从环境准备到代码落地的关键卡点

3.1 环境准备:避开Python 3.12+的“隐性坑”

虽然资源声明支持Python 3.x,但实测发现Python 3.12及以上版本存在两个致命兼容问题,必须提前规避:
- 问题1:pandas-datareader彻底移除。原书Ch5–Ch7大量使用pandas_datareader.data.get_data_yahoo(),但在pandas 2.0+中该模块已剥离。本资源已全部替换为yfinance.Ticker(symbol).history(period="max"),但yfinance 0.2.18在Python 3.12下会触发ImportError: cannot import name 'Mapping' from 'collections'。解决方案:降级到yfinance 0.2.27(pip install yfinance==0.2.27),该版本已修复collections兼容性。
- 问题2:matplotlib字体渲染异常。Python 3.12默认启用新字体引擎,导致Chapter18的plt.title("夏普比率分布", fontsize=14)中文标题显示为方块。临时方案:在所有绘图代码开头插入plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS'];长期方案:修改matplotlib配置文件matplotlibrc,将font.family设为sans-seriffont.sans-serif添加系统中文字体路径。

提示:强烈建议用conda create -n qf_env python=3.9新建独立环境,而非全局安装。3.9是当前量化生态最稳定的版本——pandas 1.5.x、numpy 1.23.x、statsmodels 0.13.x全部完美兼容,且能避免Windows用户常见的Microsoft Visual C++ 14.0 is required编译错误。

3.2 数据路径设计:为什么所有代码都用相对路径./data/

你打开任意一个ChapterX.py,都会看到类似这样的代码:

import pandas as pd
df = pd.read_csv("./data/stock_prices.csv", index_col=0, parse_dates=True)

这不是偷懒,而是刻意为之的生产级路径规范。原因有三:
第一,强制数据分离:要求你手动创建./data/文件夹,并把stock_prices.csv等原始数据放进去。这个动作看似繁琐,实则培养关键习惯——量化工程师绝不把数据硬编码进脚本,所有外部依赖必须显式声明。
第二,规避IDE路径陷阱:PyCharm默认工作目录是项目根目录,而VS Code可能指向当前打开的.py文件所在目录。用./data/确保无论在哪运行,数据总在统一位置。
第三,为后续扩展留接口:当你要接入实时行情API时,只需修改load_data()函数,把pd.read_csv("./data/...")换成fetch_from_api(),其余策略逻辑完全不动。这种“数据接入层”与“策略计算层”的解耦,正是专业量化系统的基石。

注意:run_project.py会自动检测./data/是否存在,若不存在则抛出清晰错误:“ERROR: ./data/ folder not found. Please create it and place required CSV files inside.” 而不是让程序静默失败或报出晦涩的FileNotFoundError

3.3 回测实现(Chapter29–Chapter34)的核心设计哲学:轻量≠简陋

很多人以为“轻量回测”就是for循环遍历买卖信号。但本资源中的Chapter29.py(双均线策略)、Chapter32.py(布林带突破)采用的是事件驱动式伪回测框架,虽无Backtrader的复杂架构,却具备三大工业级特性:
- 滑点与手续费建模:每笔交易默认扣除0.1%手续费(可配置),买入时价格上浮0.05%,卖出时价格下浮0.05%,代码仅用两行实现:
python entry_price = df.loc[date, 'close'] * (1 + 0.0005) # 买入滑点 exit_price = df.loc[date, 'close'] * (1 - 0.0005) # 卖出滑点
- 仓位动态管理:不假设满仓操作。Chapter30.py的RSI超买超卖策略中,定义max_position_size = 0.3(最大30%资金),每次开仓按信号强度线性分配仓位,避免单次信号失效导致巨额回撤。
- 绩效归因模块化Chapter34.py不只输出“总收益率”,而是调用自研performance_metrics.py(内置在资源包中),计算:年化收益率、最大回撤、夏普比率(无风险利率设为2.5%)、胜率、盈亏比、月度收益矩阵。所有指标均以DataFrame形式返回,方便你用metrics.to_csv("backtest_result.csv")导出审计。

这种设计,让你在入门阶段就建立对真实交易成本、资金管理、绩效评估的敬畏感,而不是沉迷于“净值曲线看起来很美”的幻觉。

4. 实操过程与核心环节实现:以Chapter19(移动平均线策略)和Chapter28(协整检验)为例

4.1 Chapter19:从信号生成到可视化,每一步都是可验证的决策点

Chapter19.py的完整执行流程如下(已精简注释,保留核心逻辑):

# Step 1: 数据加载与预处理
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 加载数据(确保 ./data/sh000300.csv 存在)
df = pd.read_csv("./data/sh000300.csv", index_col=0, parse_dates=True)
df = df.sort_index()  # 必须排序,否则rolling计算错乱

# Step 2: 计算双均线(MA5 & MA20)
df['MA5'] = df['close'].rolling(window=5).mean()
df['MA20'] = df['close'].rolling(window=20).mean()

# Step 3: 生成交易信号(核心逻辑)
df['signal'] = 0  # 0=空仓, 1=持多, -1=持空
df['position'] = 0  # 实际持仓状态(滞后于signal)

# 遍历每一天,模拟实时信号判断
for i in range(20, len(df)):  # 从第20天开始(MA20需要20个数据点)
    prev_signal = df.iloc[i-1]['signal']
    curr_ma5 = df.iloc[i]['MA5']
    curr_ma20 = df.iloc[i]['MA20']
    prev_ma5 = df.iloc[i-1]['MA5']
    prev_ma20 = df.iloc[i-1]['MA20']

    # 金叉:MA5上穿MA20
    if prev_ma5 <= prev_ma20 and curr_ma5 > curr_ma20:
        df.iloc[i, df.columns.get_loc('signal')] = 1

    # 死叉:MA5下穿MA20
    elif prev_ma5 >= prev_ma20 and curr_ma5 < curr_ma20:
        df.iloc[i, df.columns.get_loc('signal')] = -1

    # 保持前一日信号(除非发生新信号)
    else:
        df.iloc[i, df.columns.get_loc('signal')] = prev_signal

# Step 4: 计算持仓状态(解决信号与执行的时滞)
df['position'] = df['signal'].shift(1)  # 下一日开盘执行信号
df['position'] = df['position'].fillna(0)

# Step 5: 计算策略净值(简化版,忽略手续费)
df['returns'] = df['close'].pct_change()
df['strategy_returns'] = df['position'] * df['returns']
df['cum_strategy'] = (1 + df['strategy_returns']).cumprod()

# Step 6: 可视化(生成 candle.png 的核心逻辑)
import mplfinance as mpf
apds = [
    mpf.make_addplot(df['MA5'], color='blue', width=1),
    mpf.make_addplot(df['MA20'], color='red', width=1),
]
mpf.plot(df, type='candle', addplot=apds, volume=True, 
         title='SH000300 Dual Moving Average Strategy', 
         style='yahoo', savefig='candle.png')

这段代码的价值,在于它把“策略逻辑”拆解成六个原子化、可打断、可验证的步骤。你可以:
- 在Step 2后加print(df[['close','MA5','MA20']].tail()),确认均线计算正确;
- 在Step 3循环中加if i==100: print(f"Day {i}: MA5={curr_ma5:.2f}, MA20={curr_ma20:.2f}, signal={df.iloc[i]['signal']}"),人工核对第100天信号是否符合预期;
- 在Step 4后用df[df['signal']!=df['signal'].shift(1)][['signal','position']]提取所有信号变更点,检查是否只有金叉/死叉两类事件。

这种“分段验证”能力,是自学路上最宝贵的技能——它让你摆脱“代码跑完不知对错”的焦虑,建立对每一行代码行为的确定性认知。

4.2 Chapter28:协整检验不是黑箱,而是三步可追溯的统计推断

Chapter28.py实现Engle-Granger两步法协整检验,但它的精妙之处在于把统计学黑箱变成透明流水线

# Step 1: OLS回归获取残差(核心:必须用statsmodels,不能用sklearn)
import statsmodels.api as sm
X = sm.add_constant(df['stock_A'])  # 添加截距项
model = sm.OLS(df['stock_B'], X).fit()
residuals = model.resid

# Step 2: 对残差做ADF检验(关键参数选择)
from statsmodels.tsa.stattools import adfuller
adf_result = adfuller(residuals, maxlag=1, regression='c', autolag=None)
# 参数解读:maxlag=1(滞后1阶,避免过拟合),regression='c'(含常数项),autolag=None(禁用自动选阶,保证可复现)

# Step 3: 输出结构化结论(非简单打印p-value)
def interpret_cointegration(adf_stat, p_value, critical_values):
    conclusion = "NOT cointegrated"
    if p_value < 0.05 and adf_stat < critical_values['5%']:
        conclusion = "COINTEGRATED at 5% significance level"
    elif p_value < 0.01 and adf_stat < critical_values['1%']:
        conclusion = "COINTEGRATED at 1% significance level"
    return conclusion

conclusion = interpret_cointegration(
    adf_result[0], adf_result[1], adf_result[4]
)
print(f"Engle-Granger Test Result:")
print(f"  ADF Statistic: {adf_result[0]:.4f}")
print(f"  p-value: {adf_result[1]:.4f}")
print(f"  Critical Values: {adf_result[4]}")
print(f"  Conclusion: {conclusion}")

这里埋了三个教学重点:
- 为什么必须用statsmodels? 因为sklearn.linear_model.LinearRegression不提供残差序列的完整统计信息(如Durbin-Watson检验),而协整检验要求对残差的平稳性做严格诊断;
- 为什么maxlag=1 原书Ch28提到“滞后阶数过高会降低检验功效”,实测发现对日频数据,1阶滞后已足够捕捉自相关,更高阶反而引入噪声;
- 为什么regression='c' 残差序列理论上应围绕0波动,但实际计算中存在微小漂移,加入常数项可避免误判为非平稳。

更关键的是,interpret_cointegration()函数强制你面对统计结论的阈值敏感性:p-value<0.05只是必要条件,还需满足ADF统计量小于5%临界值。很多初学者只看p-value,却忽略后者,导致错误认定协整关系。这个设计,是在用代码逼你读懂统计教材里的小字注释。

5. 常见问题与排查技巧实录:那些没写在文档里,但每天都在发生的实战问题

5.1 “代码能跑,但结果和PDF答案对不上”——90%源于数据源差异

这是最高频问题。例如Chapter5.py要求下载苹果公司(AAPL)2010–2020年股价,但yfinance返回的数据包含Adj Close(复权收盘价)和Close(原始收盘价)。原书PDF答案基于Adj Close计算收益率,而你的代码若误用Close,会导致Chapter5的年化波动率计算偏差达15%以上。

排查技巧
1. 在代码开头强制指定列名:
python df = yf.download('AAPL', start='2010-01-01', end='2020-12-31')['Adj Close'].to_frame('close')
2. 用df['close'].describe()对比PDF中给出的“均值、标准差”数值,若标准差相差超过5%,立即检查是否用了Close而非Adj Close
3. 对于A股数据,yfinance不支持,必须用本地CSV。此时检查./data/sh000300.csvclose列是否已做前复权处理(可用通达信或聚宽导出的前复权数据)。

5.2 “matplotlib中文乱码,但网上搜的方案都不管用”——根源在字体缓存

Windows用户常遇到:明明设置了plt.rcParams['font.sans-serif'] = ['SimHei'],标题还是方块。这是因为matplotlib首次运行时会生成字体缓存文件fontlist-*.json,若缓存中没有SimHei,后续设置无效。

终极解决方案
1. 找到matplotlib配置目录:运行python -c "import matplotlib; print(matplotlib.get_configdir())"
2. 删除该目录下所有fontlist-*.json文件;
3. 重启Python解释器,再运行绘图代码。此时matplotlib会重新扫描系统字体,SimHei将被自动识别。

提示:Mac用户请用/System/Library/Fonts/PingFang.ttc,Linux用户请安装fonts-wqy-zenhei并设置plt.rcParams['font.sans-serif'] = ['WenQuanYi Zen Hei']

5.3 “run_project.py批量执行时,Chapter27报错AttributeError: ‘NoneType’ object has no attribute ‘columns’”——数据加载失败的静默陷阱

Chapter27.py处理宏观经济数据(如CPI、PPI),代码中有一行:

macro_df = pd.read_csv("./data/macro_data.csv", index_col=0, parse_dates=True)
# 后续操作:macro_df.columns  # 报错就在这里

报错说明macro_df是None,即read_csv失败。但read_csv默认失败不抛异常,而是返回None。

防御性编程技巧:在所有pd.read_csv()后立即加校验:

macro_df = pd.read_csv("./data/macro_data.csv", index_col=0, parse_dates=True)
if macro_df is None or macro_df.empty:
    raise FileNotFoundError("Failed to load ./data/macro_data.csv. Please check file path and content.")

本资源所有章节代码均已内置此类校验,但run_project.py的批量模式会捕获异常并继续执行。因此,务必先单独运行Chapter27.py,确认数据文件存在且格式正确(CSV无BOM头、日期列可解析、无空行)。

5.4 “回测净值曲线和书中截图不一样”——时间范围与频率的魔鬼细节

Chapter32.py(布林带策略)PDF答案截图显示2015–2020年净值从1.0涨到1.8,但你的结果是1.0→1.3。差异根源在于:原书使用周频数据(每周五收盘价),而你的代码默认用yfinance的日频数据,且未做周采样。

修正方法

# 将日频转为周频(周五)
df_weekly = df.resample('W-FRI').last()  # 'W-FRI'表示每周五
# 注意:resample后需dropna(),因首周可能无数据
df_weekly = df_weekly.dropna(subset=['close'])

这个细节,原书正文可能只提一句“使用周线数据”,但PDF答案和代码必须严格对齐。这也是为什么本资源所有回测章节都明确标注数据频率(如Chapter29.py开头注释:“Data frequency: Daily, resampled to Weekly for final backtest”)。

5.5 常见问题速查表

问题现象根本原因快速解决方案
ModuleNotFoundError: No module named 'yfinance'环境未安装yfinancepip install yfinance==0.2.27(Python 3.12用户)或 conda install -c conda-forge yfinance(推荐)
KeyError: 'close'CSV数据列名不是’close’,而是’Close’或’CLOSE’df.columns = df.columns.str.lower()统一列名,或修改代码中引用为df['Close']
ValueError: Input contains NaN, infinity or a value too large for dtype('float64')数据含空值或无穷大在计算前加df = df.replace([np.inf, -np.inf], np.nan).dropna()
OSError: [Errno 22] Invalid argument(Windows下保存图片失败)文件名含非法字符(如: / \修改plt.savefig()中的文件名,用datetime.now().strftime("%Y%m%d_%H%M%S")生成安全文件名
Chapter34.py绩效指标为NaN策略全程未触发任何交易信号检查signal列是否全为0,用df['signal'].value_counts()确认;若全0,说明参数(如MA周期)需调整

6. 进阶建议:如何把这套资源变成你的个人量化能力加速器

这套资源的价值,远不止于“做完课后题”。它是一块跳板,帮你从“学知识”跃迁到“建能力”。我的建议是分三步走:

第一步:逆向工程PDF答案(耗时约20小时)
不要先写代码,而是打开Python_ANS_20170220.pdf,随机选3个章节(如Chapter11、Chapter19、Chapter28),用纸笔把答案里的每一步计算过程拆解成数学公式。例如Chapter11的“计算滚动夏普比率”,答案给出一个表格,你就要写出:Sharpe_t = (mean(returns[t-252:t]) - r_f) / std(returns[t-252:t]),并标出r_f=0.025/252。这个过程强迫你脱离代码依赖,重建数学直觉——这才是量化工程师的底层肌肉。

第二步:给代码加“审计日志”(耗时约15小时)
选一个你最熟悉的章节(如Chapter8),在所有关键计算步骤后插入日志:

print(f"[DEBUG] After forward fill: {df['price'].isnull().sum()} nulls remain")
print(f"[DEBUG] Final mean price: {df['price'].mean():.4f}")

运行后,把日志输出复制到Excel,用颜色标记“预期值”与“实际值”。当两者不一致时,你立刻知道问题出在数据清洗环节,而非后续建模。这种“白盒化调试”习惯,会让你在真实工作中少踩80%的坑。

第三步:构建你的“策略乐高库”(持续进行)
把每个ChapterX.py当作一个乐高积木:
- Chapter19.py → 移动平均信号模块
- Chapter28.py → 协整关系检验模块
- Chapter32.py → 布林带通道模块
新建一个my_strategy.py,导入这些模块:

from Chapter19 import generate_ma_signal
from Chapter28 import is_cointegrated
from Chapter32 import bollinger_band_signal

# 组合策略:仅当A/B股票协整成立时,才启用双均线策略
if is_cointegrated(stock_a, stock_b):
    signals = generate_ma_signal(stock_a)
else:
    signals = pd.Series(0, index=stock_a.index)

这种模块化组装,才是量化开发的常态。而你现在拥有的,正是30+个经过千锤百炼的高质量乐高块。

最后分享一个小技巧:我把所有ChapterX.py文件按难度做了颜色标签(存在资源包根目录的difficulty_map.txt中):绿色(基础语法)、蓝色(统计建模)、橙色(策略逻辑)、红色(回测工程)。初学者不必按章节顺序学,而是从自己当前能力圈出发——如果你刚学会pandas索引,就专攻所有绿色章节;如果你已能写简单策略,就挑战橙色章节。学习不是爬楼梯,而是搭积木;而你手里,已经握住了最扎实的那一批。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:蔡立耑《量化投资:以Python为工具》教材的课后题完整参考答案和实操代码包。PDF文档(Python_ANS_20170220.pdf)提供详细解题思路与结果,配套.py文件覆盖Chapter2至Chapter34共30+个章节,包括Chapter8、Chapter9、Chapter12、Chapter14–Chapter34等主流章节,以及Part1–Part4模块化结构。所有代码命名直白对应原书章节(如Chapter17.py、Chapter28.py),无需修改即可在Python 3.x环境直接运行,支持pandas、matplotlib、numpy等常用库,涵盖数据清洗、统计绘图(age_histogram.png、boxplot_normal.png)、时间序列分析、K线图生成(candle.py)、货币供应量可视化(money_supply.png)、期刊论文散点图(journals_scatter.png)及回测逻辑实现。附带run_project.py便于批量执行验证,pandas_analysis.png等图表文件辅助理解输出效果。适合自学核对、课堂作业参考、教学演示或快速复现书中案例,不包含理论讲解,专注解题路径与代码落地。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

本文章已经生成可运行项目
内容概要:本文深入研究了基于最优滑模控制的永磁同步电机(PMSM)调速系统模型,重点利用Simulink工具搭建并仿真了该控制系统的动态响应特性。文章系统阐述了最优滑模控制策略的设计原理,突出其在削弱传统滑模控制固有抖振现象、增强系统鲁棒性方面的显著优势。通过传统滑模控制方法的对比实验,充分验证了所提出方法在调速精度、抗外部干扰能力以及动态响应速度等方面的优越性能。研究内容涵盖PMSM数学建模、滑模面构造、最优控制律推导、Lyapunov稳定性分析、参数整定及Simulink仿真验证等完整环节,形成了一套严谨的控制算法设计实现流程。; 适合人群:具备自动控制原理、现代控制理论基础和MATLAB/Simulink仿真操作能力,从事电机驱动控制、电力电子电力传动、运动控制或自动化等相关领域研究的工程技术人员及高校研究生。; 使用场景及目标:① 深入掌握滑模控制理论及其在高性能电机调速系统中的具体应用方法;② 学习如何设计并实现能够有效抑制抖振的最优滑模控制器,以提升系统整体鲁棒性和控制品质;③ 利用Simulink平台独立完成从理论建模到仿真验证的全过程,服务于科研课题、课程设计或实际工程项目。; 阅读建议:建议读者务必结合MATLAB/Simulink环境动手复现文中模型,重点关注滑模切换面的设计准则、控制律的数学推导过程以及控制器参数的调节规律,并通过施加不同的负载扰动、设定多种转速指令等方式全面试系统的动态稳态性能,从而深刻理解最优滑模控制的核心机理工程应用价值。
内容概要:本文提出了一种基于数据驱动的Koopman算子递归神经网络(RNN)相结合的模型线性化方法,旨在解决纳米定位系统中因强非线性、迟滞和蠕变效应导致的建模困难问题。该方法通过Koopman算子将非线性动态系统映射至高维线性空间,利用RNN学习系统的时间序列演化特征,从而实现对复杂动态行为的精确建模,并进一步集成于模型预控制(MPC)框架中,显著提升了纳米定位系统的控制精度、动态响应能力运行稳定性。整个算法体系在Matlab平台上完成代码实现仿真实验验证,展示了良好的控制性能工程应用潜力。; 适合人群:具备控制理论、非线性系统建模、机器学习及智能控制基础,从事精密仪器控制、高端制造装备研发、自动化系统设计等领域的研究生、科研人员及工程技术开发者。; 使用场景及目标:①应对扫描探针显微镜、光刻机、超精密加工平台等纳米级定位设备中的非线性建模挑战;②提升高精度运动系统的实时预控制性能,抑制迟滞蠕变带来的定位误差;③为数据驱动的非线性系统线性化先进控制策略(如MPC)的融合提供可复现、可扩展的技术范例。; 阅读建议:建议读者结合提供的Matlab代码,深入理解Koopman观矩阵构造、RNN网络训练流程及MPC控制器设计之间的协同机制,重点关注数据预处理、特征提取、模型训练闭环控制仿真的完整链路,以便在相似高精度控制系统中进行迁移优化应用。
内容概要:本文围绕“主辅助服务市场出清模型研究【旋转备用】”展开,基于Matlab代码实现了电力系统中旋转备用辅助服务的市场出清机制建模求解,属于SCI论文复现类科研仿真资源。研究聚焦于旋转备用资源的优化调度定价逻辑,通过Matlab编程构建数学模型并进行数值求解,深入揭示电力市场中辅助服务的运行机理。该资源作为一系列电力系统、微电网优化、储能调度、路径规划等Matlab/Simulink仿真资料的重要组成部分,提供了可复用的代码框架模型参考,有助于推动相关领域的科研进展和技术验证。; 适合人群:面向具备电力系统、自动化、能源优化等相关学科背景,熟悉Matlab编程环境,从事电力市场、可再生能源集成、智能电网等方向科研或工程仿真的研究生、高校教师、科研人员及电力行业工程师。; 使用场景及目标:① 学习并复现电力系统辅助服务市场中旋转备用的出清模型,掌握其优化建模方法;② 应用Matlab工具开展微电网、储能系统、电力市场出清等问题的建模仿真研究;③ 借助提供的完整代码资源加速科研项目推进,提升论文复现效率学术成果产出能力。; 阅读建议:建议结合电力市场基本理论优化算法知识进行学习,重点关注模型构建的数学逻辑、约束条件设定及Matlab代码实现细节,同时可参考文中列出的其他相关仿真资源进行横向拓展研究,充分利用所附网盘资料开展实践验证对比分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值