Option Exercise

Overview

The option exercise APIs are available since v0.4.2 and provide the following capabilities:

  • Exercise check: Estimate the underlying stock position change after exercise or waive
  • Query exercisable positions: Get the list of option positions eligible for exercise/waive requests
  • Submit exercise request: Submit an early exercise or early waive request
  • Query exercise records: Paginated query of submitted exercise request history
  • Cancel exercise request: Cancel a pending exercise request

Exercise Types (OptionExerciseType)

ValueDescription
ExerciseEarly exercise — exercise the option before expiry
ExpireEarly waive — voluntarily waive the right to exercise before expiry

Exercise Check

Method: TradeClient.check_option_exercise()

Estimates the underlying stock position change after exercise or waive. Call this before submitting to confirm the expected result.

Parameters

ParameterTypeRequiredDescription
contract_idintYesOption contract ID
exercise_typeOptionExerciseType | strYesExercise type: Exercise / Expire
quantityfloatYesExercise quantity (> 0)
accountstrNoTrading account (defaults to config account)
executing_datestrRequired for ExerciseExecution date, format yyyy-MM-dd
is_forceboolRequired for ExerciseWhether to force exercise
itm_rateintNoITM rate threshold 0–10 (Expire only)
secret_keystrNoTrader key for institutional/Prime accounts
langLanguage | strNoLanguage

Returns (OptionExerciseCheckResult)

FieldTypeDescription
available_quantityfloatExercisable quantity
positionfloatCurrent option position
stk_positionfloatCurrent underlying stock position
stk_position_changefloatStock position change after exercise
stk_position_beforefloatStock position before exercise
stk_position_afterfloatStock position after exercise
symbolstrUnderlying stock symbol

Example

from tigeropen.common.consts import OptionExerciseType

# Exercise check (Exercise type — quantity, executing_date, is_force required)
result = client.check_option_exercise(
    contract_id=1234567890,
    exercise_type=OptionExerciseType.EXERCISE,
    quantity=1.0,
    executing_date='2025-06-20',
    is_force=False
)
print(f"available_quantity={result.available_quantity}")
print(f"stk_position_before={result.stk_position_before}")
print(f"stk_position_after={result.stk_position_after}")

# Expire type — set ITM rate (quantity required)
result = client.check_option_exercise(
    contract_id=1234567890,
    exercise_type=OptionExerciseType.EXPIRE,
    quantity=1.0,
    itm_rate=5
)

Response example

{
  "available_quantity": 10.0,
  "position": 10.0,
  "stk_position": 300.0,
  "stk_position_change": -100.0,
  "stk_position_before": 300.0,
  "stk_position_after": 200.0,
  "symbol": "AAPL"
}

Query Exercisable Positions

Method: TradeClient.get_option_exercise_positions()

Returns the list of option positions eligible for exercise or waive requests.

Parameters

ParameterTypeRequiredDescription
exercise_typeOptionExerciseType | strYesExercise type: Exercise / Expire
accountstrNoTrading account (defaults to config account)
secret_keystrNoTrader key for institutional/Prime accounts
langLanguage | strNoLanguage

Returns (OptionExercisePositionPageResult)

FieldTypeDescription
itemsList[OptionExercisePosition]Position list
page_numintCurrent page number
page_sizeintPage size
item_countintTotal record count
page_countintTotal page count

OptionExercisePosition fields

FieldTypeDescription
contract_idintOption contract ID
symbolstrOption contract symbol
stk_symbolstrUnderlying stock symbol
expire_datestrExpiry date, format yyyy-MM-dd
strikestrStrike price
call_putstrCALL / PUT
marketstrMarket
account_idintAccount ID
positionfloatPosition quantity
available_quantityfloatExercisable quantity

Example

result = client.get_option_exercise_positions(
    exercise_type=OptionExerciseType.EXERCISE
)
print(f"item_count={result.item_count}")
for pos in result.items:
    print(f"contract_id={pos.contract_id} symbol={pos.symbol} "
          f"expire_date={pos.expire_date} available_qty={pos.available_quantity}")

Response example

{
  "item_count": 4,
  "page_num": 1,
  "page_size": 10,
  "page_count": 1,
  "items": [
    {
      "contract_id": 1684414425,
      "symbol": "AAPL",
      "stk_symbol": "AAPL",
      "expire_date": "2026-04-17",
      "strike": "280.0",
      "call_put": "PUT",
      "market": "US",
      "account_id": 600021133765,
      "position": 10.0,
      "available_quantity": 10.0
    }
  ]
}

Submit Exercise Request

Method: TradeClient.submit_option_exercise()

Submits an early exercise or early waive request.

⚠️

Note

  • Call the exercise check API first to confirm the position impact before submitting
  • executing_date and is_force are only applicable to Exercise type and are required
  • itm_rate is only applicable to Expire type
  • To cancel after a successful submission, use the cancel exercise request API

Parameters

ParameterTypeRequiredDescription
contract_idintYesOption contract ID
exercise_typeOptionExerciseType | strYesExercise type: Exercise / Expire
quantityfloatYesExercise quantity (> 0)
accountstrNoTrading account (defaults to config account)
executing_datestrRequired for ExerciseExecution date, format yyyy-MM-dd
is_forceboolRequired for ExerciseWhether to force exercise
itm_rateintNoITM rate threshold 0–10 (Expire only)
secret_keystrNoTrader key for institutional/Prime accounts
langLanguage | strNoLanguage

Returns

Returns True on success; raises ApiException on failure.

Example

# Early exercise
success = client.submit_option_exercise(
    contract_id=1234567890,
    exercise_type=OptionExerciseType.EXERCISE,
    quantity=1.0,
    executing_date='2025-06-20',
    is_force=False
)
print('Submitted successfully' if success else 'Submission failed')

# Early waive
success = client.submit_option_exercise(
    contract_id=1234567890,
    exercise_type=OptionExerciseType.EXPIRE,
    quantity=1.0
)

Query Exercise Records

Method: TradeClient.get_option_exercise_records()

Returns paginated exercise/waive request records.

Parameters

ParameterTypeRequiredDescription
accountstrNoTrading account (defaults to config account)
pageintNoPage number, starts from 1 (default 1)
sizeintNoPage size, 1–100 (default 20)
statusstrNoStatus filter: New / Cancel / Success / Fail
exercise_typeOptionExerciseType | strNoType filter: Exercise / Expire
symbolstrNoUnderlying symbol filter
order_bystrNoSort field: symbol / expire_date / strike / is_call
secret_keystrNoTrader key for institutional/Prime accounts
langLanguage | strNoLanguage

Returns (OptionExercisePageResult)

FieldTypeDescription
itemsList[OptionExerciseRecord]Record list
page_numintCurrent page number
page_sizeintPage size
item_countintTotal record count
page_countintTotal page count

OptionExerciseRecord fields

FieldTypeDescription
idintExercise record ID
contract_idintOption contract ID
symbolstrOption contract symbol
stk_symbolstrUnderlying stock symbol
expire_datestrExpiry date
strikestrStrike price
call_putstrCALL / PUT
typestrExercise / Expire
request_quantityfloatRequested quantity
quantityfloatActual exercised quantity
statusstrRequest status: New / Cancel / Success / Fail
executing_datestrExecution date
itm_rateintITM rate
is_forceboolForce exercise flag
reasonstrRejection reason (if any)
account_idintAccount ID

Example

# Basic query
result = client.get_option_exercise_records(page=1, size=20)
print(f"item_count={result.item_count} page_count={result.page_count}")
for record in result.items:
    print(f"id={record.id} type={record.type} status={record.status}")

# With filters
result = client.get_option_exercise_records(
    exercise_type=OptionExerciseType.EXERCISE,
    order_by='symbol',
    page=1,
    size=20
)

Response example

{
  "item_count": 19,
  "page_num": 1,
  "page_size": 10,
  "page_count": 2,
  "items": [
    {
      "id": 315,
      "contract_id": 2701923713,
      "symbol": "AAPL",
      "stk_symbol": "AAPL",
      "expire_date": "2026-06-05",
      "strike": "305.0",
      "call_put": "PUT",
      "type": "Exercise",
      "request_quantity": 1.0,
      "quantity": 0.0,
      "status": "Cancel",
      "executing_date": "2026-06-01",
      "itm_rate": 0,
      "is_force": false,
      "reason": "Cancelled by manual",
      "account_id": 600021133765
    }
  ]
}

Cancel Exercise Request

Method: TradeClient.cancel_option_exercise()

Cancels a pending exercise request.

Parameters

ParameterTypeRequiredDescription
exercise_idintYesExercise record ID (from get_option_exercise_records)
accountstrNoTrading account (defaults to config account)
secret_keystrNoTrader key for institutional/Prime accounts
langLanguage | strNoLanguage

Returns

Returns True on success; raises ApiException on failure.

Example

success = client.cancel_option_exercise(exercise_id=record_id)
print('Cancelled successfully' if success else 'Cancellation failed')