Przeglądaj źródła

恢复了单纯牛差的交易

maxfeng 2 miesięcy temu
rodzic
commit
b84313cbed

+ 3 - 1
.gitignore

@@ -4,4 +4,6 @@ resources/API新 - JoinQuant_files
 resources/API新 - JoinQuant.htm
 resources/part_api.html
 
-*.csv
+*.csv
+
+data/

+ 128 - 46
Lib/Options/README.md

@@ -294,56 +294,138 @@ gamma = φ(d1) / (S * σ * √(τ/365))  # φ为标准正态分布密度函数
 
 ## 1. 卖沽ETF,卖购备兑策略
 
-## 1. 深度实值买购和卖购组合的牛差策略
+## 1. 深度实值买购和卖购组合的牛差策略(升级版)
 
 **文件名**: `deep_itm_bull_spread_strategy.py`
 
-### 核心交易逻辑:
+### 策略概述
+
+该策略是一个专注于牛差组合的期权交易系统:
+1. **牛差组合策略**:深度实值买购期权 + 平值卖购期权
+
+系统通过严格的期权筛选条件,寻找最优的牛差组合机会。
+
+### 核心交易逻辑
+
+#### 1. 策略机制
+- **专注牛差策略**:只执行牛差组合策略,寻找最优的深度实值买购期权
+- **严格筛选**:通过严格的期权筛选条件确保策略质量
+
+#### 2. 开仓选择标准
+
+**卖购期权选择**:
+- 筛选虚值期权(行权价 > ETF价格)
+- 选择最接近ETF价格的虚值期权(行权价最小的虚值期权)
+- 当月期权权利金要求:下月阈值×0.6(沪深300ETF≥0.018,上证50ETF≥0.03,创业板ETF≥0.018)
+- 下月期权权利金要求:沪深300ETF≥0.03,上证50ETF≥0.05,创业板ETF≥0.03
+- 下月期权指到期日在下个自然月的所有期权
+- 最少距离到期日15天(交易日)
+- 如果当月无虚值期权,则尝试下月期权
+
+**深度实值买购期权选择**:
+- 行权价必须低于当前ETF价格(实值期权)
+- 时间价值必须小于0.015
+- 选择行权价最接近ETF价格的期权
+- 必须与卖购期权到期月份一致
+
+#### 3. 开仓机制
+
+**牛差策略开仓条件**:
+- 存在符合条件的深度实值买购期权
+- 存在符合条件的平值卖购期权
+- 两个期权必须到期日一致
+
+#### 4. 盈利计算
+
+**牛差组合策略**:
+- 单张最大盈利 = (卖购行权价 - 买购行权价 - 买购权利金 + 卖购权利金) × 10000
+- 最小盈利 = 卖购权利金 × 10000
+
+#### 5. 平仓条件
+
+**时间平仓**:
+- 距离到期日≤7个交易日时强制平仓
+
+**盈利平仓**:
+- ETF价格≥卖购行权价时,达到最大盈利的83%
+
+**权利金平仓**:
+- ETF价格<卖购行权价时,卖购权利金剩余<0.005
+
+#### 6. 加仓机制
+
+**加仓条件**:
+- ETF价格下跌至加仓触发价位
+- 加仓窗口阈值:沪深300ETF: 0.2,上证50ETF: 0.1,创业板ETF: 0.15
+- 最大加仓次数:2次
+
+#### 7. 资金管理
+
+**动态合约数量计算**:
+- 根据分配资金和保证金要求动态计算合约数量
+- 牛差组合保证金 = 行权价差 × 合约单位 + 30元优惠
+
+**多标的资金分配**:
+- 支持多个ETF标的同时运行
+- 默认资金分配:上证50ETF 50%,沪深300ETF 30%,创业板ETF 20%
+- 总资金使用上限:80%
+
+#### 8. 数据记录与监控
+
+**交易记录**:
+- 完整的开仓/平仓交易记录
+- 牛差策略标识
+- 盈亏分析和归因
+
+**持仓监控**:
+- 每日持仓状况记录
+- 浮动盈亏实时计算
+- 牛差策略持仓统计
+
+**账户汇总**:
+- 多标的账户资金汇总
+- 已实现/未实现盈亏分离
+- 收益率和风险指标计算
+
+### 配置参数
+
+```python
+{
+    'contract_size': 30,  # 默认合约数量(动态调整)
+    'min_premium': {'510300': 0.03, '510050': 0.05, '159915': 0.03},  # 下月期权权利金阈值
+    'min_days_to_expiry': 15,  # 最少开仓距离到期日
+    'call_time_value_threshold': 0.015,  # 深度实值期权时间价值阈值
+    'put_close_premium_threshold': 0.005,  # 卖购平仓权利金阈值
+    'max_days_before_expiry': 7,  # 到期平仓最大天数
+    'min_days_before_expiry': 2,  # 到期平仓最小天数
+    'add_position_threshold': {'510300': 0.2, '510050': 0.1, '159915': 0.15},
+    'max_add_positions': 2,  # 最大加仓次数
+    'max_profit_close_threshold': 0.83,  # 83%最大盈利平仓
+    # 注意:当月期权权利金阈值 = 下月阈值 × 0.6
+}
+```
+
+### 适用场景
+
+1. **牛市震荡行情**:牛差策略获取有限上涨收益
+2. **资金规模化管理**:多标的分散投资
+3. **风险控制要求**:严格的开仓条件和止损机制
+
+### 系统架构
+
+- **DeepITMBullSpreadStrategy**:单标的策略核心类
+- **MultiUnderlyingBullSpreadManager**:多标的管理器
+- **StrategyConfig**:策略配置管理
+- **StrategyType**:策略类型枚举(BULL_SPREAD)
+
+### 功能特点
 
-1. 虽然是深度实值和卖购的组合,但是深度实值的本质是替代持仓ETF。所以在资金收益计算的时候要分成两个账户,一个是深度实值买购相关交易的收益情况,另一个则是卖购的收益情况。
-2. 开仓选择:
-    - 卖购标的选择:
-        - 做卖购的一般是平值,也就是如果标的ETF是2.828,那么2.85和2.828的差是-0.022,2.8和2.828的差则是0.028,这里算绝对值就好。也就是说2.85更接近,那么就选择这个作为卖购的标的
-        - 其次是考虑权利金也就是当前这个期权的价格,先检查当前月的这个标的,如果价格小于0.03那么就看下个月的,下个月则最少是0.05以上的。
-    - 买购标的的选择:
-        - 做买购的一般是深度实值,也就是要找时间价值非常小,需要小于0.01.
-        - 在前面这个条件的基础上,找行权价和标的价格最接近的
-        - 月份和卖购的一致
-        - **重要**:如果没有符合时间价值要求的深度实值期权,则不开仓
-3. 开仓后记录:下面公式是帮助理解,实际记录只需要记录结果
-    - 标的名称 (标的编号):300ETF (510300)
-    - 开仓时标的的价格:4.032
-    - 买购标的及价格:3.7, 0.3327
-    - 卖购标的及价格:4.0, 0.0614
-    - 张数:80
-    - 单张最大盈利:$(4.0-3.7-0.3327+0.0614)*10000=287$
-    - 最小盈利(这里重点记录卖购):$0.0614*10000=614$
-4. 平仓选择:
-    - ETF 大涨,牛差组合接近到期最大盈利:
-        - 全部平仓,向上进行移仓
-        - 平掉当前的卖购和买购组合(买入行权价K1+卖出行权价K2)
-        - 开仓一个更高行权价的卖购和买购牛差组合(买入行权价K3+卖出行权价 K4,其中 K3>K1;K4>K2)
-        - 月份选择:如果距离当前月合约结束还有n天及以上的时间(阈值暂定20)还可以选择当月,这里同时检查行权价是否满足条件;否则就选择下个月
-    - ETF下跌:
-        - 当ETF下跌时,且卖购权利金剩余低于0.005,则平仓当前组合
-        - 重新按照原始标准选择下个月的合约开仓
-    - 合约快到期了:
-        - 合约到期7个交易日内就开始考虑平仓,最晚提前2个交易日
-        - 准备开下个月的新仓
-5. 加仓选择:
-    - 假设当前开仓的是4.0左右的情况,做了一组牛差,等到跌到3.8 (这里窗口阈值设定为0.2)的时候会再开仓一组牛差。
-    - 这里的重点是记录开额外组牛差的ETF标的价格是多少,等到市场重新涨到这个价格之后,这组额外的牛差可以在牛差最大盈利或者卖购盈利基本达成的时候进行平仓,也就是这一组不再会进行开仓。
-6. 设定阈值:
-    - 一组张数:30
-    - 最小权利金:`{'沪深300ETF':0.03, '上证50ETF':0.05, '创业板ETF':0.03}`
-    - 最少开仓日期(距离到期日):20天(交易日)
-    - 买购时间价值阈值:0.01
-    - 卖购平仓权利金阈值:0.005
-    - 合约到期移仓日期最大:7天(交易日)
-    - 合约到期移仓日期最小:2天(交易日)
-    - 加仓窗口阈值:`{'沪深300ETF':0.2, '上证50ETF':0.1, '创业板ETF':0.15}`
-    - 加仓次数上限:2
-    - 接近最大盈利平仓阈值: 95%
+1. **专注牛差策略**:专门针对牛差策略进行优化
+2. **严格筛选标准**:确保只有高质量的期权组合才会开仓
+3. **精确盈亏计算**:准确计算牛差策略的盈亏情况
+4. **完整数据追踪**:详细记录所有交易过程
+5. **风险控制**:多层次的风险控制机制
+6. **资金管理**:动态调整合约数量,优化资金使用效率
 
 
 

+ 16 - 2
Lib/Options/analysis_chart.py

@@ -2,6 +2,8 @@ import pandas as pd
 import numpy as np
 import matplotlib.pyplot as plt
 from statistics import mean
+import os
+from datetime import datetime
 
 def analyze_options(*options):
     """
@@ -10,6 +12,11 @@ def analyze_options(*options):
     参数:
     *options: 一个或多个期权,每个期权格式为 (direction, option_type, premium, strike_price, quantity)
              例如: ('buy', 'call', 0.0456, 2.75, 1)
+    direction: 方向,buy 或 sell
+    option_type: 期权类型,call 或 put
+    premium: 权利金
+    strike_price: 行权价
+    quantity: 数量
 
     示例:
     # 单个期权
@@ -131,7 +138,7 @@ def _plot_results(results, option_list, prices):
         color = colors[i % len(colors)]
 
         plt.plot(prices, results[opt_name], '--', color=color, linewidth=2, alpha=0.7,
-                label=f'{opt_name}: {strategy_name} (strike price:{opt["strike_price"]})')
+                label=f'{opt_name}: {strategy_name}(strike price:{opt["strike_price"]}, premium:{opt["premium"]})')
 
     # 绘制组合曲线
     if 'combined' in results:
@@ -161,6 +168,13 @@ def _plot_results(results, option_list, prices):
     plt.grid(True, alpha=0.3)
     plt.legend()
     plt.tight_layout()
+    
+    # 保存图片到data/Options目录
+    timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
+    filename = f'options_analysis_{timestamp}.png'
+    save_path = os.path.join('data', 'Options', filename)
+    plt.savefig(save_path, dpi=300, bbox_inches='tight')
+    print(f"图片已保存到: {save_path}")
     plt.show()
 
 
@@ -302,4 +316,4 @@ def _print_report(results, option_list, prices):
 
     print("=" * 60)
 
-analyze_options(('sell', 'call', 0.0199, 1.0, 1), ('buy', 'call', 0.0482, 1.05, 1))
+analyze_options(('sell', 'call', 0.066, 3.0, 1), ('buy', 'call', 0.2017, 2.8, 1))

Plik diff jest za duży
+ 404 - 494
Lib/Options/deep_itm_bull_spread_strategy.py


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików