期权行权
概述
期权行权接口提供以下功能:
- 行权检验:预估行权或放弃行权后正股持仓的变化
- 查询可行权持仓:获取可提交行权/放弃行权申请的期权持仓列表
- 提交行权申请:提交提前行权或提前放弃行权申请
- 查询行权记录:分页查询已提交的行权申请历史
- 撤销行权申请:撤销尚未执行的行权申请
该组接口仅支持综合(Prime)账户。
行权类型(OptionExerciseType)
| 枚举值 | 说明 |
|---|---|
Exercise | 提前行权 — 在到期日前提前执行期权 |
Expire | 提前放弃行权 — 在到期日前主动放弃行权 |
行权检验
对应请求类:OptionExerciseCheckRequest
预估行权或放弃行权后,正股持仓的变化情况,可在提交前用于确认结果。
参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| account | string | 是 | 交易账户 |
| contractId | long | 是 | 期权合约 ID |
| type | string | 是 | 行权类型:Exercise / Expire |
| quantity | double | 是 | 行权数量(> 0) |
| executingDate | string | Exercise 必填 | 行权执行日期,格式 yyyy-MM-dd |
| isForce | boolean | Exercise 必填 | 是否强制行权 |
| itmRate | Integer | 否 | 可空;行权检验不在本地设置默认值,也不限制取值范围或行权类型,提供时按原值用于检验 |
| secretKey | string | 否 | 机构账户交易员密钥 |
返回(OptionExerciseCheckItem)
| 字段 | 类型 | 说明 |
|---|---|---|
| availableQuantity | double | 可行权数量 |
| position | double | 当前期权持仓 |
| stkPosition | double | 正股当前持仓 |
| stkPositionChange | double | 行权后正股持仓变化量 |
| stkPositionBefore | double | 行权前正股持仓 |
| stkPositionAfter | double | 行权后正股持仓 |
| symbol | string | 正股代码 |
示例
String account = "YOUR_PRIME_ACCOUNT";
Long contractId = 1684414425L;
// 行权检验(Exercise 类型,quantity/executingDate/isForce 必填)
OptionExerciseCheckRequest request =
OptionExerciseCheckRequest.buildRequest(account, contractId, OptionExerciseType.Exercise)
.setQuantity(1.0)
.setExecutingDate("2025-06-20")
.setIsForce(false);
OptionExerciseCheckResponse response = client.execute(request);
if (response.isSuccess()) {
OptionExerciseCheckItem item = response.getItem();
System.out.println("availableQuantity=" + item.getAvailableQuantity()
+ " stkPositionBefore=" + item.getStkPositionBefore()
+ " stkPositionAfter=" + item.getStkPositionAfter());
} else {
System.out.println("Error: " + response.getMessage());
}
// 行权检验(Expire 类型,quantity 必填,itmRate 可空)
OptionExerciseCheckRequest expireCheck =
OptionExerciseCheckRequest.buildRequest(account, contractId, OptionExerciseType.Expire)
.setQuantity(1.0)
.setItmRate(5);
OptionExerciseCheckResponse expireResp = client.execute(expireCheck);返回示例
{
"availableQuantity": 10.0,
"position": 10.0,
"stkPosition": 300.0,
"stkPositionChange": -100.0,
"stkPositionBefore": 300.0,
"stkPositionAfter": 200.0,
"symbol": "AAPL"
}请求频率
基础限流为 60 次/分钟。
查询可行权持仓
对应请求类:OptionExercisePositionRequest
查询当前账户下可提交行权或放弃行权申请的期权持仓列表。
参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| account | string | 是 | 交易账户 |
| type | string | 是 | 行权类型:Exercise / Expire |
| secretKey | string | 否 | 机构账户交易员密钥 |
返回(OptionExercisePositionPageItem)
分页结果包含:
| 字段 | 类型 | 说明 |
|---|---|---|
| pageNum | Integer | 当前页码,从 1 开始 |
| pageSize | Integer | 每页数量 |
| itemCount | Integer | 总记录数 |
| pageCount | Integer | 总页数 |
| items | List<OptionExercisePositionItem> | 持仓列表 |
OptionExercisePositionItem 字段
| 字段 | 类型 | 说明 |
|---|---|---|
| contractId | long | 期权合约 ID |
| symbol | string | 期权合约代码 |
| stkSymbol | string | 正股代码 |
| expireDate | string | 到期日,格式 yyyy-MM-dd |
| strike | string | 行权价 |
| callPut | string | CALL / PUT |
| market | string | 市场 |
| accountId | long | 账户 ID |
| position | double | 持仓数量 |
| availableQuantity | double | 可行权数量 |
示例
String account = "YOUR_PRIME_ACCOUNT";
OptionExercisePositionRequest request =
OptionExercisePositionRequest.buildRequest(account, OptionExerciseType.Exercise);
OptionExercisePositionResponse response = client.execute(request);
if (response.isSuccess()) {
OptionExercisePositionPageItem page = response.getItem();
System.out.println("itemCount=" + page.getItemCount());
for (OptionExercisePositionItem item : page.getItems()) {
System.out.println("contractId=" + item.getContractId()
+ " symbol=" + item.getSymbol()
+ " expireDate=" + item.getExpireDate()
+ " availableQty=" + item.getAvailableQuantity());
}
} else {
System.out.println("Error: " + response.getMessage());
}返回示例
{
"itemCount": 4,
"pageNum": 1,
"pageSize": 10,
"pageCount": 1,
"items": [
{
"contractId": 1684414425,
"symbol": "AAPL",
"stkSymbol": "AAPL",
"expireDate": "2026-04-17",
"strike": "280.0",
"callPut": "PUT",
"market": "US",
"accountId": 600021133765,
"position": 10.0,
"availableQuantity": 10.0
}
]
}请求频率
基础限流为 60 次/分钟。
提交行权申请
对应请求类:OptionExerciseSubmitRequest
提交提前行权或提前放弃行权申请。
注意
- 提交前建议先调用行权检验接口确认持仓变化
executingDate与isForce仅在 Exercise 类型时有效itmRate仅在 Expire 类型时有效- 提交成功后如需撤销,请使用撤销行权申请接口
参数(Exercise 类型)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| account | string | 是 | 交易账户 |
| contractId | long | 是 | 期权合约 ID |
| quantity | double | 是 | 行权数量 |
| executingDate | string | 是 | 行权执行日期,格式 yyyy-MM-dd |
| isForce | boolean | 是 | 是否强制行权 |
| secretKey | string | 否 | 机构账户交易员密钥 |
参数(Expire 类型)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| account | string | 是 | 交易账户 |
| contractId | long | 是 | 期权合约 ID |
| quantity | double | 是 | 放弃行权数量 |
| itmRate | int | 否 | 价内率阈值,取值范围 0–10;省略时默认为 0。不要显式传 null |
| secretKey | string | 否 | 机构账户交易员密钥 |
示例
String account = "YOUR_PRIME_ACCOUNT";
Long contractId = 1684414425L;
// 提前行权
OptionExerciseSubmitRequest exerciseRequest =
OptionExerciseSubmitRequest.buildExerciseRequest(
account, contractId, 1.0, "2025-06-20", false);
OptionExerciseSubmitResponse exerciseResp = client.execute(exerciseRequest);
System.out.println(exerciseResp.isSuccess() ? "OpenAPI 调用成功" : "OpenAPI 调用失败: " + exerciseResp.getMessage());
// 提前放弃行权
OptionExerciseSubmitRequest expireRequest =
OptionExerciseSubmitRequest.buildExpireRequest(account, contractId, 1.0, 5);
OptionExerciseSubmitResponse expireResp = client.execute(expireRequest);
System.out.println(expireResp.isSuccess() ? "OpenAPI 调用成功" : "OpenAPI 调用失败: " + expireResp.getMessage());isSuccess()、code 和 message 仅表示本次 OpenAPI 调用是否成功,不表示行权申请已完成最终业务处理。提交后请查询行权记录确认申请状态和处理结果。
请求频率
基础限流为 60 次/分钟。
查询行权记录
对应请求类:OptionExerciseRecordRequest
分页查询已提交的行权申请记录。
参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| account | string | 是 | 交易账户 |
| page | Integer | 否 | 页码;传入时必须大于等于 1 |
| size | Integer | 否 | 每页数量;传入时必须为 1–100 |
| status | string | 否 | 行权状态过滤,如 New |
| type | string | 否 | 行权类型过滤:Exercise / Expire |
| symbol | string | 否 | 正股代码过滤 |
| orderBy | string | 否 | 排序字段:symbol / expire_date / strike / is_call |
| secretKey | string | 否 | 机构账户交易员密钥 |
buildRequest(account, page, size) 要求按顺序提供 page 和 size 两个参数位置,但两者都可传 null 以省略。文档不为省略值推断默认页码或每页数量;传入非空值时,page 必须大于等于 1,size 必须为 1–100。
返回(OptionExerciseRecordPageItem)
| 字段 | 类型 | 说明 |
|---|---|---|
| pageNum | Integer | 当前页码,从 1 开始 |
| pageSize | Integer | 每页数量 |
| itemCount | Integer | 总记录数 |
| pageCount | Integer | 总页数 |
| items | List<OptionExerciseRecordItem> | 行权记录列表 |
OptionExerciseRecordItem 字段
| 字段 | 类型 | 说明 |
|---|---|---|
| id | long | 行权申请记录 ID |
| contractId | long | 期权合约 ID |
| symbol | string | 期权合约代码 |
| stkSymbol | string | 正股代码 |
| expireDate | string | 到期日 |
| strike | string | 行权价 |
| callPut | string | CALL / PUT |
| type | string | Exercise / Expire |
| requestQuantity | double | 申请数量 |
| quantity | double | 实际行权数量 |
| status | string | 申请状态 |
| executingDate | string | 行权执行日期 |
| itmRate | int | 价内率 |
| isForce | boolean | 是否强制行权 |
| reason | string | 拒绝原因(如有) |
| accountId | long | 账户 ID |
示例
String account = "YOUR_PRIME_ACCOUNT";
// 省略分页条件;page 和 size 的参数位置仍须保留
OptionExerciseRecordRequest request =
OptionExerciseRecordRequest.buildRequest(account, null, null);
OptionExerciseRecordResponse response = client.execute(request);
if (response.isSuccess()) {
OptionExerciseRecordPageItem page = response.getItem();
System.out.println("itemCount=" + page.getItemCount() + " pageCount=" + page.getPageCount());
for (OptionExerciseRecordItem item : page.getItems()) {
System.out.println("id=" + item.getId() + " type=" + item.getType()
+ " status=" + item.getStatus());
}
}
// 指定分页和过滤条件
OptionExerciseRecordRequest filtered =
OptionExerciseRecordRequest.buildRequest(account, 1, 20)
.setType(OptionExerciseType.Exercise.name())
.setOrderBy("symbol");返回示例
{
"itemCount": 19,
"pageNum": 1,
"pageSize": 10,
"pageCount": 2,
"items": [
{
"id": 315,
"contractId": 2701923713,
"symbol": "AAPL",
"stkSymbol": "AAPL",
"expireDate": "2026-06-05",
"strike": "305.0",
"callPut": "PUT",
"type": "Exercise",
"requestQuantity": 1.0,
"quantity": 0.0,
"status": "Cancel",
"executingDate": "2026-06-01",
"itmRate": 0,
"isForce": false,
"reason": "Cancelled by manual",
"accountId": 600021133765
}
]
}请求频率
基础限流为 60 次/分钟。
撤销行权申请
对应请求类:OptionExerciseCancelRequest
撤销尚未执行的行权申请。
参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| account | string | 是 | 交易账户 |
| id | long | 是 | 行权申请记录 ID(从查询行权记录接口获取) |
| secretKey | string | 否 | 机构账户交易员密钥 |
示例
String account = "YOUR_PRIME_ACCOUNT";
Long recordId = 315L; // 从查询行权记录接口获取
OptionExerciseCancelRequest request =
OptionExerciseCancelRequest.buildRequest(account, recordId);
OptionExerciseCancelResponse response = client.execute(request);
System.out.println(response.isSuccess() ? "撤销调用成功" : "撤销调用失败: " + response.getMessage());isSuccess()、code 和 message 仅表示本次 OpenAPI 调用是否成功,不表示撤销申请已完成最终业务处理。撤销后请查询行权记录确认申请状态和处理结果。
请求频率
基础限流为 60 次/分钟。
Updated 7 days ago
