ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

编程视角拆解PCP期权平价:从公式推导到Python验证

编程视角拆解PCP期权平价:从公式推导到Python验证 1. 从零拆解PCP平价编程视角下的期权定价核心逻辑1.1 为什么一个写代码的人要关心“平价关系”我最早接触期权的时候满脑子都是“波动率”“希腊字母”“隐含分布”这些听起来很唬人的词结果第一次看到PCPPut-Call Parity看涨看跌期权平价关系的公式时第一反应是这不就是个恒等式吗有什么好讲的。后来真金白银踩过坑才明白这个看似简单的等式其实是整个期权定价体系的“地基”——它不依赖任何复杂的随机过程假设纯粹由无套利原理推导出来是连接看涨期权、看跌期权、标的资产和债券四条腿的桥梁。对于有编程背景但金融零基础的朋友来说PCP平价是一个绝佳的切入点。为什么因为它足够简单一个等式就能说清楚又足够深刻能让你理解期权市场最底层的定价逻辑。更重要的是它可以直接用代码验证——你不需要成为金融科班出身只要会写几行Python拉一组期权链数据就能亲手验证这个关系是否成立甚至从中发现套利机会。这篇文章我会从编程小白的视角出发把PCP平价拆解成可理解、可计算、可验证的模块。你会看到这个等式到底在说什么、它的数学推导为什么成立、用代码怎么验证、实际市场中为什么会有偏差、以及一个程序员做期权分析时最容易踩的坑。全程不堆砌金融术语能用生活例子说清楚的绝不用公式吓人。1.2 PCP平价到底在讲什么一个“复制”的故事先抛开公式用最直白的话说PCP平价讲的是——买一张看涨期权加上卖一张看跌期权和直接买一份标的资产加上借钱这两件事的到期收益是一模一样的。你可以这样理解假设你看好某只股票有两种方式表达这个观点。第一种你买入看涨期权有权以行权价K买入同时卖出看跌期权有义务以行权价K买入。第二种你直接买入股票同时借一笔钱到期要还K。到期时无论股价怎么变这两种组合的盈亏完全一致。既然到期收益一样那它们现在的成本也必须一样否则就存在无风险套利——这就是PCP平价的核心逻辑。用公式表达就是C - P S - K × e^(-rT)其中C是看涨期权价格P是看跌期权价格S是标的资产现价K是行权价r是无风险利率T是到期时间。左边是“看涨减看跌”右边是“股票减债券”。这个等式就是PCP平价。对于程序员来说这个公式最友好的地方在于它没有随机微分方程没有伊藤引理没有偏微分方程。它就是一个代数关系你甚至可以用Excel拉个表验证。但它的威力在于一旦这个等式不成立你就可以构造一个无风险套利组合——买入便宜的一边卖出贵的一边到期稳赚差价。这就是为什么做市商和量化交易员会死死盯着这个关系。1.3 为什么用编程来学PCP从“看懂”到“算明白”传统金融教材讲PCP通常是画个收益图推导一下公式然后给个例题。但作为程序员你学东西的方式不一样——你习惯的是“跑一遍代码看看结果”。PCP平价恰好是一个非常适合用代码验证的概念因为它涉及的数据期权价格、行权价、利率、到期时间都可以从公开数据源获取计算逻辑也不复杂。用编程学PCP有三个好处。第一强制你理解每个参数的含义。写代码的时候你不能含糊S是哪个价格、r怎么取、T怎么算都必须明确。第二可以批量验证。你可以拉一整条期权链的数据对每个行权价都算一遍PCP偏差看看哪些偏离最大。第三能直观感受市场摩擦。理论上PCP应该完美成立但实际数据一跑你会发现总有偏差这些偏差背后就是交易成本、流动性、资金成本等因素在起作用。我自己的学习路径就是先手推一遍公式然后用Python写一个验证脚本拉一组模拟数据跑通再换成真实期权链数据观察偏差。这个过程比单纯看书快得多而且理解更深。接下来我会把这个路径完整拆解出来你可以直接跟着操作。2. 核心细节解析PCP公式的每个零件都不能含糊2.1 四个变量C、P、S、K到底怎么取PCP公式里只有四个价格变量和一个利率时间项但每一个都有讲究。先说C和P这是看涨和看跌期权的市场价格。这里有个关键点必须用同一到期日、同一行权价的看涨和看跌期权。你不能拿行权价100的看涨和行权价105的看跌来算那就不是PCP了。在实际数据中同一行权价的看涨和看跌期权通常都有报价但流动性可能不同——有的行权价看涨活跃、看跌冷清这时候报价的买卖价差就会影响PCP的计算结果。S是标的资产现价。对于股票期权S就是股票当前的市场价格。但这里有个细节如果你用的是盘中数据S在变期权价格也在变你必须保证取的是同一时刻的报价。很多新手会犯的错误是用昨天的收盘价S去配今天的期权价格那算出来的偏差完全没有意义。对于指数期权S是指数点位但指数本身不可直接交易所以实际套利时需要用ETF或期货来复制这就引入了基差问题。K是行权价这个最明确合约里写死的。但要注意有些期权是美式行权可以提前行权有些是欧式行权只能到期行权。PCP平价严格来说只对欧式期权成立因为美式期权的提前行权权利会破坏复制关系。不过在实际中对于不支付股息的股票美式看涨期权通常不会提前行权所以PCP近似成立但美式看跌期权有可能提前行权这时候PCP会有偏差。r是无风险利率T是到期时间以年为单位。这两个参数虽然不直接出现在市场价格里但它们的取值直接影响K×e^(-rT)这一项。r通常取同期限的国债收益率或银行间拆借利率T则是剩余天数除以365。这里有个实操细节如果剩余天数很少比如只剩3天r的微小变化对结果影响不大但如果剩余时间很长比如两年期LEAPS期权r的取值就会显著影响PCP的计算。2.2 公式推导为什么“复制”能成立PCP的推导不需要任何概率假设纯粹是现金流复制。我试着用最直白的方式讲一遍。考虑两个组合。组合A买入一份看涨期权行权价K到期日T卖出一份看跌期权同行权价、同到期日。组合B买入一份标的资产同时借入K×e^(-rT)的现金到期连本带息还K。到期时股价有两种情况。如果股价高于K组合A中看涨期权行权你以K买入股票看跌期权作废最终你持有股票价值等于股价。组合B中你本来就持有股票借款到期还K最终也持有股票价值等于股价。如果股价低于K组合A中看涨期权作废看跌期权被行权你以K买入股票最终持有股票价值等于股价。组合B同样持有股票价值等于股价。所以无论股价怎么变两个组合到期都持有一份股票价值相同。既然到期价值相同那当前构建成本也必须相同否则就存在套利。组合A的当前成本是C - P组合B的当前成本是S - K×e^(-rT)。于是C - P S - K×e^(-rT)这就是PCP平价。这个推导的关键在于“无套利假设”——如果两个组合到期价值一样但当前价格不同你就可以买入便宜的组合、卖出贵的组合到期无风险赚差价。在有效市场中这种机会会被迅速抹平所以等式成立。2.3 利率和时间的处理连续复利还是单利在PCP公式中K×e^(-rT)这一项用的是连续复利折现。为什么用连续复利因为期权定价理论Black-Scholes模型建立在连续时间框架下连续复利与对数正态分布假设一致。但在实际计算中如果你只是做近似验证用单利折现K/(1rT)也差不太多尤其是当r和T都比较小的时候。我实测过当r3%、T0.25年时连续复利折现因子e^(-0.03×0.25)≈0.99253单利折现因子1/(10.03×0.25)≈0.99256差异在小数点后第五位对期权价格的影响通常小于最小报价单位。但如果T很长比如两年差异就会放大到千分之一级别对于大额套利来说就不能忽略了。对于编程实现我建议直接用连续复利因为这是行业标准而且Python的math.exp()或numpy.exp()调用起来很方便。r的取值可以用同期限国债收益率如果找不到精确匹配的用货币市场利率近似也行。T的计算要注意如果到期日是周五而今天是周一剩余日历天数是4天但实际交易日是3天周二到周四有些交易员会用交易日/252来算T有些用日历日/365。两种算法在短期期权上差异不大但长期期权会有明显区别。我个人的习惯是短期用日历日/365长期用日历日/365保持一致性。3. 实操过程用Python亲手验证PCP平价3.1 环境准备与数据获取思路要验证PCP你需要一组期权链数据。数据来源可以有很多选择比如从某些公开数据接口获取或者用券商提供的API。这里我不具体推荐某个数据源因为不同地区的可用性不同你可以根据自己的情况选择。核心要求是你需要同一到期日、同一行权价的看涨和看跌期权报价以及标的资产现价、无风险利率和到期时间。如果你暂时拿不到真实数据也可以用模拟数据先跑通逻辑。模拟数据的构造方法是先设定S、K、r、T和波动率用Black-Scholes公式算出理论看涨和看跌价格然后验证PCP是否成立。这样你可以先熟悉计算流程等有真实数据了再替换。Python环境方面你需要numpy做数值计算pandas做数据处理scipy做统计和优化可选matplotlib做可视化可选。如果你用Jupyter Notebook会更方便逐步调试。安装命令很简单pip install numpy pandas scipy matplotlib我建议在虚拟环境里装避免污染全局环境。如果你用conda也可以conda create一个独立环境。3.2 用模拟数据跑通PCP验证先构造一组模拟数据。假设标的现价S100行权价K100无风险利率r3%到期时间T0.5年6个月波动率σ20%。用Black-Scholes公式算看涨和看跌价格import numpy as np from scipy.stats import norm def black_scholes(S, K, r, T, sigma, option_typecall): 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 S 100 K 100 r 0.03 T 0.5 sigma 0.2 call_price black_scholes(S, K, r, T, sigma, call) put_price black_scholes(S, K, r, T, sigma, put) print(f看涨期权价格: {call_price:.4f}) print(f看跌期权价格: {put_price:.4f}) # 验证PCP left call_price - put_price right S - K * np.exp(-r*T) print(fC - P {left:.4f}) print(fS - K*e^(-rT) {right:.4f}) print(f偏差: {left - right:.6f})跑出来偏差应该是0或极小的浮点误差因为Black-Scholes公式本身就满足PCP。这个练习的目的是让你熟悉计算流程确认代码逻辑正确。3.3 用真实期权链数据观察偏差拿到真实数据后你需要做几件事。第一筛选出同一到期日的所有行权价。第二对每个行权价找到对应的看涨和看跌期权报价。第三用中间价买价和卖价的平均来计算而不是用最新成交价因为最新成交价可能过时。第四计算每个行权价的PCP偏差并画图观察。偏差的计算方式是偏差 (C - P) - (S - K×e^(-rT))。如果偏差为正说明看涨相对看跌被高估或看跌被低估可以考虑卖出看涨、买入看跌、买入股票、借入资金如果偏差为负则反向操作。实际数据中你会发现偏差通常集中在几个区域。平值附近行权价接近S的偏差最小因为流动性最好。深度实值和深度虚值的偏差较大因为买卖价差宽、流动性差。到期日近的偏差小到期日远的偏差大因为资金成本和时间价值的不确定性更大。我跑过一组数据平值附近的偏差通常在0.1%到0.3%之间深度虚值可能到1%以上。这些偏差看起来不大但如果你考虑交易成本佣金、买卖价差、冲击成本很多偏差其实不足以覆盖成本。这就是为什么PCP套利听起来简单实际做起来需要精细的成本控制。3.4 参数计算r和T的取值实操r的取值我通常用同期限的国债收益率。如果期权到期日是3个月后我就找3个月期国债收益率。如果找不到精确匹配的用线性插值。有些数据源会直接提供无风险利率曲线那就更方便。如果没有可以用银行间拆借利率近似但要注意信用利差。T的计算我用日历日除以365。比如今天到到期日还有90天T90/365≈0.2466。有些交易员用交易日除以252对于短期期权差异不大但长期期权会有区别。我建议保持一致不要混用。还有一个细节如果标的资产在期权存续期内支付股息PCP公式需要调整。调整后的公式是C - P S - PV(D) - K×e^(-rT)其中PV(D)是股息的现值。对于不支付股息的股票这一项为零。对于支付股息的股票你需要预测股息金额和支付时间这又引入了不确定性。我刚开始做的时候忽略了股息结果算出来的偏差很大后来才发现是股息在作怪。4. 常见问题与排查技巧实录4.1 偏差太大先检查这五个地方当你发现某个行权价的PCP偏差异常大时不要急着兴奋先按顺序检查以下五点。第一数据是否同步。S、C、P是不是同一时刻的报价如果S是收盘价C和P是盘中价那偏差可能只是时间差造成的。第二是否同一到期日、同一行权价。有时候数据源会混淆不同到期日的合约或者行权价有调整比如股票拆股后行权价会变。第三是否用了中间价。如果用买价算一边、卖价算另一边偏差会被买卖价差放大。第四利率和股息是否处理正确。r取错了或者忘了股息偏差会系统性偏移。第五期权是美式还是欧式。美式期权的提前行权权利会破坏PCP尤其是深度实值的看跌期权。我踩过的一个坑是用某数据源的“最新价”算PCP结果发现很多期权的“最新价”是几天前的成交价完全不能反映当前市场。后来改用买卖中间价偏差就正常了。4.2 套利看起来很美为什么实际做不了理论上PCP偏差就是套利机会。但实际中你面临几个障碍。第一交易成本。期权有佣金股票有佣金和印花税买卖价差也是成本。第二资金成本。套利需要借入资金或占用保证金实际借款利率可能高于无风险利率。第三流动性限制。偏差大的合约往往流动性差你未必能以看到的价格成交。第四行权与交割。美式期权提前行权、股票借入困难、交割规则复杂都会增加操作难度。我个人的经验是对于散户来说PCP套利基本不可行因为成本太高。但PCP平价仍然极其有用因为它能帮你判断期权价格是否合理。比如你想买看涨期权可以先算一下对应的看跌期权价格如果看涨明显贵了你可以考虑用看跌加股票来合成看涨可能更便宜。4.3 常见问题速查表问题现象可能原因排查方法偏差系统性为正看涨被高估或看跌被低估检查是否漏算股息偏差系统性为负看跌被高估或看涨被低估检查利率取值是否过高平值附近偏差小深度虚值偏差大流动性差异用买卖价差过滤近月偏差小远月偏差大资金成本不确定性用更精确的利率曲线某些行权价偏差异常大数据错误或合约调整核对合约规格美式期权偏差明显提前行权权利改用欧式期权验证4.4 一个实用技巧用PCP反推隐含利率PCP不仅可以验证价格还可以反推市场隐含的无风险利率。把公式变形K×e^(-rT) S - C P然后解出r。如果你对一组期权链都做这个计算会得到一系列隐含利率这些利率的分布可以反映市场的资金成本预期。我试过用这个方法观察市场情绪当隐含利率突然飙升时往往意味着市场流动性紧张或者有特殊事件。这个技巧的好处是你不需要额外数据源只用期权价格就能推断出市场对利率的看法。当然前提是期权流动性足够好否则噪声会很大。5. 从PCP延伸编程视角下的期权分析框架5.1 把PCP封装成可复用的函数一旦你理解了PCP就可以把它封装成一个函数方便后续调用。我通常会写一个check_pcp函数输入S、K、r、T、C、P输出偏差和套利方向。再写一个implied_rate函数输入S、K、T、C、P输出隐含利率。这样你在做其他期权分析时可以随时调用。代码结构大概是def check_pcp(S, K, r, T, C, P): left C - P right S - K * np.exp(-r * T) deviation left - right if deviation 0: direction 卖出看涨买入看跌买入股票借入资金 elif deviation 0: direction 买入看涨卖出看跌卖空股票借出资金 else: direction 无套利机会 return deviation, direction def implied_rate(S, K, T, C, P): # 从 C - P S - K*e^(-rT) 解出 r # e^(-rT) (S - C P) / K # -rT ln((S - C P) / K) # r -ln((S - C P) / K) / T ratio (S - C P) / K if ratio 0: return None return -np.log(ratio) / T这两个函数虽然简单但非常实用。你可以把它们加入自己的期权分析工具箱。5.2 从PCP到Black-Scholes自然的下一步PCP是期权定价的“骨架”Black-Scholes模型则是给这个骨架填上“血肉”。Black-Scholes公式给出的看涨和看跌价格天然满足PCP所以你可以把PCP理解为Black-Scholes模型的一个约束条件。当你理解了PCP再学Black-Scholes会容易很多因为你知道模型必须满足这个无套利关系。从编程角度你可以用PCP来验证自己实现的Black-Scholes公式是否正确。如果你算出来的看涨和看跌价格不满足PCP那一定是代码有bug。这是一个非常有效的单元测试。5.3 给编程金融小白的三个学习建议第一先跑通再优化。不要一开始就追求完美的数据源和精确的利率曲线先用模拟数据把逻辑跑通再逐步替换成真实数据。第二可视化很重要。把PCP偏差画成图横轴是行权价纵轴是偏差你会直观看到偏差的分布规律。第三记录每次实验。我习惯用Jupyter Notebook记录每次数据拉取、计算和观察结果方便回溯和对比。我刚开始学的时候花了很多时间纠结于“正确的”无风险利率应该是多少后来发现对于学习PCP来说用任何合理的利率都能看到偏差关键是理解偏差的来源。等你真正要做交易决策时再精细化利率取值也不迟。5.4 一个容易忽略的细节期权报价的买卖价差在实际数据中期权的买价和卖价之间通常有价差。如果你用买价算PCP再用卖价算另一边偏差会被价差放大。正确的做法是用中间价即买价卖价/2。但中间价也有问题它可能不是可成交价。如果你真的要做套利你需要用买价买入、卖价卖出这时候价差就是你的成本。我通常的做法是先用中间价算一遍看看偏差分布再用买价和卖价分别算一遍看看偏差范围。如果偏差在买卖价差范围内那就不算真正的套利机会。这个细节在书本上很少强调但实际操作中非常关键。6. 个人实操体会与后续扩展方向6.1 我踩过的三个坑第一个坑是忽略股息。有一次我算一组银行股的PCP发现偏差特别大还以为是市场无效。后来才想起来银行股每季度分红而我的公式里没有股息项。加上股息调整后偏差立刻缩小到正常范围。第二个坑是用错到期时间。我一开始用自然日除以365后来发现有些交易员用交易日除以252两者在短期期权上差异不大但在长期期权上能差出几个百分点。我现在的习惯是统一用自然日除以365保持一致性。第三个坑是数据不同步。我用收盘后的股票价格去配盘中的期权价格算出来的偏差完全没有意义。后来我改成用同一时间戳的数据问题就解决了。6.2 后续可以这样扩展如果你已经跑通了PCP验证可以尝试几个扩展方向。第一加入股息调整看看股息对PCP的影响有多大。第二用不同到期日的期权链观察偏差随到期时间的变化规律。第三构建一个简单的套利回测看看扣除交易成本后是否还有利润。第四把PCP和其他期权关系结合比如看涨看跌平价和盒式价差的关系。我个人觉得最有意思的方向是用PCP反推市场隐含的股息预期。对于支付股息的股票你可以用PCP公式反推出市场隐含的股息现值然后和实际股息公告对比看看市场预期是否合理。这个分析在股息公告前后特别有用。6.3 最后分享一个小技巧如果你在验证PCP时发现某个行权价的偏差特别大先别急着下结论。把该行权价附近的几个行权价都算一遍看看偏差是孤立的还是系统性的。如果只有某一个行权价偏差大很可能是数据错误或流动性问题如果一片行权价都偏差大那可能是利率或股息参数取错了。这个排查思路帮我省了很多时间。另外我建议你养成记录的习惯。每次验证PCP时把数据日期、S、r、T、偏差分布都记下来。过一段时间回头看你会对市场摩擦有更深刻的理解。这个习惯比任何教材都管用。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表