跳轉到

下單(多策略)

本指南適用於有明確交易策略的用戶,包括以下步驟:

  1. 執行交易策略
  2. 組合交易部位
  3. 計算股票張數
  4. 實際下單

此功能為BETA版

本功能目前已有上千萬的資金正在使用,但第一次使用時,請於盤後或盤前進行,避免在交易時段操作,以免發生非預期的錯誤。

1. 執行交易策略

在下一個交易日開盤前,首先需要執行策略並取得交易報告。以下介紹三種方式:

A. 使用 backtest.sim 進行回測

用戶可以根據 回測教學 撰寫自己的策略,並通過回測獲取報告:

from finlab import backtest

# 撰寫您的策略

report1 = backtest.sim(...)
report2 = backtest.sim(...)
說明:這種方式需要完整執行程式碼,可能會花費一些時間。

B. 下載平台上使用者的策略來獲得回測報告

用戶可以在平台上的 我的策略 中選擇想要下單的策略,記錄名稱後下載報告並下單:

from finlab.portfolio import create_report_from_cloud

report1 = create_report_from_cloud('NAME_OF_STRATEGY1')
report2 = create_report_from_cloud('NAME_OF_STRATEGY2')

C. 直接設定部位

適合已有持股並希望定期進行重新平衡的用戶:

from finlab.portfolio import create_multi_asset_report

report1 = create_multi_asset_report({'2330': 0.5, '1101': 0.5}, resample='Q')
report2 = create_multi_asset_report({'2330': 0.7, '1101': 0.3}, resample='M')
說明:resample 參數表示重新平衡的頻率,例如 Q 表示按季度重新平衡。

2. 組合交易部位

取得多個策略報告後,可以組合這些部位並評估績效:

from finlab.portfolio import Portfolio
port = Portfolio({
    'strategy1': (report1, 0.5),
    'strategy2': (report2, 0.5)
})
port.display()

此時程式會模擬這兩個部位的組合並計算出績效。如下圖所示: display

3. 計算股票張數

接下來,我們需要計算每檔股票投資的張數。使用 PortfolioSyncManager 可以達成以下目標:

  • 判斷是否需要更新部位
  • 在策略換股日,重新計算每檔股票的張數
  • 在每個交易日後,檢查是否需要停損或停利
  • 在換股時,確保在指定的金額 (total_balance) 內進行換股

創建 PortfolioSyncManager

用戶可以選擇以下方式之一來創建 PortfolioSyncManager:

from finlab.portfolio import PortfolioSyncManager

# 建立一個新的資料庫
pm = PortfolioSyncManager()
from finlab.portfolio import PortfolioSyncManager

# 從雲端取得原本的部位
pm = PortfolioSyncManager.from_cloud()
from finlab.portfolio import PortfolioSyncManager

# 從本地端取得原本的部位
pm = PortfolioSyncManager.from_local()

更新持股:

可以根據需求選擇不同的更新方式:

# 程式會在換股日當天,才會進行換股,所以第一次創建時,會是空的。
pm.update(port, total_balance=1000000)
# 零股交易
pm.update(port, total_balance=1000000, odd_lot=True)
# 融資、融券交易
pm.update(port, total_balance=1000000, margin_trading=True)

print(pm)
Estimate value 9633950

          quantity  price    weight  close_price    volume                    strategy            type
stock_id
1213          19.0  10.15  0.019055        10.15    69.948                       r2,r3  MARGIN_TRADING
1336           8.0  22.05  0.017430        22.05   270.865                    r5,r6,r7  MARGIN_TRADING
1441          12.0  14.70  0.017430        14.70    76.901                       r0,r8  MARGIN_TRADING
1468           8.0  14.60  0.011541        14.60    33.000                          r9  MARGIN_TRADING
1474           8.0  13.90  0.010987        13.90   113.962                          r1  MARGIN_TRADING
2496          15.0  73.50  0.108936        73.50    11.613     r0,r1,r2,r3,r4,r5,r8,r9  MARGIN_TRADING
3019           3.0  85.90  0.025463        85.90  5376.965                    r3,r4,r5  MARGIN_TRADING
3430           6.0  60.30  0.035749        60.30   300.173                 r4,r5,r6,r7  MARGIN_TRADING
3632          42.0  15.30  0.063494        15.30    15.637        r0,r1,r3,r4,r5,r6,r7  MARGIN_TRADING
4154          20.0  15.75  0.031125        15.75    57.116                 r4,r5,r6,r7  MARGIN_TRADING
4554           3.0  29.50  0.008745        29.50    43.018                          r8  MARGIN_TRADING
請每日執行 PortfolioSyncManager.update,以確保部位的正確性。

PortfolioSyncManager.update 控制參數

PortfolioSyncManager.update 有以下參數,請詳細閱讀確保您的部位更新正確:

portfolio (Portfolio or Report)

這是一個包含投資組合,這個計算股票同步帳戶的核心數據結構,所有股票張數運算都會參考 portfolio 進行。

total_balance (float)

總資產的浮點數值,表示投資者的整體資金狀況。這個數值包括所有現金和資產與股票的總和。

rebalance_safety_weight (float)

現金的權重,確保在以市價買賣資產時,新的策略組合的總價值不會超過原有的組合價值。這個參數是再平衡策略的一部分,用於計算賣出股票後,有多少比例需要轉換成現金。舉例來說,如果設定為20%,則賣出資產後,20%的資金將保留為現金,其餘部分將用於購買新的資產。這有助於管理投資風險和確保流動性。假如使用者使用限價交易,可以將此參數設定為 5%。

smooth_transition (bool)

此參數決定是否採用平滑過渡的方式進行投資組合更新。當新增或減少策略、以及更新權重時,如果設定為 True,投資組合不會立即變更,而是在每個策略的到期日進行更新。這樣可以避免頻繁的交易,減少交易成本,並有助於投資組合的穩定性。預設值為 True。

force_override_difference (bool)

此參數決定是否強制覆蓋現有的不同部位,假如當天不是換股日,而且沒有停損停利,程式還是會驗證當前部位,以及跟模擬部位是否一致(理論上應該一致,但現實上有可能因為資料延遲登載、使用者忘記執行策略、使用者在資料登載前執行策略,而導致稍有不同)。若此參數設定為 True,發現有差異時,則會強制按照新的策略進行調整,預設值為 False,以避免不必要的交易和潛在風險。

這些參數在進行投資組合同步和再平衡時非常重要,正確設定和理解這些參數可以幫助投資者實現更有效的資產管理和風險控制。

PortfolioSyncManager.update 實際案例分析

update 函數負責維持投資組合平衡,並在需要時依策略分配重新調整。以下為其工作原理。

步驟說明

  1. 識別需要更新的策略

    • 檢查哪些策略的下一個交易日已到或權重已變動。
    • 若啟用 smooth transition,只在下一個預定交易日才更新,避免立即變更。
  2. 檢查當前持倉

    • 比對目前持倉與策略報告;有差異則記錄警告,必要時強制更新。
  3. 計算資產價值和流動資金

    • 總資產價值:目前所有持倉的總和。
    • 流動資金:需重新調整的策略持倉價值 + 剩餘餘額。
    • 限制流動資金:不超過 total_balance × 策略權重總和。
    • 安全資金:流動資金的一個百分比(例如 20%)以維持穩定。
    • 可投資資金:流動資金扣除安全資金。
  4. 更新各策略的持倉

    • 依策略權重與可投資資金分配資金。
    • 舊持倉清算、新持倉建立;同時出現在新舊持倉中的股票保留。
    • 觸發停損停利的股票直接歸零,不影響整體再平衡。
  5. 保存更新後的投資組合

    • 依初始設定存至本地或雲端。

示例情境

  • 初始設置:策略 A、B,各 50% 權重。
  • 當前價值:總淨值 $1,000,000。策略 A = $300,000(因停損清倉而降低),策略 B = $600,000(因上漲而提高)。
  • 重新調整條件:策略 B 明天換股日,A 不是。

更新過程

  1. 識別到策略 B 需更新。
  2. 流動資金:$600,000 + $100,000 剩餘 = $700,000,限制為 $500,000(50% 權重)。
  3. 安全資金:$500,000 × 20% = $100,000。
  4. 可投資資金:$500,000 - $100,000 = $400,000。
  5. 閒置資金 $200,000 大於安全資金 $100,000,不需保留安全資金,可投資資金改為 $500,000。
  6. 清算策略 B 原 $600,000 持倉,按策略重新買入 $500,000。
  7. 策略 A 中觸發停損停利的股票歸零,不影響 B 的再平衡。

新增移除策略

當您每天使用 pm.update 時,可以丟入不同的策略,不同的參數,來進行不同的操作,不論如何,它就是會用最合理的方式,完成您的部位更新。 當你想要馬上切換策略,不想要等待換股日才切換,可以設定 pm.update(..., smooth_transition=False)

儲存部位:

可以用以下方式來儲存部位:

pm.to_cloud()
pm.to_local()

自動化設計腳本

第一次請先創建部位:

# 初始化 PortfolioSyncManager
pm = PortfolioSyncManager()
pm.to_local()

之後可以每天自動化執行:

# 初始化 PortfolioSyncManager
pm = PortfolioSyncManager.from_local()

# 相關操作
# pm.update(...)

# 保存最後的操作結果
pm.to_local()

4. 實際下單

目前支援 玉山證券永豐證券元富證券 以及 富邦證券 的下單系統,可以先將帳號密碼設定成環境變數,只要針對您需要的券商來設定即可,不需要多個券商同時串接。

選擇您的券商

from finlab.online.esun_account import EsunAccount
import os
os.environ['ESUN_CONFIG_PATH'] = '玉山證券交易設定檔(config.ini.example)路徑'
os.environ['ESUN_MARKET_API_KEY'] = '玉山證券的行情API Token'
os.environ['ESUN_ACCOUNT_PASSWORD'] = '玉山證券的帳號密碼'
os.environ['ESUN_CERT_PASSWORD'] = '玉山證券的憑證密碼'

account = EsunAccount()
舊版 Fugle 環境變數(仍可使用)
from finlab.online.fugle_account import FugleAccount
import os
os.environ['FUGLE_CONFIG_PATH'] = '玉山證券交易設定檔(config.ini.example)路徑'
os.environ['FUGLE_MARKET_API_KEY'] = '玉山證券的行情API Token'
os.environ['FUGLE_ACCOUNT_PASSWORD'] = '玉山證券的帳號密碼'
os.environ['FUGLE_CERT_PASSWORD'] = '玉山證券的憑證密碼'

account = FugleAccount()

假如使用中下單出現錯誤代碼,可以到玉山證券文件 來查找原因。假如對於 Finlab Package 下單不熟習,建議也可以先按照券商的教學來練習,假如串接成功,則 FinLab Package 的串接也就是如法炮製的設定囉!

  • 請先獲取憑證

    • Windows 憑證下載方式
    • MacOS 憑證下載:目前永豐雖支援 MacOS 下單,但並不支援用 MacOS 獲取憑證,可以先找一台 Windows 作業系統,並且使用上述方法獲取憑證後,再將憑證於 MacOS 來使用。

import os
from finlab.online.sinopac_account import SinopacAccount

os.environ['SHIOAJI_API_KEY'] = '永豐證券API_KEY'
os.environ['SHIOAJI_SECRET_KEY'] = '永豐證券SECRET_KEY'
os.environ['SHIOAJI_CERT_PERSON_ID']= '身份證字號'
os.environ['SHIOAJI_CERT_PATH']= '永豐證券憑證路徑'
os.environ['SHIOAJI_CERT_PASSWORD'] = '永豐證券憑證密碼' # 預設與身份證字號

account = SinopacAccount()
假如對於 Finlab Package 下單不熟習,建議也可以先按照 券商的教學 來練習,假如串接成功,則 FinLab Package 的串接就會非常簡單囉!

請參考元富證券的教學 來獲取憑證,並且將憑證放在相對應的路徑之中,並且安裝相對應的套件後,即可執行:

import os
from finlab.online.masterlink_account import MasterlinkAccount

os.environ['MASTERLINK_NATIONAL_ID'] = '身分證字號'
os.environ['MASTERLINK_ACCOUNT'] = '交易帳號'
os.environ['MASTERLINK_ACCOUNT_PASS'] = '密碼'
os.environ['MASTERLINK_CERT_PATH'] = '元富證券憑證路徑'
os.environ['MASTERLINK_CERT_PASS'] = '元富證券憑證密碼' # 預設與身分證字號

account = MasterlinkAccount()

即可完成設定!

請參考富邦證券的教學 來獲取憑證,並且將憑證放在相對應的路徑之中,並且安裝相對應的套件後,即可執行:

import os
from finlab.online.fubon_account import FubonAccount

# 設定環境變數
import os

os.environ['FUBON_NATIONAL_ID'] = "A123456789"
os.environ['FUBON_ACCOUNT_PASS'] = "your_password"
os.environ['FUBON_CERT_PATH'] = "/path/to/cert.pfx"


account = FubonAccount()

即可完成設定!

批次下單,與股票帳戶同步:

# 不會真的下單,模擬而已
pm.sync(account, view_only=True)
# 預設使用最近一筆成交價當成限價
pm.sync(account)
# 漲停買入,跌停賣出,針對流動性高的個股較適合
pm.sync(account, market_order=True)
# 以優勢 1% 限價下單 (較容易成交)
pm.sync(account, extra_bid_pct=0.01)
# 比劣勢 1% 限價掛單(較不容易成交)
pm.sync(account, extra_bid_pct=-0.01)

其他操作

更新限價

order_executor = pm.create_order_executor(account)
order_executor.update_order_price()

刪除所有委託單

order_executor.cancel_orders()

若下單部位含有「 全額交割股」、「處置股」、「警示股」,需先於證券帳戶圈存。參考富果圈存永豐圈存方式。