跳转至

已實現損益

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

已實現損益

list_profit_loss

api.list_profit_loss?

Signature:
    api.list_profit_loss(
        account: shioaji.account.Account = None,
        begin_date: str = '',
        end_date: str = '',
        unit: shioaji.Unit = <Unit.Common: 'Common'>,
        timeout: int = 5000,
        cb: Callable[[List[Union[shioaji.position.StockProfitLoss, shioaji.position.FutureProfitLoss]]], NoneType] = None,
    ) -> List[Union[shioaji.position.StockProfitLoss, shioaji.position.FutureProfitLoss]]

Parameters

account:    證券或期貨選擇權帳戶
begin_date: 查詢起始日期,格式 YYYY-MM-DD
end_date:   查詢結束日期,格式 YYYY-MM-DD
unit:       Unit.Common(整股/預設)或 Unit.Share(零股)
timeout:    逾時毫秒
cb:         callback 函式,timeout=0 時使用

list_profit_loss

$ shioaji portfolio profit-loss --help

Get realized profit and loss

Usage: shioaji portfolio profit-loss [OPTIONS]

Options:
      --account-type <ACCOUNT_TYPE>  Account type: S (stock) or F (futures) [default: S]
      --account <ACCOUNT>            Account in BROKER_ID-ACCOUNT_ID format (e.g. 9A00-1234567)
      --begin-date <BEGIN_DATE>      Begin date (YYYY-MM-DD, default: today) [default: 2026-06-12]
      --end-date <END_DATE>          End date (YYYY-MM-DD, default: today) [default: 2026-06-12]
      --unit <UNIT>                  Unit: common (default) or share [default: common] [possible values: common, share]

Parameters

--account-type: 選填,S(證券,預設)或 F(期貨選擇權)
--account:      選填,BROKER_ID-ACCOUNT_ID 格式;未填時使用該類型的預設帳號
--begin-date:   查詢起始日期,格式 YYYY-MM-DD,預設今日
--end-date:     查詢結束日期,格式 YYYY-MM-DD,預設今日
--unit:         選填,common(整股,預設)或 share(零股)

list_profit_loss

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

{
  "account_type": "S",
  "begin_date": "2026-05-01",
  "end_date": "2026-05-31",
  "unit": "Common",
  "broker_id": <string>,
  "account_id": <string>,
  "person_id": <string>
}

Parameters

account_type: "S"(證券/預設)或 "F"(期貨選擇權)
begin_date:   查詢起始日期,格式 YYYY-MM-DD
end_date:     查詢結束日期,格式 YYYY-MM-DD
unit:         "Common"(整股/預設)或 "Share"(零股)
broker_id:    券商代碼
account_id:   帳戶代碼
person_id:    身分證字號

證券

StockProfitLoss

id (int):              部位代碼可用於查詢明細
code (str):            商品代碼
quantity (int):        數量
pnl (float):           損益
date (str):            交易日期
dseq (str):            委託書號
price (float):         成交價格
pr_ratio (float):      損益比
cond (StockOrderCond): {Cash: 現股, Netting: 餘額交割, MarginTrading: 融資, ShortSelling: 融券, Emerging: 興櫃}
seqno (str):           委託序號

In

api.list_profit_loss(api.stock_account, '2026-05-01', '2026-05-21')

Out

[
    StockProfitLoss(
        id=0,
        code='2890',
        quantity=1,
        pnl=1000,
        date='2026-05-05',
        dseq='Y0TR2',
        price=31,
        pr_ratio=0.0333,
        cond=<StockOrderCond.Cash: 'Cash'>,
        seqno='113382',
    ),
    StockProfitLoss(
        id=1,
        code='2330',
        quantity=1,
        pnl=-20000,
        date='2026-05-06',
        dseq='Y20K2',
        price=1980,
        pr_ratio=-0.01,
        cond=<StockOrderCond.Cash: 'Cash'>,
        seqno='184354',
    ),
]

轉成 DataFrame(以 polars 示範)

In

import polars as pl
profit_loss = api.list_profit_loss(api.stock_account, '2026-05-01', '2026-05-21')
df = pl.DataFrame(p.dict() for p in profit_loss)
df

Out

id code quantity pnl date dseq price pr_ratio cond seqno
0 2890 1 1000 2026-05-05 Y0TR2 31 0.0333 Cash 113382
1 2330 1 -20000 2026-05-06 Y20K2 1980 -0.01 Cash 184354

In

shioaji portfolio profit-loss --account-type S --begin-date 2026-05-01 --end-date 2026-05-21

Out

[2]{id,code,quantity,pnl,date,dseq,price,pr_ratio,cond,seqno}:
  0,"2890",1,1000,"2026-05-05",Y0TR2,31,0.0333,Cash,"113382"
  1,"2330",1,-20000,"2026-05-06",Y20K2,1980,-0.01,Cash,"184354"

In

curl -X POST http://localhost:8080/api/v1/portfolio/profit_loss \
  -H 'Content-Type: application/json' \
  -d '{"account_type": "S", "begin_date": "2026-05-01", "end_date": "2026-05-21", "broker_id": "YOUR_BROKER_ID", "account_id": "YOUR_ACCOUNT_ID"}'

Out

[
  {
    "id": 0,
    "code": "2890",
    "quantity": 1,
    "pnl": 1000.0,
    "date": "2026-05-05",
    "dseq": "Y0TR2",
    "price": 31.0,
    "pr_ratio": 0.0333,
    "cond": "Cash",
    "seqno": "113382"
  },
  {
    "id": 1,
    "code": "2330",
    "quantity": 1,
    "pnl": -20000.0,
    "date": "2026-05-06",
    "dseq": "Y20K2",
    "price": 1980.0,
    "pr_ratio": -0.01,
    "cond": "Cash",
    "seqno": "184354"
  }
]

期貨選擇權

FutureProfitLoss

id (int):           部位代碼可用於查詢明細
code (str):         商品代碼
quantity (int):     數量
pnl (float):        損益
date (str):         交易日期
entry_price (float): 進倉價格
cover_price (float): 平倉價格
tax (int):          交易稅
fee (int):          交易手續費
direction (Action): 買賣別 {Buy: , Sell: }

In

api.list_profit_loss(api.futopt_account, '2026-05-01', '2026-05-21')

Out

[
    FutureProfitLoss(
        id=0,
        code='TXO20260620200C',
        quantity=3,
        pnl=-750.0,
        date='2026-05-10',
        entry_price=131.0,
        cover_price=126.0,
        tax=5,
        fee=120,
        direction=<Action.Buy: 'Buy'>,
    ),
]

In

shioaji portfolio profit-loss --account-type F --begin-date 2026-05-01 --end-date 2026-05-21

Out

[1]{id,code,quantity,pnl,date,entry_price,cover_price,tax,fee,direction}:
  0,"TXO20260620200C",3,-750,"2026-05-10",131,126,5,120,Buy

In

curl -X POST http://localhost:8080/api/v1/portfolio/profit_loss \
  -H 'Content-Type: application/json' \
  -d '{"account_type": "F", "begin_date": "2026-05-01", "end_date": "2026-05-21", "broker_id": "YOUR_BROKER_ID", "account_id": "YOUR_ACCOUNT_ID"}'

Out

[
  {
    "id": 0,
    "code": "TXO20260620200C",
    "quantity": 3,
    "pnl": -750.0,
    "date": "2026-05-10",
    "entry_price": 131.0,
    "cover_price": 126.0,
    "tax": 5,
    "fee": 120,
    "direction": "Buy"
  }
]

已實現損益 - 明細

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

list_profit_loss_detail

api.list_profit_loss_detail?

Signature:
    api.list_profit_loss_detail(
        account: shioaji.account.Account = None,
        detail_id: int = 0,
        unit: shioaji.Unit = <Unit.Common: 'Common'>,
        timeout: int = 5000,
        cb: Callable[[List[Union[shioaji.position.StockProfitDetail, shioaji.position.FutureProfitDetail]]], NoneType] = None,
    ) -> List[Union[shioaji.position.StockProfitDetail, shioaji.position.FutureProfitDetail]]

Parameters

account:   證券或期貨選擇權帳戶
detail_id: 部位 ID(從 list_profit_loss 結果取得)
unit:      Unit.Common(整股/預設)或 Unit.Share(零股)
timeout:   逾時毫秒
cb:        callback 函式,timeout=0 時使用

list_profit_loss_detail

$ shioaji portfolio profit-loss-detail --help

Get realized profit and loss detail by detail id

Usage: shioaji portfolio profit-loss-detail [OPTIONS] --detail-id <DETAIL_ID>

Options:
      --account-type <ACCOUNT_TYPE>  Account type: S (stock) or F (futures) [default: S]
      --account <ACCOUNT>            Account in BROKER_ID-ACCOUNT_ID format (e.g. 9A00-1234567)
      --detail-id <DETAIL_ID>        Detail ID (the `id` field from `portfolio profit-loss`)
      --unit <UNIT>                  Unit: common (default) or share [default: common] [possible values: common, share]

Parameters

--account-type: 選填,S(證券,預設)或 F(期貨選擇權)
--account:      選填,BROKER_ID-ACCOUNT_ID 格式;未填時使用該類型的預設帳號
--detail-id:    部位 ID(從 portfolio profit-loss 結果取得)
--unit:         選填,common(整股,預設)或 share(零股)

list_profit_loss_detail

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

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

Parameters

account_type: "S"(證券/預設)或 "F"(期貨選擇權)
detail_id:    部位 ID(從 list_profit_loss 結果取得)
unit:         "Common"(整股/預設)或 "Share"(零股)
broker_id:    券商代碼
account_id:   帳戶代碼
person_id:    身分證字號

證券

StockProfitDetail

date (str):                  交易日期
code (str):                  商品代碼
quantity (int):              數量
dseq (str):                  委託書號
fee (int):                   交易手續費
tax (int):                   交易稅
currency (str):              幣別 {TWD, USD, HKD, EUR, CAD, BAS}
price (float):               成交單價
cost (int):                  付出成本
rep_margintrading_amt (int): 償還融資金額
rep_collateral (int):        償還擔保品
rep_margin (int):            償還保證金
shortselling_fee (int):      融券手續費
ex_dividend_amt (int):       除息金額
interest (int):              利息
trade_type (TradeType):      {Common, DayTrade}
cond (StockOrderCond):       {Cash: 現股, Netting: 餘額交割, MarginTrading: 融資, ShortSelling: 融券, Emerging: 興櫃}

In

api.list_profit_loss_detail(api.stock_account, detail_id=0)

Out

[
    StockProfitDetail(
        date='2026-04-23',
        code='2890',
        quantity=1,
        dseq='Y0O7E',
        fee=119,
        tax=0,
        currency='TWD',
        price=30.0,
        cost=30119,
        rep_margintrading_amt=0,
        rep_collateral=0,
        rep_margin=0,
        shortselling_fee=0,
        ex_dividend_amt=0,
        interest=0,
        trade_type=<TradeType.Common: 'Common'>,
        cond=<StockOrderCond.Cash: 'Cash'>,
    ),
]

In

shioaji portfolio profit-loss-detail --account-type S --detail-id 0

Out

[1]{date,code,quantity,dseq,fee,tax,currency,price,cost,rep_margintrading_amt,rep_collateral,rep_margin,shortselling_fee,ex_dividend_amt,interest,trade_type,cond}:
  "2026-04-23","2890",1,Y0O7E,119,0,TWD,30,30119,0,0,0,0,0,0,Common,Cash

In

curl -X POST http://localhost:8080/api/v1/portfolio/profit_loss_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-04-23",
    "code": "2890",
    "quantity": 1.0,
    "dseq": "Y0O7E",
    "fee": 119,
    "tax": 0,
    "currency": "TWD",
    "price": 30.0,
    "cost": 30119,
    "rep_margintrading_amt": 0,
    "rep_collateral": 0,
    "rep_margin": 0,
    "shortselling_fee": 0,
    "ex_dividend_amt": 0,
    "interest": 0,
    "trade_type": "Common",
    "cond": "Cash"
  }
]

期貨選擇權

FutureProfitDetail

date (str):           交易日期
code (str):           商品代碼
quantity (int):       數量
dseq (str):           委託書號
fee (float):          交易手續費
tax (float):          交易稅
currency (str):       幣別 {TWD, USD, HKD, EUR, CAD, BAS}
direction (Action):   買賣別 {Buy: , Sell: }
entry_date (str):     進倉日期
entry_quantity (int): 進倉數量
entry_seqno (str):    進倉委託序號
entry_price (float):  進倉價格
cover_price (float):  平倉價格
pnl (int):            損益

In

api.list_profit_loss_detail(api.futopt_account, detail_id=0)

Out

[
    FutureProfitDetail(
        date='2026-05-10',
        code='TXO20260620200C',
        quantity=3,
        dseq='tA0n8',
        fee=120.0,
        tax=5.0,
        currency='TWD',
        direction=<Action.Buy: 'Buy'>,
        entry_date='2026-05-08',
        entry_quantity=3,
        entry_seqno='113382',
        entry_price=131.0,
        cover_price=126.0,
        pnl=-750,
    ),
]

In

shioaji portfolio profit-loss-detail --account-type F --detail-id 0

Out

[1]{date,code,quantity,dseq,fee,tax,currency,direction,entry_date,entry_quantity,entry_seqno,entry_price,cover_price,pnl}:
  "2026-05-10","TXO20260620200C",3,tA0n8,120,5,TWD,Buy,"2026-05-08",3,"113382",131,126,-750

In

curl -X POST http://localhost:8080/api/v1/portfolio/profit_loss_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-10",
    "code": "TXO20260620200C",
    "quantity": 3,
    "dseq": "tA0n8",
    "fee": 120.0,
    "tax": 5.0,
    "currency": "TWD",
    "direction": "Buy",
    "entry_date": "2026-05-08",
    "entry_quantity": 3,
    "entry_seqno": "113382",
    "entry_price": 131.0,
    "cover_price": 126.0,
    "pnl": -750
  }
]

已實現損益 - 彙總

用於查詢一段時間內的已實現損益彙總;回傳物件 ProfitLossSummaryTotal 包含每檔商品的明細列表 profitloss_summary 與總計 total

list_profit_loss_summary

api.list_profit_loss_summary?

Signature:
    api.list_profit_loss_summary(
        account: shioaji.account.Account = None,
        begin_date: str = '',
        end_date: str = '',
        timeout: int = 5000,
        cb: Callable[[ProfitLossSummaryTotal], NoneType] = None,
    ) -> ProfitLossSummaryTotal

Parameters

account:    證券或期貨選擇權帳戶
begin_date: 查詢起始日期,格式 YYYY-MM-DD
end_date:   查詢結束日期,格式 YYYY-MM-DD
timeout:    逾時毫秒
cb:         callback 函式,timeout=0 時使用

list_profit_loss_summary

$ shioaji portfolio profit-loss-summary --help

Get profit and loss summary

Usage: shioaji portfolio profit-loss-summary [OPTIONS]

Options:
      --account-type <ACCOUNT_TYPE>  Account type: S (stock) or F (futures) [default: S]
      --account <ACCOUNT>            Account in BROKER_ID-ACCOUNT_ID format (e.g. 9A00-1234567)
      --begin-date <BEGIN_DATE>      Begin date (YYYY-MM-DD, default: today) [default: 2026-06-12]
      --end-date <END_DATE>          End date (YYYY-MM-DD, default: today) [default: 2026-06-12]

Parameters

--account-type: 選填,S(證券,預設)或 F(期貨選擇權)
--account:      選填,BROKER_ID-ACCOUNT_ID 格式;未填時使用該類型的預設帳號
--begin-date:   查詢起始日期,格式 YYYY-MM-DD,預設今日
--end-date:     查詢結束日期,格式 YYYY-MM-DD,預設今日

list_profit_loss_summary

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

{
  "account_type": "S",
  "begin_date": "2026-05-01",
  "end_date": "2026-05-31",
  "broker_id": <string>,
  "account_id": <string>,
  "person_id": <string>
}

Parameters

account_type: "S"(證券/預設)或 "F"(期貨選擇權)
begin_date:   查詢起始日期,格式 YYYY-MM-DD
end_date:     查詢結束日期,格式 YYYY-MM-DD
broker_id:    券商代碼
account_id:   帳戶代碼
person_id:    身分證字號

證券

StockProfitLossSummary

code (str):            商品代碼
quantity (int):        數量
entry_price (float):   進倉價格
cover_price (float):   平倉價格
pnl (float):           損益
currency (str):        幣別
entry_cost (int):      進倉金額不含手續費及交易稅
cover_cost (int):      平倉金額不含手續費及交易稅
buy_cost (int):        付出成本
sell_cost (int):       賣出收入
pr_ratio (float):      損益比
cond (StockOrderCond): {Cash: 現股, Netting: 餘額交割, MarginTrading: 融資, ShortSelling: 融券, Emerging: 興櫃}

ProfitLossTotal

entry_amount (float): 進倉總金額
cover_amount (float): 平倉總金額
quantity (int):       總數量
buy_cost (float):     付出總成本
sell_cost (float):    賣出總收入
pnl (float):          總損益
pr_ratio (float):     總損益比

In

resp = api.list_profit_loss_summary(api.stock_account, '2026-05-01', '2026-05-21')
resp

Out

ProfitLossSummaryTotal(total=ProfitLossTotal(pnl=2781, pr_ratio=0.29))

查看各商品損益明細

In

dict(resp)

Out

{
    'profitloss_summary': [
        StockProfitLossSummary(
            code='3265',
            quantity=1000,
            entry_price=181.5,
            cover_price=172.5,
            pnl=-9657,
            currency='NTD',
            entry_cost=181500,
            cover_cost=172500,
            buy_cost=181572,
            sell_cost=171915,
            pr_ratio=-5.32,
            cond=<StockOrderCond.Cash: 'Cash'>
        ),
        StockProfitLossSummary(
            code='8261',
            quantity=1000,
            entry_price=122,
            cover_price=132,
            pnl=9504,
            currency='NTD',
            entry_cost=122000,
            cover_cost=132000,
            buy_cost=122048,
            sell_cost=131552,
            pr_ratio=7.79,
            cond=<StockOrderCond.Cash: 'Cash'>
        ),
        ...
    ],
    'total': ProfitLossTotal(
        entry_amount=0,
        cover_amount=0,
        quantity=5000,
        buy_cost=975387,
        sell_cost=978168,
        pnl=2781,
        pr_ratio=0.29
    ),
    'status': <FetchStatus.Fetched: 'Fetched'>
}

In

shioaji portfolio profit-loss-summary --account-type S --begin-date 2026-05-01 --end-date 2026-05-21

Out

profitloss_sum[2]{code,quantity,entry_price,cover_price,pnl,currency,entry_cost,cover_cost,buy_cost,sell_cost,pr_ratio,cond}:
  "2890",1000,30,31,1000,NTD,30000,31000,30119,30881,3.33,Cash
  "2330",1000,2000,1980,-20000,NTD,2000000,1980000,2000119,1979881,-1,Cash
total:
  entry_amount: 0
  cover_amount: 0
  quantity: 2000
  buy_cost: 2030238
  sell_cost: 2010762
  pnl: -19000
  pr_ratio: -0.94

In

curl -X POST http://localhost:8080/api/v1/portfolio/profitloss_sum \
  -H 'Content-Type: application/json' \
  -d '{"account_type": "S", "begin_date": "2026-05-01", "end_date": "2026-05-21", "broker_id": "YOUR_BROKER_ID", "account_id": "YOUR_ACCOUNT_ID"}'

Out

{
  "profitloss_sum": [
    {
      "code": "2890",
      "quantity": 1000,
      "entry_price": 30.0,
      "cover_price": 31.0,
      "pnl": 1000.0,
      "currency": "NTD",
      "entry_cost": 30000,
      "cover_cost": 31000,
      "buy_cost": 30119,
      "sell_cost": 30881,
      "pr_ratio": 3.33,
      "cond": "Cash"
    },
    {
      "code": "2330",
      "quantity": 1000,
      "entry_price": 2000.0,
      "cover_price": 1980.0,
      "pnl": -20000.0,
      "currency": "NTD",
      "entry_cost": 2000000,
      "cover_cost": 1980000,
      "buy_cost": 2000119,
      "sell_cost": 1979881,
      "pr_ratio": -1.00,
      "cond": "Cash"
    }
  ],
  "total": {
    "entry_amount": 0.0,
    "cover_amount": 0.0,
    "quantity": 2000,
    "buy_cost": 2030238.0,
    "sell_cost": 2010762.0,
    "pnl": -19000.0,
    "pr_ratio": -0.94
  }
}

期貨選擇權

FutureProfitLossSummary

code (str):          商品代碼
quantity (int):      數量
entry_price (float): 進倉價格
cover_price (float): 平倉價格
pnl (float):         損益
currency (str):      幣別
direction (Action):  買賣別 {Buy: , Sell: }
tax (int):           交易稅
fee (int):           交易手續費

ProfitLossTotal

entry_amount (float): 進倉總金額
cover_amount (float): 平倉總金額
quantity (int):       總數量
buy_cost (float):     付出總成本
sell_cost (float):    賣出總收入
pnl (float):          總損益
pr_ratio (float):     總損益比

In

api.list_profit_loss_summary(api.futopt_account, '2026-05-01', '2026-05-21')

Out

ProfitLossSummaryTotal(total=ProfitLossTotal(pnl=-750, pr_ratio=-3.79))

In

shioaji portfolio profit-loss-summary --account-type F --begin-date 2026-05-01 --end-date 2026-05-21

Out

profitloss_sum[1]{code,quantity,entry_price,cover_price,pnl,currency,direction,tax,fee}:
  "TXO20260620200C",3,131,126,-750,NTD,Buy,5,120
total:
  entry_amount: 19650
  cover_amount: 18900
  quantity: 3
  buy_cost: 19775
  sell_cost: 18775
  pnl: -750
  pr_ratio: -3.79

In

curl -X POST http://localhost:8080/api/v1/portfolio/profitloss_sum \
  -H 'Content-Type: application/json' \
  -d '{"account_type": "F", "begin_date": "2026-05-01", "end_date": "2026-05-21", "broker_id": "YOUR_BROKER_ID", "account_id": "YOUR_ACCOUNT_ID"}'

Out

{
  "profitloss_sum": [
    {
      "code": "TXO20260620200C",
      "quantity": 3,
      "entry_price": 131.0,
      "cover_price": 126.0,
      "pnl": -750.0,
      "currency": "NTD",
      "direction": "Buy",
      "tax": 5,
      "fee": 120
    }
  ],
  "total": {
    "entry_amount": 19650.0,
    "cover_amount": 18900.0,
    "quantity": 3,
    "buy_cost": 19775.0,
    "sell_cost": 18775.0,
    "pnl": -750.0,
    "pr_ratio": -3.79
  }
}