功能说明本文实现的代码主要用于分析指数期权市场中未平仓量Open Interest的市场信号。通过获取期权交易数据计算不同行权价和到期日的未平仓量并结合标的资产价格、隐含波动率等指标识别市场中的潜在趋势和反转信号。该功能可以帮助量化交易者理解市场参与者的情绪变化为构建基于未平仓量的交易策略提供数据支持。需要注意的是未平仓量数据可能存在延迟或误差过度依赖单一指标可能导致错误的交易决策。风险提示数据质量风险期权交易数据可能因交易所记录错误、数据传输延迟等问题导致准确性下降影响分析结果。模型局限性风险未平仓量作为市场情绪指标其有效性受市场环境、政策变化等多种因素影响单一指标无法全面反映市场动态。交易执行风险基于未平仓量信号生成的交易策略在实际执行过程中可能因市场流动性不足、滑点过大等问题导致预期收益无法实现。importpandasaspdimportnumpyasnpfromdatetimeimportdatetime,timedeltaimportyfinanceasyfimportrequestsimportjson# 模拟获取期权数据的函数实际应用中需替换为真实数据源defget_option_data(symbol,expiry_date): 获取指定标的和到期日的期权数据 :param symbol: 标的证券代码如SPX :param expiry_date: 到期日格式YYYY-MM-DD :return: DataFrame包含期权合约信息 # 这里使用yfinance获取标的价格实际期权数据需要从专业数据商获取underlyingyf.Ticker(symbol)spot_priceunderlying.history(period1d)[Close].iloc[-1]# 模拟生成期权数据实际应调用API获取真实数据strikesnp.linspace(spot_price*0.8,spot_price*1.2,20)data[]forstrikeinstrikes:call_data{strike:strike,type:call,expiry:expiry_date,volume:np.random.randint(50,500),open_interest:np.random.randint(100,2000),implied_volatility:np.random.uniform(0.1,0.4)}put_data{strike:strike,type:put,expiry:expiry_date,volume:np.random.randint(30,400),open_interest:np.random.randint(80,1800),implied_volatility:np.random.uniform(0.1,0.4)}data.append(call_data)data.append(put_data)dfpd.DataFrame(data)df[expiry]pd.to_datetime(df[expiry])returndf,spot_price# 计算未平仓量分布特征defanalyze_open_interest_distribution(option_df,spot_price): 分析未平仓量在不同行权价的分布特征 :param option_df: 期权数据DataFrame :param spot_price: 标的当前价格 :return: 包含关键统计信息的字典 # 按行权价分组计算Call和Put的未平仓量总和groupedoption_df.groupby(strike).agg({open_interest:sum}).reset_index()# 合并Call和Put的未平仓量callsoption_df[option_df[type]call].groupby(strike).agg({open_interest:sum}).rename(columns{open_interest:call_oi}).reset_index()putsoption_df[option_df[type]put].groupby(strike).agg({open_interest:sum}).rename(columns{open_interest:put_oi}).reset_index()mergedpd.merge(calls,puts,onstrike,howouter).fillna(0)merged[total_oi]merged[call_oi]merged[put_oi]# 找到最大未平仓量对应的行权价最大持仓行权价max_oi_rowmerged.loc[merged[total_oi].idxmax()]max_oi_strikemax_oi_row[strike]max_oi_callmerged[merged[strike]max_oi_strike][call_oi].values[0]ifnotmerged[merged[strike]max_oi_strike].emptyelse0max_oi_putmerged[merged[strike]max_oi_strike][put_oi].values[0]ifnotmerged[merged[strike]max_oi_strike].emptyelse0# 计算Call/Put未平仓量比率merged[cp_ratio]merged[call_oi]/(merged[put_oi]1e-6)# 避免除以零avg_cp_ratiomerged[cp_ratio].mean()# 确定关键支撑/阻力位support_levelmerged[merged[put_oi]merged[put_oi].quantile(0.9)][strike].min()ifnotmerged[merged[put_oi]merged[put_oi].quantile(0.9)].emptyelseNoneresistance_levelmerged[merged[call_oi]merged[call_oi].quantile(0.9)][strike].max()ifnotmerged[merged[call_oi]merged[call_oi].quantile(0.9)].emptyelseNone# 计算未平仓量加权平均行权价weighted_avg_strikenp.average(merged[strike],weightsmerged[total_oi])return{max_oi_strike:max_oi_strike,max_oi_call:max_oi_call,max_oi_put:max_oi_put,avg_cp_ratio:avg_cp_ratio,support_level:support_level,resistance_level:resistance_level,weighted_avg_strike:weighted_avg_strike,spot_price:spot_price,oi_distribution:merged[[strike,call_oi,put_oi,total_oi]]}# 检测未平仓量异常变化defdetect_oi_anomalies(option_df,lookback_days5): 检测未平仓量的异常变化 :param option_df: 包含历史未平仓量数据的DataFrame :param lookback_days: 回溯天数用于计算均值和标准差 :return: 包含异常点的DataFrame # 假设option_df包含日期列date且已按日期排序option_df[date]pd.to_datetime(option_df[date])option_dfoption_df.sort_values(date)# 计算每个行权价的历史未平仓量均值和标准差oi_statsoption_df.groupby(strike).rolling(lookback_days).agg(mean_oi(open_interest,mean),std_oi(open_interest,std)).reset_index()# 计算Z-scoreoption_dfpd.merge(option_df,oi_stats,on[strike,date],howleft)option_df[z_score](option_df[open_interest]-option_df[mean_oi])/(option_df[std_oi]1e-6)# 筛选Z-score绝对值大于2的异常点anomaliesoption_df[np.abs(option_df[z_score])2]returnanomalies[[date,strike,type,open_interest,z_score]]# 示例使用if__name____main__:# 设置参数symbolSPX# 标普500指数expiry_date(datetime.now()timedelta(days30)).strftime(%Y-%m-%d)# 获取期权数据option_df,spot_priceget_option_data(symbol,expiry_date)print(f标的当前价格:{spot_price:.2f})# 分析未平仓量分布oi_analysisanalyze_open_interest_distribution(option_df,spot_price)print(\n未平仓量分布分析结果:)print(f最大未平仓量行权价:{oi_analysis[max_oi_strike]:.2f})print(f最大Call未平仓量:{oi_analysis[max_oi_call]:.0f})print(f最大Put未平仓量:{oi_analysis[max_oi_put]:.0f})print(f平均Call/Put比率:{oi_analysis[avg_cp_ratio]:.2f})print(f潜在支撑位:{oi_analysis[support_level]})print(f潜在阻力位:{oi_analysis[resistance_level]})print(f未平仓量加权平均行权价:{oi_analysis[weighted_avg_strike]:.2f})# 显示部分未平仓量分布数据print(\n未平仓量分布表:)print(oi_analysis[oi_distribution].head())# 检测未平仓量异常需要历史数据此处仅作示例# 假设有历史数据存储在historical_options.csv中# historical_df pd.read_csv(historical_options.csv)# anomalies detect_oi_anomalies(historical_df)# print(\n未平仓量异常点:)# print(anomalies.head())