news 2026/5/1 18:14:51

Python期权量化分析利器optopsy:从数据清洗到策略回测实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python期权量化分析利器optopsy:从数据清洗到策略回测实战

1. 项目概述:一个为量化交易者打造的Python期权分析利器

如果你在量化交易,特别是期权策略研究领域摸爬滚打过一段时间,大概率会和我有同样的感受:市面上现成的期权数据分析工具,要么是彭博、路透那种重型、昂贵且封闭的商业终端,要么就是一些功能零散、接口不统一的Python库,用起来总感觉差点意思。自己从头写一套数据清洗、希腊字母计算和策略回测的框架?那工程量又足以劝退绝大多数个人研究者和中小团队。直到我发现了goldspanlabs/optopsy这个项目,它精准地切中了这个痛点。

optopsy是一个用Python编写的、专注于期权数据分析与策略回测的开源库。它的核心目标很明确:为研究者和交易员提供一个免费、轻量、但功能强大且接口友好的工具,让你能高效地处理历史期权数据,进行复杂的策略模拟和绩效分析。简单来说,它试图成为期权量化领域的“pandas+backtrader”结合体——既提供灵活的数据操作能力,又内置了回测引擎。这个项目来自GoldSpan Labs,从命名和代码质量看,背后应该是一群深谙期权交易与软件工程的实战派。

对于量化从业者、金融工程学生,或是任何对期权策略自动化感兴趣的人来说,optopsy的价值在于它极大地降低了策略验证的门槛。你不再需要花费大量时间在数据格式转换、合约生命周期管理(如到期日、行权价映射)这些繁琐的“脏活”上,可以更专注于策略逻辑本身。接下来,我将深入拆解它的设计思路、核心功能,并分享如何用它快速搭建一套属于自己的期权策略研究流水线。

2. 核心架构与设计哲学解析

2.1 以数据为中心的管道式设计

optopsy的架构非常清晰,它采用了经典的ETL(提取、转换、加载)管道模式,并将这一模式深度融入其API设计中。整个库可以看作是一系列数据转换操作的组合。你从原始数据(通常是CSV文件)开始,通过一系列定义好的“过滤器”和“计算函数”,逐步得到你想要的策略信号和绩效指标。

这种设计哲学的优势在于高度的可组合性和可读性。你的代码流程几乎就是对数据分析流程的直接描述。例如,一个典型的数据处理链可能是:读取数据->过滤到期日->过滤行权价范围->计算希腊字母->生成交易信号->执行回测。在optopsy中,这可以非常流畅地用链式调用或管道操作表达出来。

注意:这种管道式设计要求输入数据具有相对规范的结构。optopsy对输入数据的列名有预设的期望(例如,underlying_symbol,underlying_price,option_type,strike,expiration,bid,ask等)。如果你的数据源格式不同,需要在最前期进行一步重命名或映射操作,这是接入任何数据源的关键一步。

2.2 核心数据结构:期权合约的标准化表达

在内部,optopsy极度依赖pandas DataFrame来存储和操作数据。但它不仅仅是简单包装了pandas,而是定义了一套关于期权合约的语义层。它将每一行数据都视为一个在特定时间点、具有特定属性的期权合约实例。

这个语义层通过强制性的数据列和内置的验证逻辑来体现。库函数在执行计算(如定价模型、希腊字母)时,会预期这些列的存在。这种设计确保了计算的正确性,避免了因数据歧义导致的错误。例如,计算隐含波动率(IV)时,库函数会自动识别expiration(到期日)、evaluation_date(评估日期)来计算剩余期限(T),并利用underlying_price(标的价格)和strike(行权价)等核心字段。

2.3 策略回测引擎的轻量化实现

与专业的、多资产类别的通用回测框架(如Zipline,Backtrader)不同,optopsy的回测引擎是高度特化于期权的。它省去了对股票订单簿、期货保证金等复杂模块的支持,专注于期权交易的两个核心特性:时间衰减(Theta)非线性损益

它的回测逻辑通常是基于“每日”或“指定频率”的快照式回检。在每一个回测时间点,引擎会根据你定义的策略函数,基于当时的合约数据(价格、希腊值)做出交易决策(开仓、平仓),并跟踪投资组合的价值变化。损益计算会充分考虑期权权利金的收支、合约的到期作废以及行权/被行权(如果模拟该功能)的场景。

这种轻量化使得回测速度非常快,特别适合需要大量参数扫描(如不同行权价、到期日组合)的策略研究。你可以在几分钟内回测成千上万种策略变体,这是重型回测框架难以比拟的效率。

3. 从零开始:数据准备与快速上手

3.1 安装与环境配置

安装optopsy非常简单,它可以通过pip直接安装。由于它依赖于pandas,numpy,scipy等科学计算栈,建议在一个干净的环境中进行。

# 创建并激活一个虚拟环境(推荐) python -m venv optopsy_env source optopsy_env/bin/activate # Linux/macOS # optopsy_env\Scripts\activate # Windows # 安装 optopsy pip install optopsy

安装完成后,在Python中导入它,通常我们主要使用其核心的API模块。

import optopsy as op import pandas as pd import numpy as np

3.2 准备你的期权历史数据

这是使用optopsy最关键,也可能是最耗时的一步。库本身不提供数据,你需要自行准备。数据格式必须是一个包含特定字段的CSV文件。以下是最小必需字段的列表及其含义:

字段名说明示例
underlying_symbol标的资产代码SPX
quote_date报价日期2023-10-26
expiration期权到期日2023-11-17
strike行权价4500.00
option_type期权类型C(看涨) 或P(看跌)
bid买价85.50
ask卖价86.00
underlying_price报价时的标的价格4495.50

实操心得underlying_price字段至关重要且容易出错。它必须是该期权合约在quote_date这个时间点的标的物市场价格,而不是收盘价或其他价格。很多免费数据源提供的可能是期权收盘价和标的收盘价,但两者在时间上可能不完全同步,这会给隐含波动率等计算带来偏差。如果可能,尽量使用日内快照数据或确保时间对齐的收盘数据。

假设你的数据文件spx_options.csv已经准备好,列名与上述一致,读取数据非常简单:

# 使用 optopsy 提供的读取函数,它会进行初步的格式检查和类型转换 data = op.get(options_file='spx_options.csv') # 或者,如果你已经用 pandas 读取了 DataFrame,可以这样转换 # df = pd.read_csv('spx_options.csv') # data = op.transform(df) # 确保列名匹配

查看一下数据的前几行和基本信息,确保一切正常:

print(data.head()) print(f"数据时间范围: {data['quote_date'].min()} 到 {data['quote_date'].max()}") print(f"标的物: {data['underlying_symbol'].unique()}") print(f"合约数量: {len(data)}")

4. 核心功能深度剖析与实战

4.1 数据筛选与切片:找到你需要的合约

期权数据量通常非常庞大。optopsy提供了一套直观的过滤函数,用于筛选特定条件的合约。这些函数返回的是过滤后的DataFrame,因此可以链式调用。

示例1:筛选特定到期周期的合约我们经常想交易“下个月到期”的期权。这就需要根据quote_dateexpiration来计算剩余天数并过滤。

# 计算剩余天数并添加到数据中(如果原数据没有的话) data['dte'] = (pd.to_datetime(data['expiration']) - pd.to_datetime(data['quote_date'])).dt.days # 筛选剩余天数在20到50天之间的合约 near_term_data = data[(data['dte'] >= 20) & (data['dte'] <= 50)]

optopsy可能有内置的辅助函数来简化这个过程,但理解底层逻辑是自定义筛选条件的基础。

示例2:筛选平值期权附近的行权价平值期权通常流动性最好。我们可以筛选行权价接近当前标的价格的合约。

# 假设我们分析某一天的数据 single_day_data = data[data['quote_date'] == '2023-10-26'] current_underlying_price = single_day_data['underlying_price'].iloc[0] # 取当天的标的价格 # 定义一个范围,例如标的价格的 ±2% price_range = 0.02 lower_bound = current_underlying_price * (1 - price_range) upper_bound = current_underlying_price * (1 + price_range) atm_data = single_day_data[(single_day_data['strike'] >= lower_bound) & (single_day_data['strike'] <= upper_bound)]

4.2 期权定价与希腊字母计算

这是optopsy的核心能力之一。它内置了布莱克-舒尔斯模型(用于欧式期权)来计算理论价格、隐含波动率和希腊字母。使用前,需要确保数据中有无风险利率字段,或者你可以指定一个常数值。

计算隐含波动率(IV)隐含波动率是期权分析的生命线。optopsy可以反向求解BS模型,从市场价格反推出波动率。

# 假设我们已经有数据,并添加了 mid_price (买卖中间价) 作为计算依据 data['mid_price'] = (data['bid'] + data['ask']) / 2 # 使用 optopsy 的 iv 函数计算隐含波动率 # 需要指定:标的价格列、行权价列、剩余时间(年化)、无风险利率、期权类型、市场价格列 # 首先需要计算年化剩余时间 T data['T'] = (pd.to_datetime(data['expiration']) - pd.to_datetime(data['quote_date'])).dt.days / 365.0 # 假设无风险利率为 0.02 (2%) r = 0.02 # 注意:这里需要查阅 optopsy 最新API,计算IV的函数名可能是 `compute_iv` 或类似 # 以下为逻辑示例,实际函数调用请参考官方文档 try: data['iv'] = op.compute_iv( S=data['underlying_price'], K=data['strike'], T=data['T'], r=r, option_type=data['option_type'], price=data['mid_price'] ) except AttributeError: # 如果函数名不同,可能需要查看文档或使用其他方式 print("请查阅 optopsy 文档确认计算IV的函数名")

计算希腊字母一旦有了隐含波动率(或直接指定一个历史波动率),就可以计算Delta, Gamma, Theta, Vega等希腊字母。

# 继续使用上面的数据,假设我们已经有了 iv 列 # 计算 Delta data['delta'] = op.greeks.delta( S=data['underlying_price'], K=data['strike'], T=data['T'], r=r, sigma=data['iv'], # 使用计算出的隐含波动率 option_type=data['option_type'] ) # 类似地,可以计算 gamma, theta, vega data['gamma'] = op.greeks.gamma(S=data['underlying_price'], K=data['strike'], T=data['T'], r=r, sigma=data['iv']) data['theta'] = op.greeks.theta(S=data['underlying_price'], K=data['strike'], T=data['T'], r=r, sigma=data['iv'], option_type=data['option_type']) data['vega'] = op.greeks.vega(S=data['underlying_price'], K=data['strike'], T=data['T'], r=r, sigma=data['iv'])

注意事项:布莱克-舒尔斯模型假设波动率是常数,且适用于欧式期权。对于美式期权(如大多数个股期权)或存在大幅股息的情况,BS模型计算结果会有偏差。optopsy可能也支持其他模型(如二叉树),需要根据文档确认。对于标普500指数(SPX)等欧式期权,BS模型是合适的。

4.3 构建与回测一个简单策略:跨式期权组合

让我们用一个经典的“跨式期权组合”策略来演示optopsy的回测流程。该策略同时买入相同到期日、相同行权价的看涨和看跌期权,预期标的价格会有大幅波动(无论方向)。

步骤1:定义策略生成函数这个函数将在每个回测日期被调用,负责根据当前数据生成交易信号。

def long_straddle_strategy(data, params): """ 多头跨式策略。 params: 字典,可包含如‘dte_min‘(最小剩余天数)、‘dte_max‘(最大剩余天数)等参数 """ # 1. 筛选接近平值的合约(例如,行权价最接近标的价格的2个) current_price = data['underlying_price'].iloc[0] data['strike_diff'] = abs(data['strike'] - current_price) # 找到最接近平值的行权价 atm_strike = data.loc[data['strike_diff'].idxmin(), 'strike'] # 2. 筛选特定到期日的合约(例如,选择剩余30-60天的) filtered_data = data[(data['dte'] >= params.get('dte_min', 30)) & (data['dte'] <= params.get('dte_max', 60))] # 3. 选取该行权价下的看涨和看跌期权 call_option = filtered_data[(filtered_data['strike'] == atm_strike) & (filtered_data['option_type'] == 'C')] put_option = filtered_data[(filtered_data['strike'] == atm_strike) & (filtered_data['option_type'] == 'P')] # 检查是否两者都存在 if not call_option.empty and not put_option.empty: # 构建交易指令列表。假设我们各买入1手。 # 交易指令格式可能为 (action, option_id, quantity) 或类似,需参考 optopsy 回测API # 这里为逻辑示意 trades = [ {'action': 'BUY', 'contract': call_option.iloc[0], 'qty': 1}, {'action': 'BUY', 'contract': put_option.iloc[0], 'qty': 1} ] return trades else: return [] # 没有符合条件的合约,不交易

步骤2:运行回测optopsy的回测引擎需要你提供数据、策略函数、初始资金等参数。

# 假设我们已经将全量数据加载到 `full_data` DataFrame 中,并计算好了必要的列(dte, iv, Greeks等) # 定义回测参数 backtest_params = { 'strategy_func': long_straddle_strategy, 'strategy_params': {'dte_min': 30, 'dte_max': 60}, 'initial_capital': 10000.0, # 初始资金1万美元 'start_date': '2023-01-03', 'end_date': '2023-06-30', } # 运行回测(具体函数名和参数请参考官方文档,以下为示例) # results = op.backtest.run(full_data, **backtest_params)

步骤3:分析回测结果回测引擎会返回一个包含每日持仓、现金流、投资组合价值等信息的DataFrame

# 分析结果 # print(results.tail()) # 计算总收益 # final_value = results['portfolio_value'].iloc[-1] # total_return = (final_value - backtest_params['initial_capital']) / backtest_params['initial_capital'] # print(f"最终组合价值: ${final_value:.2f}") # print(f"总收益率: {total_return:.2%}") # 绘制净值曲线 # import matplotlib.pyplot as plt # plt.figure(figsize=(12,6)) # plt.plot(results['date'], results['portfolio_value']) # plt.title('Portfolio Value Over Time') # plt.xlabel('Date') # plt.ylabel('Value ($)') # plt.grid(True) # plt.show()

5. 高级技巧与性能优化

5.1 利用向量化操作提升计算效率

期权数据分析涉及大量合约的重复计算(如为每个合约计算希腊字母)。使用pandas的向量化操作(即对整个SeriesDataFrame列进行操作)比用for循环遍历每一行要快几个数量级。

optopsy的希腊字母计算函数通常就是向量化的。确保你传入的是pandas Series对象,而不是标量值。例如,前面计算delta的示例就是一次对整个数据列的向量化计算。

需要避免的常见低效做法:

# 错误:循环遍历,极其缓慢 deltas = [] for idx, row in data.iterrows(): d = op.greeks.delta(row['underlying_price'], row['strike'], row['T'], r, row['iv'], row['option_type']) deltas.append(d) data['delta'] = deltas # 正确:向量化计算,快速高效 data['delta'] = op.greeks.delta(data['underlying_price'], data['strike'], data['T'], r, data['iv'], data['option_type'])

5.2 自定义分析函数与管道集成

optopsy的管道设计允许你轻松插入自定义函数。例如,你想计算每个合约的“波动率偏斜”(某个到期日下,不同行权价的IV曲线斜率)。

def calculate_vol_slope(group): """ 对同一个quote_date和expiration的合约组,计算行权价对IV的线性回归斜率作为偏斜度。 group: 一个DataFrame,包含相同到期日的数据。 """ if len(group) < 3: # 至少需要3个点来算斜率 return np.nan # 使用行权价的对数和隐含波动率进行线性拟合 log_strikes = np.log(group['strike']) ivs = group['iv'].values # 简单线性回归,斜率即为偏斜 slope, _ = np.polyfit(log_strikes, ivs, 1) return slope # 应用函数,按日期和到期日分组 data['vol_slope'] = data.groupby(['quote_date', 'expiration']).apply(calculate_vol_slope).reset_index(level=[0,1], drop=True)

然后,你就可以在策略生成函数里使用vol_slope这个新因子了,比如只在波动率偏斜度较陡时入场。

5.3 处理大数据集的内存与速度考量

当处理数年甚至更长时间、多个标的的期权数据时,数据量可能达到数GB。这时需要一些技巧:

  1. 按需加载:不要一次性将整个CSV读入内存。可以使用pandas.read_csvchunksize参数分块读取和处理,或者使用dask.dataframe
  2. 过滤早期:在数据管道的最前端,就根据回测的时间范围、标的物进行过滤,丢弃无关数据。
  3. 使用高效的数据类型:在读取数据后,使用df = df.astype({‘column‘: ‘float32‘})等方式将数值列转换为占用内存更小的类型(如float32代替float64)。
  4. 利用数据库:对于超大规模研究,可以考虑将历史数据存入SQLite或DuckDB等轻量级数据库,使用SQL进行初步的粗粒度筛选,再将结果导入pandas进行精细分析。

6. 常见陷阱、问题排查与实战心得

6.1 数据质量问题与清洗

问题1:买卖价差异常宽或为负值期权流动性差时,买卖价差(Spread)会很大,甚至出现买价高于卖价的错误数据。

  • 排查:计算data[‘ask‘] - data[‘bid‘],检查是否有负值或异常大的值(如超过合约价格50%)。
  • 处理:可以设置一个过滤条件,剔除价差过大的合约,因为它们流动性差,成交价格不可靠。
    data[‘spread‘] = data[‘ask‘] - data[‘bid‘] data[‘spread_ratio‘] = data[‘spread‘] / data[‘mid_price‘] clean_data = data[data[‘spread_ratio‘] < 0.5] # 过滤掉价差率超过50%的异常数据

问题2:隐含波动率计算失败或为极端值BS模型在输入参数极端(如价格深度虚值、期限极短)时,求解IV可能失败或得到不合理的值(如>200%或<0%)。

  • 排查:计算IV后,立即检查其范围data[‘iv‘].describe()
  • 处理:通常需要设定一个合理的IV范围(如1%到200%)进行截断或剔除。
    data[‘iv‘] = data[‘iv‘].clip(lower=0.01, upper=2.00) # 将IV限制在1%到200%之间 # 或者直接剔除 # clean_data = data[(data[‘iv‘] > 0.01) & (data[‘iv‘] < 2.00)]

6.2 回测中的现实偏差

偏差1:未考虑交易成本期权交易佣金和买卖价差是主要成本。在回测中忽略它们会严重高估收益。

  • 解决方案:在回测引擎中,为每一笔交易扣除一个固定费用(如每手合约$0.7)和/或按成交金额比例扣除的费用。同时,在开仓和平仓时,使用ask价作为买入成本,bid价作为卖出收入,来模拟价差损失。optopsy的回测配置中通常有commissionslippage参数,务必合理设置。

偏差2:假设流动性无限回测假设你总能以报价瞬间成交任意数量。现实中,大额订单可能无法立即全部成交,或会冲击市场价格。

  • 解决方案:进行“容量测试”。逐渐增大策略的资金规模,观察夏普比率、最大回撤等指标是否显著恶化。这有助于你了解策略的实盘容量上限。

偏差3:股息与拆股个股期权会受股息和拆股影响。股息会降低标的价格,影响期权定价(特别是看跌期权)。拆股会导致行权价和合约数量变化。

  • 解决方案:确保你的数据源已经对价格和行权价进行了调整(即复权价格)。如果使用原始数据,必须在回测逻辑中手动处理除息日和拆股日,这非常复杂。因此,强烈建议直接使用已调整的数据。

6.3 策略逻辑漏洞

漏洞:未来函数这是回测中最致命的错误之一,即使用了在交易发生时还无法获得的信息。

  • 示例:在t日计算信号时,使用了t日的收盘价。但实际上,在t日开盘时,你只知道t-1日的收盘价。
  • 检查与修正:严格确保所有用于生成信号的数据都是“点时间”之前的。通常需要将价格数据滞后一期。在optopsy中,这意味着在按日期循环回测时,quote_datet日的数据,只能用于在t+1日开盘时做出决策。

6.4 性能分析与优化检查表

在策略初步回测通过后,不要只看总收益。请系统性地检查以下清单:

检查项目的可接受标准参考
年化收益率策略盈利能力> 无风险利率(如>3%)
年化波动率策略风险水平越低越好,需结合收益看
夏普比率风险调整后收益> 1 可接受,> 1.5 较好
最大回撤历史最大亏损幅度绝对值越小越好,<20% 较稳健
胜率盈利交易比例> 50%
盈亏比平均盈利/平均亏损> 1.2
交易次数策略活跃度足够多以产生统计意义,但不过度交易
月度收益分布检查收益稳定性避免有极端亏损月份
滚动夏普/回撤检查策略稳定性曲线应相对平稳,无持续恶化趋势

使用empyricalpyfolio等库可以方便地计算这些指标。将你的策略与简单基准(如买入持有标的资产)进行比较,是验证策略是否真的增加了价值的关键一步。

7. 从回测到模拟:下一步该怎么走

当你用optopsy完成了一个令人兴奋的回测后,真正的挑战才刚刚开始。回测是策略研究的起点,而非终点。

第一步:样本外测试与参数稳健性分析将你的历史数据分成两段:前70%用于策略开发和参数优化(训练集),后30%用于测试(测试集)。绝对不要用测试集的数据做任何参数调整。观察策略在测试集上的表现是否与训练集存在显著差异。如果表现急剧下滑,很可能存在过度优化。

进行参数敏感性分析。轻微改变你的策略参数(如DTE范围、行权价偏移量),观察绩效指标的变化是否平滑。如果绩效对某个参数极其敏感,那么这个策略在实盘中很可能失效。

第二步:搭建模拟交易系统optopsy本身专注于历史回测,不提供实时交易接口。要迈向实盘,你需要:

  1. 实时数据接入:通过券商API(如Interactive Brokers, TD Ameritrade)或付费数据服务(如IQFeed, Polygon)获取实时或延迟的期权链数据。
  2. 信号生成模块:将你在optopsy中验证的策略逻辑移植到一个独立的脚本中,该脚本能接收实时数据,并定期(如每分钟)计算信号。
  3. 订单执行模块:通过券商API将信号转化为实际的订单。这部分需要处理订单类型、数量、错误重试、仓位管理等复杂逻辑。
  4. 风控与监控模块:实时监控投资组合的希腊字母风险暴露、保证金占用、最大亏损等,设置自动平仓或警报规则。

第三步:从小资金实盘开始无论回测多么完美,实盘永远是最终的检验场。建议用最小交易单位(如1手合约)和极小的资金开始实盘交易,运行至少3-6个月,完整经历不同的市场环境(波动率高低、趋势市、震荡市)。详细记录每一笔交易的实际成交价、滑点、与回测的差异。这个过程的目的不是赚钱,而是验证你的整个交易流程在现实世界中是否如预期般运行,并积累不可替代的实盘手感。

optopsy为你提供了强大、免费的研究工具,让你能以前所未有的效率验证想法。但它是一把锋利的剑,需要使用者对期权理论、市场微观结构和编程都有扎实的理解。避免陷入无止境的参数优化和曲线拟合,多从市场逻辑和风险管理的角度思考策略的合理性。记住,所有模型都是错的,但有些是有用的。祝你研究顺利。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 18:11:33

TranslucentTB启动失败:终极解决方案与完整修复指南

TranslucentTB启动失败&#xff1a;终极解决方案与完整修复指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB TranslucentTB是一款广受…

作者头像 李华
网站建设 2026/5/1 18:11:30

别再只装PaddlePaddle了!用Anaconda为PaddleOCR/PaddleDetection创建专属GPU环境(Python 3.10 + CUDA 11.3)

为PaddleOCR/PaddleDetection打造专属GPU环境的工程化实践 在AI项目开发中&#xff0c;环境配置往往是最容易被忽视却至关重要的一环。许多开发者习惯在基础环境中直接安装各种框架和依赖&#xff0c;直到项目复杂度上升时才发现环境冲突、版本混乱等问题已经难以追溯。本文将…

作者头像 李华
网站建设 2026/5/1 18:09:24

甲言(Jiayan)开源工具:古汉语NLP处理的完整解决方案指南

甲言&#xff08;Jiayan&#xff09;开源工具&#xff1a;古汉语NLP处理的完整解决方案指南 【免费下载链接】Jiayan 甲言&#xff0c;专注于古代汉语(古汉语/古文/文言文/文言)处理的NLP工具包&#xff0c;支持文言词库构建、分词、词性标注、断句和标点。Jiayan, the 1st NLP…

作者头像 李华
网站建设 2026/5/1 18:06:27

python papermill

# Python Papermill&#xff1a;一个让Jupyter Notebook真正工程化的工具 它到底是什么&#xff1f; 先说说我为什么开始用Papermill。几年前&#xff0c;我接手了一个用Jupyter Notebook做数据分析的项目。Notebook跑起来很方便&#xff0c;但一旦要跑多个数据集、换参数、做定…

作者头像 李华