finlab.online
finlab.online.base_account.Account
Bases: ABC
股票帳戶的 abstract class 可以繼承此 Account,來實做券商的帳戶買賣動作,目前已經實做 SinopacAccount (永豐證券) 以及 FugleAccount (玉山富果),來進行交易。可以用以下方式建構物件並用來交易:
永豐證券
import os
from finlab.online.sinopac_account import SinopacAccount
# 舊版請使用
# shioaji < 1.0.0 and finlab < 0.3.18
os.environ['SHIOAJI_ACCOUNT']= '永豐證券帳號'
os.environ['SHIOAJI_PASSWORD']= '永豐證券密碼'
# 新版請使用
# shioaji >= 1.0.0 and finlab >= 0.3.18
os.environ['SHIOAJI_API_KEY'] = '永豐證券API_KEY'
os.environ['SHIOAJI_SECRET_KEY'] = '永豐證券SECRET_KEY'
os.environ['SHIOAJI_CERT_PERSON_ID']= '身份證字號'
# shioaji
os.environ['SHIOAJI_CERT_PATH']= '永豐證券憑證路徑'
os.environ['SHIOAJI_CERT_PASSWORD'] = '永豐證券憑證密碼' # 預設與身份證字號
acc = SinopacAccount()
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'
acc = FugleAccount()
cancel_order
abstractmethod
create_order
abstractmethod
產生新的委託單
PARAMETER | DESCRIPTION |
---|---|
action |
買賣方向,通常為 'BUY' 或是 'SELL'
TYPE:
|
stock_id |
股票代號 ex: '2330'
TYPE:
|
quantity |
委託股票的總數量(張數),允許小數點
TYPE:
|
price |
股票買賣的價格(限價單)
TYPE:
|
force |
是否用最差之價格(長跌停)強制成交? 當成交量足夠時,可以比較快成交,然而當成交量低時,容易有大的滑價
TYPE:
|
wait_for_best_price |
是否用最佳之價格(長跌停),無限時間等待?當今天要出場時,可以開啟等漲停價來購買,當今天要買入時,可以掛跌停價等待買入時機。
TYPE:
|
RETURNS | DESCRIPTION |
---|---|
str
|
order id 券商提供的委託單編號 |
get_orders
abstractmethod
拿到現在所有委託單
RETURNS | DESCRIPTION |
---|---|
Dict[str, Order]
|
所有委託單 id 與委託單資料 Example
|
get_stocks
abstractmethod
拿到現在股票報價
ATTRIBUTE | DESCRIPTION |
---|---|
stock_ids |
一次拿取所有股票的報價,ex: ['1101', '2330']
TYPE:
|
RETURNS | DESCRIPTION |
---|---|
dict
|
報價資料, Example
|
finlab.online.order_executor.Position
Position(stocks, weights=None, margin_trading=False, short_selling=False, day_trading_long=False, day_trading_short=False)
使用者可以利用 Position 輕鬆建構股票的部位,並且利用 OrderExecuter 將此部位同步於實際的股票帳戶。
建構股票部位
ATTRIBUTE | DESCRIPTION |
---|---|
stocks |
TYPE:
|
margin_trading |
做多部位是否使用融資
TYPE:
|
short_selling |
做空部位是否使用融券
TYPE:
|
day_trading_long |
做多部位為當沖先做多
TYPE:
|
day_trading_short |
做空部位為當沖先做空
TYPE:
|
Examples:
設計部位,持有一張和 100 股 1101
output將兩個部位相加
from finlab.online.order_executor import Position
p1 = Position({'1101': 1})
p2 = Position({'2330': 1})
p1 + p2
[
{'stock_id': '1101', 'quantity': 1.0, 'order_condition': <OrderCondition.CASH: 1>},
{'stock_id': '2330', 'quantity': 1.0, 'order_condition': <OrderCondition.CASH: 1>}
]
from_json
classmethod
Load a JSON file from the given path and convert it to a list of positions.
PARAMETER | DESCRIPTION |
---|---|
path |
The path to the JSON file.
TYPE:
|
RETURNS | DESCRIPTION |
---|---|
None |
from_list
classmethod
利用 dict
建構股票部位
from_report
classmethod
利用回測完的報告 finlab.report.Report
建構股票部位。
ATTRIBUTE | DESCRIPTION |
---|---|
report |
回測完的結果報告。
TYPE:
|
fund |
希望部屬的資金。
TYPE:
|
price |
股票代號對應到的價格,若無則使用最近個交易日的收盤價。
TYPE:
|
odd_lot |
是否考慮零股。預設為 False,只使用整張操作。
TYPE:
|
board_lot_size |
一張股票等於幾股。預設為1000,一張等於1000股。
TYPE:
|
allocation |
資產配置演算法選定,預設為
TYPE:
|
Example
from_weight
classmethod
from_weight(weights, fund, price=None, odd_lot=False, board_lot_size=1000, allocation=greedy_allocation, precision=None, **kwargs)
利用 weight
建構股票部位
ATTRIBUTE | DESCRIPTION |
---|---|
weights |
股票詳細部位
TYPE:
|
fund |
資金大小
TYPE:
|
price |
股票代號對應到的價格,若無則使用最近個交易日的收盤價。
TYPE:
|
odd_lot |
是否考慮零股
TYPE:
|
board_lot_size |
一張股票等於幾股
TYPE:
|
precision |
計算張數時的精度,預設為 None 代表依照 board_lot_size 而定,而 1 代表 0.1 張,2 代表 0.01 張,以此類推。
TYPE:
|
allocation |
資產配置演算法選定,預設為預設為
TYPE:
|
margin_trading |
做多部位是否使用融資
TYPE:
|
short_selling |
做空部位是否使用融券
TYPE:
|
day_trading_long |
做多部位為當沖先做多
TYPE:
|
day_trading_short |
做空部位為當沖先做空
TYPE:
|
Examples:
例如,用 100 萬的資金,全部投入,持有 1101 和 2330 各一半:
outputfinlab.online.order_executor.OrderExecutor
對比實際帳戶與欲部屬的股票部位,進行同步 Arguments: target_position (Position): 想要部屬的股票部位。 account (Account): 目前支援永豐與富果帳戶,請參考 Account 來實做。
create_orders
create_orders(market_order=False, best_price_limit=False, view_only=False, extra_bid_pct=0, progress=1, progress_precision=0)
產生委託單,將部位同步成 self.target_position 預設以該商品最後一筆成交價設定為限價來下單
ATTRIBUTE | DESCRIPTION |
---|---|
market_order |
以類市價盡量即刻成交:所有買單掛漲停價,所有賣單掛跌停價
TYPE:
|
best_price_limit |
掛芭樂價:所有買單掛跌停價,所有賣單掛漲停價
TYPE:
|
view_only |
預設為 False,會實際下單。若設為 True,不會下單,只會回傳欲執行的委託單資料(dict)
TYPE:
|
extra_bid_pct |
以該百分比值乘以價格進行追價下單,如設定為 0.05 時,將以當前價的 +(-)5% 的限價進買入(賣出),也就是更有機會可以成交,但是成交價格可能不理想; 假如設定為 -0.05 時,將以當前價的 -(+)5% 進行買入賣出,也就是限價單將不會立即成交,然而假如成交後,價格比較理想。參數有效範圍為 -0.1 到 0.1 內。
TYPE:
|
progress |
進度,預設為 1,即全部下單。若設定為 0.5,則只下一半的單。
TYPE:
|
progress_precision |
進度的精度,預設為 0,即只下整數張。若設定為 1,則下到 0.1 張。
TYPE:
|
execute_orders
execute_orders(orders, market_order=False, best_price_limit=False, view_only=False, extra_bid_pct=0, cancel_orders=True)
產生委託單,將部位同步成 self.target_position 預設以該商品最後一筆成交價設定為限價來下單
ATTRIBUTE | DESCRIPTION |
---|---|
orders |
欲下單的部位,通常是由
TYPE:
|
market_order |
以類市價盡量即刻成交:所有買單掛漲停價,所有賣單掛跌停價
TYPE:
|
best_price_limit |
掛芭樂價:所有買單掛跌停價,所有賣單掛漲停價
TYPE:
|
view_only |
預設為 False,會實際下單。若設為 True,不會下單,只會回傳欲執行的委託單資料(dict)
TYPE:
|
extra_bid_pct |
以該百分比值乘以價格進行追價下單,如設定為 0.05 時,將以當前價的 +(-)5% 的限價進買入(賣出),也就是更有機會可以成交,但是成交價格可能不理想; 假如設定為 -0.05 時,將以當前價的 -(+)5% 進行買入賣出,也就是限價單將不會立即成交,然而假如成交後,價格比較理想。參數有效範圍為 -0.1 到 0.1 內。
TYPE:
|
generate_orders
Generate orders based on the difference between target position and present position.
Returns: orders (dict): Orders to be executed.
finlab.online.base_account.Order
dataclass
Order status
委託單的狀態
ATTRIBUTE | DESCRIPTION |
---|---|
order_id |
委託單的 id,與券商 API 所提供的 id 一致
TYPE:
|
stock_id |
股票代號 ex: '2330'
TYPE:
|
action |
買賣方向,通常為 'BUY' 或是 'SELL'
TYPE:
|
price |
股票買賣的價格(限價單)
TYPE:
|
quantity |
委託股票的總數量(張數),允許小數點
TYPE:
|
filled_quantity |
以成交股票的數量(張數),允許小數點
TYPE:
|
status |
委託狀態,可以設定為:'NEW', 'PARTIALLY_FILLED', 'FILLED', 'CANCEL'
TYPE:
|
time |
委託時間
TYPE:
|
org_order |
券商所提供的委託物件格式
TYPE:
|