如何使用 Jupyter Notebook 進行衍生品交易?

發佈於 2023年9月28日更新於 2025年4月8日閱讀時長 7 分鐘117

歐易提供三種衍生品交易類型:交割、永續和期權。 本教程將以永續交易為例,介紹如何使用 python-okx 庫進行交易。

常見問題

1. 如何獲取市場數據

您可以通過以下代碼獲取市場數據,並可將 instType 替換為 "FUTURES""OPTION" 以獲取相應資訊。

Python
     import okx.MarketData as MarketData

   flag = "1"  # live trading: 0, demo trading: 1

   marketDataAPI = MarketData.MarketAPI(flag = flag)

   result = marketDataAPI.get_tickers(instType = "SWAP")
   print(result)

2. 如何獲取可交易的交易對

以同樣的方式,選擇 instType 獲取對應類型的交易對資訊。

Python
import okx.PublicData as PublicData

if __name__ == '__main__':

    flag = "1"  # live trading: 0, demo trading: 1

    publicDataAPI = PublicData.PublicAPI(flag = flag)

    result = publicDataAPI.get_instruments(instType = "SWAP")
    print(result)

2.1 使用合約ctValctMult 計算衍生品合約的名義價值

要計算衍生合約(即交割、永續和期權)的名義價值,您需要從工具參數中獲得ctVal(合約價值)和ctMult(合約乘數)。

衍生品合約的名義價值可以計算為ctVal*ctMult(單位:ctValCcy);

例如,從下面顯示的合約參數,我們可以計算 LTCUSD 永續合約的名義價值為:ctVal*ctMult(單位:ctValccy)= 10*1 USD = 10 USD

JSON
        "instType":"SWAP",
        "instId":"LTC-USD-SWAP",
        "instFamily":"LTC-USD",
        "uly":"LTC-USD",
        "settleCcy":"LTC",
        "ctVal":"10",
        "ctMult":"1",
        "ctValCcy":"USD"

3. 如何查詢賬戶餘額

Python
import okx.Account as Account
flag = "1"  # live trading:0, demo trading: 1

accountAPI = Account.AccountAPI(api_key, secret_key, passphrase, False, flag)

result = accountAPI.get_account_balance()
print(result)

4. 什麼是帳戶模式和保證金 / 交易模式?

歐易帳戶一共有四種模式:

  • 現貨模式

  • 現貨和合約模式

  • 跨幣種保證金模式

  • 組合保證金模式

其中,除了現貨模式,其他三個保證金模式都可用於衍生品交易。 您可以參考《統一交易賬戶介紹》瞭解不同模式的區別及切換方式。

4.1 從獲取帳戶配置中的acctLv參數獲取當前帳戶配置

確保您處於正確的帳戶模式以交易衍生品。

Python
import okx.Account as Account

flag = "1"  # live trading: 0, demo trading: 1

accountAPI = Account.AccountAPI(api_key, secret_key, passphrase, False, flag)
result = accountAPI.get_account_config()
print(result)

if result['code'] == "0":
    acctLv = result["data"][0]["acctLv"]
    if acctLv == "1":
        print("Simple mode")
    elif acctLv == "2":
        print("Single-currency margin mode")
    elif acctLv == "3":
        print("Multi-currency margin mode")
    elif acctLv == "4":
        print("Portfolio margin mode")

5. 如何設置槓桿?

槓桿可放大收益或虧損,平臺最高支援 125 倍槓桿。 您可以閱讀 倉位檔位詳情,瞭解更多詳情。

CT-web-spottrading-howtoapi-6

這是上面顯示的詞彙表的含義:

  • 最大槓桿倍數:指交易者可通過借入資金放大投資回報的最高倍數。

  • 初始保證金率(IMR):開倉時需要的最低保證金比例。

  • 維持保證金率(MMR):維持持倉所需的最低保證金比例。 當賬戶權益低於此比例時將觸發強制平倉。

例如,當您想交易 3000 ETHUSDT 永續合約時,您最大可用槓桿是 75 倍。 IMR = 1/75 = 1.3%,您必須保持 ≥ 0.8% 保證金比例以避免強制平倉。 通過歐易開放 API 設置槓桿共有9種不同場景,具體請參考這裡。 關於永續合約的槓桿設置,主要分為以下三種情況:

  1. 全倉交易模式下,針對永續合約設置槓桿(合約層級)

  2. 逐倉交易模式且採用買賣持倉模式下,針對永續合約設置槓桿(合約層級)

  3. 逐倉交易模式且採用多空持倉模式下,針對永續合約及持倉方向分別設置槓桿(合約及持倉方向層級)

以下示例將展示如何針對單個永續合約品種及其持倉方向設置槓桿(與針對某標的物下所有永續合約統一設置槓桿的操作進行對比)。

Bash
# Set leverage to be 5x for all cross-margin BTC-USDT SWAP positions,
# by providing the SWAP instId
result = accountAPI.set_leverage(
    instId = "BTC-USDT-SWAP",
    lever = "5",
    mgnMode = "cross"
)
print(result)

# In buy/sell position mode, set leverage to be 5x 
# for all isolated-margin BTC-USDT SWAP positions
# by providing the SWAP instId
result = accountAPI.set_leverage(
    instId = "BTC-USDT-SWAP",
    lever = "5",
    mgnMode = "isolated"
)
print(result)

# In long/short position mode, set leverage to be 5x
# for an isolated-margin BTC-USDT-SWAP long position;
# This does NOT affect the leverage of the BTC-USDT-SWAP
# short positions
result = accountAPI.set_leverage(
    instId = "BTC-USDT-SWAP",
    lever = "5",
    posSide = "long",
    mgnMode = "isolated"
)
print(result)

請注意,posSide 請求參數僅在保證金模式為逐倉且持倉模式為多空(Long/Short)時適用於交割合約和永續合約的下單操作(具體應用請參見設置槓桿場景中的場景6和9)。

6. 如何在不同的持倉模式下下單?

在進行交割和永續合約交易時,有兩種持倉模式:

1. 多空(Long/Short)模式

2. 買賣(Buy/Sell)模式

持倉模式:多頭/空頭買入/賣出(淨額)。

您可以通過 API 切換持倉模式:

SQL
result = accountAPI.set_position_mode(
    posMode = "long_short_mode"
)
print(result)

或者,您可以通過 Web 端上的設置來調整:

CT-web-derivativestrading-howtoapi-9

買/賣(凈持倉模式)下,某合約的持倉為買入和賣出交易的凈數量:

  • 通過Place order下單時,posSide參數不是必填項。

  • 若填寫posSide,唯一有效值為 net


多空(獨立持倉模式)下,同一合約的多頭和空頭持倉相互獨立,需分別平倉:

  • 通過 Place order 下單時,posSide 參數為必填項

  • 選擇值:long(多方向)或 short(空方向)。


以下為不同下單場景下的 side(交易方向)和 posSide(持倉方向)參數:

  • 買入並開/增加多頭持倉side = buyposSide = long

  • 賣出並開/增加空頭持倉side = sellposSide = short

  • 賣出並平/減少多頭持倉side = sellposSide = long

  • 買入並平/減少空頭持倉side = buyposSide = short

6.1 限價委託單下單

以下示例展示如何以 19,000 USDT 價格買入 100 張 BTC-USDT 永續合約

SQL
# limit order
result = tradeAPI.place_order(
    instId = "BTC-USDT-SWAP",
    tdMode = "isolated",
    side = "buy",
    posSide = "net",
    ordType = "limit",
    px = "19000",
    sz = "100"
)
print(result)

if result["code"] == "0":
    print("Successful order request,order_id = ",result["data"][0]["ordId"])
else:
    print("Unsuccessful order request,error_code = ",result["data"][0]["sCode"], ", Error_message = ", result["data"][0]["sMsg"])

6.2 市價委託下單

以下示例展示如何以市價買入100 張 BTC-USDT 永續合約

SQL
# market order
result = tradeAPI.place_order(
    instId = "BTC-USDT-SWAP",
    tdMode = "isolated",
    side = "buy",
    posSide = "net",
    ordType = "market",
    sz = "100"
)
print(result)

if result["code"] == "0":
    print("Successful order request,order_id = ",result["data"][0]["ordId"])
else:
    print("Unsuccessful order request,error_code = ",result["data"][0]["sCode"], ", Error_message = ", result["data"][0]["sMsg"])

7. 如何查詢特定訂單的詳情或狀態? (可參考這裡

除了ordId,您還可以使用 clOrdId 來查詢訂單詳情。

SQL
result = tradeAPI.get_order(instId="BTC-USDT-SWAP", ordId="505073046126960640")
print(result)

8. 如何取消訂單

除了ordId,您可以使用clOrdId

Perl
You also use __clOrdId__ in place of __ordId__
result = tradeAPI.cancel_order(instId="BTC-USDT-SWAP", ordId="505073046126960640")
print(result)

9. 如何修改訂單

同樣,您可以使用 clOrdId 替代 ordId。 以下示例展示了修改訂單的 newSz(新委託數量)。

SQL
result = tradeAPI.amend_order(
    instId = "BTC-USDT-SWAP", 
    ordId = "505073046126960640",
    newSz = "80"
)
print(result)

10. 如何獲取當前委託清單

SQL
result = tradeAPI.get_order_list()
print(result)

11. 如何查詢歷史訂單?(過去 7 天的歷史訂單)和((過去 3 個月的歷史訂單)

SQL
# Get order history (last 7 days)
result = tradeAPI.get_orders_history(
    instType = "SWAP"
)
print(result)

# Get order history (last 3 months)
result = tradeAPI.get_orders_history_archive(
    instType = "SWAP"
)
print(result)

12. 如何查詢交易明細通過取得交易詳情(過去3天)取得交易詳情(過去3個月)

SQL
# Get transaction details (last 3 days)
result = tradeAPI.get_fills()
print(result)

# Get transaction details (last 3 months)
result = tradeAPI.get_fills_history(
    instType = "SWAP"
)
print(result)

13. 如何查詢持倉資訊?

當您的帳戶處於單向持倉模式時,將顯示每份合約的單向持倉; 當您的帳戶處於雙向持倉模式時,每份合約的做多或做空持倉將分別顯示。

SQL
result = accountAPI.get_positions()
print(result)
  • 單向持倉模式 (net mode):每個合約的凈持倉量將被顯示。

  • 雙向持倉模式 (long/short mode):做多和做空持倉將分別顯示。

例如,您可以通過返回參數upl追蹤未實現盈虧(Unrealized P&L)。

備註事項:

更多範例,請下載完整的 Jupyter Notebook 如果您對我們的 API 有任何疑問,歡迎加入我們的 API 社群交流討論。