跳转至

未實現損益

用於查詢證券/期貨選擇權帳戶未實現損益,需要先登入

未實現損益

list_positions

api.list_positions?

Signature:
    api.list_positions(
        account: shioaji.account.Account = None,
        unit: shioaji.Unit = <Unit.Common: 'Common'>,
        timeout: int = 5000,
        cb: Callable[[List[Union[shioaji.position.StockPosition, shioaji.position.FuturePosition]]], NoneType] = None,
    ) -> List[Union[shioaji.position.StockPosition, shioaji.position.FuturePosition]]

Parameters

account: 選填,證券或期貨選擇權帳戶(省略則使用 api.stock_account)
unit:    選填,Unit.Common(整股/預設)或 Unit.Share(零股)
timeout: 逾時毫秒
cb:      選填,callback 函式,timeout=0 時使用

list_positions

shioaji portfolio positions [--account-type S|F] [--unit common|share] [--account BROKER_ID-ACCOUNT_ID]

Parameters

--account-type: 選填,S(證券/預設)或 F(期貨選擇權)
--unit:         選填,common(整股/預設)或 share(零股)
--account:      選填,BROKER_ID-ACCOUNT_ID 格式,省略則使用預設帳戶

list_positions

POST /api/v1/portfolio/position_unit
Content-Type: application/json

{
  "account_type": "S",
  "unit": "Common",
  "broker_id": <string>,
  "account_id": <string>,
  "person_id": <string>
}

Parameters

account_type: 選填,"S"(證券/預設)或 "F"(期貨選擇權)
unit:         選填,"Common"(整股/預設)或 "Share"(零股)
broker_id:    選填,券商代碼
account_id:   選填,帳戶代碼
person_id:    選填,身分證字號

證券

StockPosition

id (int):                       部位代碼
code (str):                     商品代碼
direction (Action):             買賣別 {Buy: , Sell: }
quantity (int):                 數量
price (float):                  平均價格
last_price (float):             目前股價
pnl (float):                    損益
yd_quantity (int):              昨日庫存數量
cond (StockOrderCond):          {Cash: 現股, Netting: 餘額交割, MarginTrading: 融資, ShortSelling: 融券, Emerging: 興櫃}
margin_purchase_amount (int):   融資金額
collateral (int):               擔保品
short_sale_margin (int):        保證金
interest (int):                 利息

整股

In

api.list_positions(account=api.stock_account)

Out

[
    StockPosition(
        id=0,
        code='2890',
        direction=<Action.Buy: 'Buy'>,
        quantity=1,
        price=30.0,
        last_price=31.0,
        pnl=1000,
        yd_quantity=1,
        cond=<StockOrderCond.Cash: 'Cash'>,
        margin_purchase_amount=0,
        collateral=0,
        short_sale_margin=0,
        interest=0,
    ),
    StockPosition(
        id=1,
        code='2330',
        direction=<Action.Buy: 'Buy'>,
        quantity=1,
        price=2000.0,
        last_price=1980.0,
        pnl=-20000,
        yd_quantity=1,
        cond=<StockOrderCond.Cash: 'Cash'>,
        margin_purchase_amount=0,
        collateral=0,
        short_sale_margin=0,
        interest=0,
    ),
]

轉成 DataFrame(以 polars 示範)

In

import polars as pl
positions = api.list_positions(account=api.stock_account)
df = pl.DataFrame(p.dict() for p in positions)
df

Out

id code direction quantity price last_price pnl yd_quantity cond margin_purchase_amount collateral short_sale_margin interest
0 2890 Buy 1 30.0 31.0 1000 1 Cash 0 0 0 0
1 2330 Buy 1 2000.0 1980.0 -20000 1 Cash 0 0 0 0

零股

In

from shioaji import Unit
api.list_positions(account=api.stock_account, unit=Unit.Share)

Out

[
    StockPosition(
        id=0,
        code='2890',
        direction=<Action.Buy: 'Buy'>,
        quantity=1000,
        price=30.0,
        last_price=31.0,
        pnl=1000,
        yd_quantity=1000,
        cond=<StockOrderCond.Cash: 'Cash'>,
        margin_purchase_amount=0,
        collateral=0,
        short_sale_margin=0,
        interest=0,
    ),
    StockPosition(
        id=1,
        code='2330',
        direction=<Action.Buy: 'Buy'>,
        quantity=1000,
        price=2000.0,
        last_price=1980.0,
        pnl=-20000,
        yd_quantity=1000,
        cond=<StockOrderCond.Cash: 'Cash'>,
        margin_purchase_amount=0,
        collateral=0,
        short_sale_margin=0,
        interest=0,
    ),
]

整股

In

shioaji portfolio positions --account YOUR_BROKER_ID-YOUR_ACCOUNT_ID

Out

[2]{id,code,direction,quantity,price,last_price,pnl,yd_quantity,cond,margin_purchase_amount,collateral,short_sale_margin,interest}:
  0,"2890",Buy,1,30.0,31.0,1000,1,Cash,0,0,0,0
  1,"2330",Buy,1,2000.0,1980.0,-20000,1,Cash,0,0,0,0

零股

In

shioaji portfolio positions --unit share --account YOUR_BROKER_ID-YOUR_ACCOUNT_ID

Out

[2]{id,code,direction,quantity,price,last_price,pnl,yd_quantity,cond,margin_purchase_amount,collateral,short_sale_margin,interest}:
  0,"2890",Buy,1000,30.0,31.0,1000,1000,Cash,0,0,0,0
  1,"2330",Buy,1000,2000.0,1980.0,-20000,1000,Cash,0,0,0,0

整股

In

curl -X POST http://localhost:8080/api/v1/portfolio/position_unit \
  -H 'Content-Type: application/json' \
  -d '{"account_type": "S", "broker_id": "YOUR_BROKER_ID", "account_id": "YOUR_ACCOUNT_ID"}'

Out

[
  {
    "id": 0,
    "code": "2890",
    "direction": "Buy",
    "quantity": 1,
    "price": 30.0,
    "last_price": 31.0,
    "pnl": 1000.0,
    "yd_quantity": 1,
    "cond": "Cash",
    "margin_purchase_amount": 0,
    "collateral": 0,
    "short_sale_margin": 0,
    "interest": 0
  },
  {
    "id": 1,
    "code": "2330",
    "direction": "Buy",
    "quantity": 1,
    "price": 2000.0,
    "last_price": 1980.0,
    "pnl": -20000.0,
    "yd_quantity": 1,
    "cond": "Cash",
    "margin_purchase_amount": 0,
    "collateral": 0,
    "short_sale_margin": 0,
    "interest": 0
  }
]

零股

In

curl -X POST http://localhost:8080/api/v1/portfolio/position_unit \
  -H 'Content-Type: application/json' \
  -d '{"account_type": "S", "unit": "Share", "broker_id": "YOUR_BROKER_ID", "account_id": "YOUR_ACCOUNT_ID"}'

Out

[
  {
    "id": 0,
    "code": "2890",
    "direction": "Buy",
    "quantity": 1000,
    "price": 30.0,
    "last_price": 31.0,
    "pnl": 1000.0,
    "yd_quantity": 1000,
    "cond": "Cash",
    "margin_purchase_amount": 0,
    "collateral": 0,
    "short_sale_margin": 0,
    "interest": 0
  },
  {
    "id": 1,
    "code": "2330",
    "direction": "Buy",
    "quantity": 1000,
    "price": 2000.0,
    "last_price": 1980.0,
    "pnl": -20000.0,
    "yd_quantity": 1000,
    "cond": "Cash",
    "margin_purchase_amount": 0,
    "collateral": 0,
    "short_sale_margin": 0,
    "interest": 0
  }
]

期貨選擇權

FuturePosition

id (int):           部位代碼
code (str):         商品代碼
direction (Action): 買賣別 {Buy: , Sell: }
quantity (int):     數量
price (float):      平均價格
last_price (float): 目前價格
pnl (float):        損益

In

api.list_positions(account=api.futopt_account)

Out

[
    FuturePosition(
        id=0,
        code='TXO20260620200C',
        direction=<Action.Buy: 'Buy'>,
        quantity=3,
        price=131.0,
        last_price=126.0,
        pnl=-750.0,
    ),
]

In

shioaji portfolio positions --account-type F --account YOUR_BROKER_ID-YOUR_ACCOUNT_ID

Out

[1]{id,code,direction,quantity,price,last_price,pnl}:
  0,"TXO20260620200C",Buy,3,131.0,126.0,-750.0

In

curl -X POST http://localhost:8080/api/v1/portfolio/position_unit \
  -H 'Content-Type: application/json' \
  -d '{"account_type": "F", "broker_id": "YOUR_BROKER_ID", "account_id": "YOUR_ACCOUNT_ID"}'

Out

[
  {
    "id": 0,
    "code": "TXO20260620200C",
    "direction": "Buy",
    "quantity": 3,
    "price": 131.0,
    "last_price": 126.0,
    "pnl": -750.0
  }
]

未實現損益 - 明細

detail_id未實現損益回傳結果中的 id,用於查詢該筆部位的明細。

list_position_detail

api.list_position_detail?

Signature:
    api.list_position_detail(
        account: shioaji.account.Account = None,
        detail_id: int = 0,
        timeout: int = 5000,
        cb: Callable[[List[Union[shioaji.position.StockPositionDetail, shioaji.position.FuturePositionDetail]]], NoneType] = None,
    ) -> List[Union[shioaji.position.StockPositionDetail, shioaji.position.FuturePositionDetail]]

Parameters

account:   選填,證券或期貨選擇權帳戶(省略則使用 api.stock_account)
detail_id: 選填,部位 ID(從 list_positions 結果取得)
timeout:   逾時毫秒
cb:        選填,callback 函式,timeout=0 時使用

list_position_detail

POST /api/v1/portfolio/position_detail
Content-Type: application/json

{
  "account_type": "S",
  "detail_id": <int>,
  "broker_id": <string>,
  "account_id": <string>,
  "person_id": <string>
}

Parameters

account_type: 選填,"S"(證券/預設)或 "F"(期貨選擇權)
detail_id:    選填,部位 ID(從 list_positions 結果取得)
broker_id:    選填,券商代碼
account_id:   選填,帳戶代碼
person_id:    選填,身分證字號

證券

StockPositionDetail

date (str):              交易日期
code (str):              商品代碼
quantity (int):          數量
price (float):           付出成本
last_price (float):      現值
dseq (str):              委託書號
direction (Action):      買賣別 {Buy: , Sell: }
pnl (float):             損益
currency (Currency):     幣別 {TWD, USD, HKD, EUR, CAD, BAS}
fee (float):             交易手續費
cond (StockOrderCond):   {Cash: 現股, Netting: 餘額交割, MarginTrading: 融資, ShortSelling: 融券, Emerging: 興櫃}
ex_dividends (int):      除息金額
interest (int):          利息
margintrading_amt (int): 融資金額
collateral (int):        擔保品

In

api.list_position_detail(account=api.stock_account, detail_id=0)

Out

[
    StockPositionDetail(
        date='2026-05-18',
        code='2890',
        quantity=1,
        price=30000,
        last_price=31000,
        dseq='Y1QDH',
        direction=<Action.Buy: 'Buy'>,
        pnl=1000,
        currency=<Currency.TWD: 'TWD'>,
        fee=100,
        cond=<StockOrderCond.Cash: 'Cash'>,
        ex_dividends=0,
        interest=0,
        margintrading_amt=0,
        collateral=0,
    ),
]

In

curl -X POST http://localhost:8080/api/v1/portfolio/position_detail \
  -H 'Content-Type: application/json' \
  -d '{"account_type": "S", "detail_id": 0, "broker_id": "YOUR_BROKER_ID", "account_id": "YOUR_ACCOUNT_ID"}'

Out

[
  {
    "date": "2026-05-18",
    "code": "2890",
    "quantity": 1,
    "price": 30000.0,
    "last_price": 31000.0,
    "dseq": "Y1QDH",
    "direction": "Buy",
    "pnl": 1000.0,
    "currency": "TWD",
    "fee": 100.0,
    "cond": "Cash",
    "ex_dividends": 0,
    "interest": 0,
    "margintrading_amt": 0,
    "collateral": 0
  }
]

期貨選擇權

FuturePositionDetail

date (str):           交易日期
code (str):           商品代碼
quantity (int):       數量
price (float):        平均價格
last_price (float):   目前價格
dseq (str):           委託書號
direction (Action):   買賣別 {Buy: , Sell: }
pnl (float):          損益
currency (Currency):  幣別 {TWD, USD, HKD, EUR, CAD, BAS}
fee (float):          交易手續費
entry_quantity (int): 新倉數量

In

api.list_position_detail(account=api.futopt_account, detail_id=0)

Out

[
    FuturePositionDetail(
        date='2026-05-21',
        code='TXO20260620200C',
        quantity=3,
        price=131.0,
        last_price=126.0,
        dseq='tA0n8',
        direction=<Action.Buy: 'Buy'>,
        pnl=-750.0,
        currency=<Currency.TWD: 'TWD'>,
        fee=120.0,
        entry_quantity=3,
    ),
]

In

curl -X POST http://localhost:8080/api/v1/portfolio/position_detail \
  -H 'Content-Type: application/json' \
  -d '{"account_type": "F", "detail_id": 0, "broker_id": "YOUR_BROKER_ID", "account_id": "YOUR_ACCOUNT_ID"}'

Out

[
  {
    "date": "2026-05-21",
    "code": "TXO20260620200C",
    "quantity": 3,
    "price": 131.0,
    "last_price": 126.0,
    "dseq": "tA0n8",
    "direction": "Buy",
    "pnl": -750.0,
    "currency": "TWD",
    "fee": 120.0,
    "entry_quantity": 3
  }
]