如何使用 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 社群交流讨论。