Order函數是用於交易股票的函數,可以利用以下六種函數得出我們指定要交易的股票以及數量
Zipline有六種下單函數:¶
order():購買指定股數。
order_value():購買指定價值的股票。
order_percent():購買指定價值(整個投資組合價值(portfolio value)的一個特定比例)的股票。
order_target():交易直到該股票帳上總股數達到指定數量為止。
order_target_value():交易到帳上該股票價值達到指定價值為止。
order_target_percent():將股票在投資組合的比重調整到指定的比例。
本篇將會介紹
order()
以及order_target()
的使用辦法。¶
本文件包含以下四個部份:
閱讀本篇之後可以搭配閱讀:¶
使用前記得先做 import:from zipline.api import order, order_target
或from zipline.api import *
。
asset:zipline.assets.Asset,為該股票的Asset
物件(zipline.assets.Asset
,例如:Equity(0 [1101]),透過symbol("1101")
可將 symbol 轉成Asset
物件)。
amount/value/target/percent:數量、價值、目標、比重,依照每個下單函數各有不同,但一律正值代表 long(buy or cover),而負值代表 short(sell or short)。
limit_price:float, optional
限價。
代表最高的買進價(或最低的賣出價)。
預設為 None。
# 以order為例,其它下單函數概念一樣。
from zipline.api import order
order(asset, amount, limit_price=limit_price)
stop_price:float, optional
止損價。
若為買單,當市價 >= stop price,則用市價買入(若是賣單,則是在市價 <= stop price 後用市價賣出)。
預設為 None。
# 以order為例,其它下單函數概念一樣。
from zipline.api import order
order(asset, amount, stop_price=stop_price)
style:zipline.finance.execution.ExecutionStyle
預設為 None。
設定限價及止損價。如果limit_price
或stop_price
已經提供了,就不能使用這個參數。
# 以order為例,其下單函數概念一樣。
from zipline.finance.execution import LimitOrder, StopOrder, StopLimitOrder
from zipline.api import order
# Limit order:
order(asset, amount, style=LimitOrder(limit_price))
# Stop order:
order(asset, amount, style=StopOrder(stop_price))
# StopLimit order:
order(asset, amount, style=StopLimitOrder(limit_price, stop_price))
order_id:str or None,每張訂單獨一無二的 16 進制編碼。
stop_price
及limit_price
皆是和下一個交易日的收盤價做比較。stop_price
及limit_price
會在除權日進行調整。stop_price
及limit_price
都是原本數值乘以 ratio(也就是僅除權的調整係數) 並 round 到小數以下第二位。(僅除權的調整係數使用 TEJ API 的 TWN/APIPRCD(交易資料-股價資料)中的 adjfac_a 欄位進行計算)handle_data
階段使用且不得在before_trading_start
階段使用。import pandas as pd
import numpy as np
import datetime
import tejapi
import time
import os
import warnings
warnings.filterwarnings('ignore')
# tej_key
tej_key ='your key'
tejapi.ApiConfig.api_key = tej_key
os.environ['TEJAPI_BASE'] = "https://api.tej.com.tw"
os.environ['TEJAPI_KEY'] = tej_key
# date
start='2018-07-24'
end='2018-08-14'
os.environ['mdate'] = '20180724 20180814'
tz = 'UTC'
start_dt, end_dt = pd.Timestamp(start, tz = tz), pd.Timestamp(end, tz = tz)
# calendar
calendar_name='TEJ'
# bundle_name
bundle_name = 'tquant'
os.environ['ticker'] = '1101 1102 IR0001'
!zipline ingest -b tquant
Merging daily equity files:
[2023-11-30 07:50:14.101796] INFO: zipline.data.bundles.core: Ingesting tquant.
from zipline.api import *
from zipline import run_algorithm
from zipline.finance import commission, slippage
from zipline.utils.calendar_utils import get_calendar
from zipline.utils.run_algo import get_transaction_detail
在回測開始時被調用的函數,進行初始化設定
這邊透過context參數來儲存和共享各種回測所需的變數和參數
context.tickers = ['1101']
定義一個股票代碼列表,這裡我們指定 1101 的股票資料。context.asset = [symbol(ticker) for ticker in context.tickers]
將股票代碼輸入進 context 中,並轉換為 Asset
物件。set_slippage(slippage.FixedSlippage(spread=0.00))
設定滑價模型,這裡使用的是固定滑價模型,價差為 0。方便觀察。set_commission(commission.PerDollar(cost=commission_cost))
設定交易費用模型,這裡設定一定比例的交易費用。set_benchmark(symbol('IR0001'))
設定benchmark,將benchmark設為代碼為 'IR0001' 的資產,即發行量加權股價報酬指數。def initialize(context):
context.tickers = ['1101']
context.asset = [symbol(ticker) for ticker in context.tickers]
set_slippage(slippage.FixedSlippage(spread=0.00))
set_commission(commission.PerDollar(cost=commission_cost))
set_benchmark(symbol('IR0001'))
def handle_data(context, data):
for asset in context.asset:
order(asset, 1000, limit_price = 45)
commission_cost = 0.001425 + 0.003 / 2
capital_base = 1e6
closing_price = tejapi.fastget('TWN/APIPRCD',
coid=['1101'],
opts={'columns':['mdate','coid','close_d']},
mdate={'gte':start_dt,'lte':end_dt },
paginate=True)
performance = run_algorithm(start=start_dt,
end=end_dt,
initialize=initialize,
handle_data=handle_data,
capital_base=capital_base,
trading_calendar=get_calendar(calendar_name),
bundle=bundle_name)
positions, transactions, orders = get_transaction_detail(performance)
closing_price[0:2]
mdate | coid | close_d | |
---|---|---|---|
0 | 2018-07-24 | 1101 | 45.5 |
1 | 2018-07-25 | 1101 | 45.1 |
# 7/24~7/25只有下單,沒有買入股票
orders.loc['2018-07-24':'2018-07-25']
sid | symbol | id | dt | reason | created | amount | filled | commission | stop | limit | stop_reached | limit_reached | asset | status | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2018-07-24 13:30:00+08:00 | 0 | 1101 | 7c5082ab4b254b7eae1a047dd1fbe859 | 2018-07-24 13:30:00+08:00 | None | 2018-07-24 13:30:00+08:00 | 1000 | 0 | 0.0 | None | 45.0 | False | False | Equity(0 [1101]) | 0 |
2018-07-25 13:30:00+08:00 | 0 | 1101 | 1c10829f4e49414c8a0ece983f70e6c7 | 2018-07-25 13:30:00+08:00 | None | 2018-07-25 13:30:00+08:00 | 1000 | 0 | 0.0 | None | 45.0 | False | False | Equity(0 [1101]) | 0 |
# 7/24~7/25沒有交易紀錄
transactions.loc['2018-07-24':'2018-07-25']
sid | symbol | amount | dt | price | order_id | asset | commission |
---|
2018/7/26是除權日,配發 10% 股票股利。ratio = 0.908945。
因為7/26的收盤價 40.5 <= 40.9,所以兩單都在7/26成交(status=1),下單量也都調整成了 1100(amount)。而且limit_reached在成交時也都變成了True。
但是7/26當天下的單(created = '2018-07-26'),limit_price 還是 45 沒有調整,amount 還是 1000。代表除權日後如果股價 <= 45(limit_price),則買進 1000 股。
closing_price[0:3]
mdate | coid | close_d | |
---|---|---|---|
0 | 2018-07-24 | 1101 | 45.5 |
1 | 2018-07-25 | 1101 | 45.1 |
2 | 2018-07-26 | 1101 | 40.5 |
orders.query('created.dt.strftime("%Y-%m-%d") in ["2018-07-24", "2018-07-25","2018-07-26"]')
sid | symbol | id | dt | reason | created | amount | filled | commission | stop | limit | stop_reached | limit_reached | asset | status | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2018-07-24 13:30:00+08:00 | 0 | 1101 | 7c5082ab4b254b7eae1a047dd1fbe859 | 2018-07-24 13:30:00+08:00 | None | 2018-07-24 13:30:00+08:00 | 1000 | 0 | 0.00000 | None | 45.0 | False | False | Equity(0 [1101]) | 0 |
2018-07-25 13:30:00+08:00 | 0 | 1101 | 1c10829f4e49414c8a0ece983f70e6c7 | 2018-07-25 13:30:00+08:00 | None | 2018-07-25 13:30:00+08:00 | 1000 | 0 | 0.00000 | None | 45.0 | False | False | Equity(0 [1101]) | 0 |
2018-07-26 13:30:00+08:00 | 0 | 1101 | 7c5082ab4b254b7eae1a047dd1fbe859 | 2018-07-26 13:30:00+08:00 | None | 2018-07-24 13:30:00+08:00 | 1100 | 1100 | 130.30875 | None | 40.9 | False | True | Equity(0 [1101]) | 1 |
2018-07-26 13:30:00+08:00 | 0 | 1101 | 1c10829f4e49414c8a0ece983f70e6c7 | 2018-07-26 13:30:00+08:00 | None | 2018-07-25 13:30:00+08:00 | 1100 | 1100 | 130.30875 | None | 40.9 | False | True | Equity(0 [1101]) | 1 |
2018-07-26 13:30:00+08:00 | 0 | 1101 | 3cd522d9281948798b443b5f0d204610 | 2018-07-26 13:30:00+08:00 | None | 2018-07-26 13:30:00+08:00 | 1000 | 0 | 0.00000 | None | 45.0 | False | False | Equity(0 [1101]) | 0 |
2018-07-27 13:30:00+08:00 | 0 | 1101 | 3cd522d9281948798b443b5f0d204610 | 2018-07-27 13:30:00+08:00 | None | 2018-07-26 13:30:00+08:00 | 1000 | 1000 | 117.87750 | None | 45.0 | False | True | Equity(0 [1101]) | 1 |
transactions.loc['2018-07-26']
sid | symbol | amount | dt | price | order_id | asset | commission | |
---|---|---|---|---|---|---|---|---|
2018-07-26 13:30:00+08:00 | 0 | 1101 | 1100 | 2018-07-26 13:30:00+08:00 | 40.5 | 7c5082ab4b254b7eae1a047dd1fbe859 | Equity(0 [1101]) | None |
2018-07-26 13:30:00+08:00 | 0 | 1101 | 1100 | 2018-07-26 13:30:00+08:00 | 40.5 | 1c10829f4e49414c8a0ece983f70e6c7 | Equity(0 [1101]) | None |
closing_price[3:4]
mdate | coid | close_d | |
---|---|---|---|
3 | 2018-07-27 | 1101 | 40.3 |
orders.query('created.dt.strftime("%Y-%m-%d") == "2018-07-26"')
sid | symbol | id | dt | reason | created | amount | filled | commission | stop | limit | stop_reached | limit_reached | asset | status | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2018-07-26 13:30:00+08:00 | 0 | 1101 | 3cd522d9281948798b443b5f0d204610 | 2018-07-26 13:30:00+08:00 | None | 2018-07-26 13:30:00+08:00 | 1000 | 0 | 0.0000 | None | 45.0 | False | False | Equity(0 [1101]) | 0 |
2018-07-27 13:30:00+08:00 | 0 | 1101 | 3cd522d9281948798b443b5f0d204610 | 2018-07-27 13:30:00+08:00 | None | 2018-07-26 13:30:00+08:00 | 1000 | 1000 | 117.8775 | None | 45.0 | False | True | Equity(0 [1101]) | 1 |
transactions.loc['2018-07-27']
sid | symbol | amount | dt | price | order_id | asset | commission | |
---|---|---|---|---|---|---|---|---|
2018-07-27 13:30:00+08:00 | 0 | 1101 | 1000 | 2018-07-27 13:30:00+08:00 | 40.3 | 3cd522d9281948798b443b5f0d204610 | Equity(0 [1101]) | None |
若原本 limit_price 設為 43.5,其餘條件不變,那7/24、7/25下的那兩單,要一直等到7/31股價 <= 43.5 * 0.908945 = 39.54 後,才會各以當天收盤價 39.35 及 1100 股成交。
closing_price[0:6]
mdate | coid | close_d | |
---|---|---|---|
0 | 2018-07-24 | 1101 | 45.50 |
1 | 2018-07-25 | 1101 | 45.10 |
2 | 2018-07-26 | 1101 | 40.50 |
3 | 2018-07-27 | 1101 | 40.30 |
4 | 2018-07-30 | 1101 | 40.70 |
5 | 2018-07-31 | 1101 | 39.35 |
def initialize(context):
context.tickers = ['1101']
context.asset = [symbol(ticker) for ticker in context.tickers]
set_slippage(slippage.FixedSlippage(spread=0.00))
set_commission(commission.PerDollar(cost=commission_cost))
set_benchmark(symbol('IR0001'))
def handle_data(context, data):
for asset in context.asset:
order(asset, 1000, stop_price = 43)
record(close=data.current(context.asset, 'close'))
performance = run_algorithm(start=start_dt,
end=end_dt,
initialize=initialize,
handle_data=handle_data,
capital_base=capital_base,
trading_calendar=get_calendar(calendar_name),
bundle=bundle_name)
positions, transactions, orders = get_transaction_detail(performance)
closing_price[0:2]
mdate | coid | close_d | |
---|---|---|---|
0 | 2018-07-24 | 1101 | 45.5 |
1 | 2018-07-25 | 1101 | 45.1 |
orders.query('created.dt.strftime("%Y-%m-%d") == "2018-07-24"')
sid | symbol | id | dt | reason | created | amount | filled | commission | stop | limit | stop_reached | limit_reached | asset | status | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2018-07-24 13:30:00+08:00 | 0 | 1101 | 9ab43e2f8af8492b8849fb2ba0d31f78 | 2018-07-24 13:30:00+08:00 | None | 2018-07-24 13:30:00+08:00 | 1000 | 0 | 0.0000 | 43.0 | None | False | False | Equity(0 [1101]) | 0 |
2018-07-25 13:30:00+08:00 | 0 | 1101 | 9ab43e2f8af8492b8849fb2ba0d31f78 | 2018-07-25 13:30:00+08:00 | None | 2018-07-24 13:30:00+08:00 | 1000 | 1000 | 131.9175 | 43.0 | None | True | False | Equity(0 [1101]) | 1 |
transactions.loc['2018-07-25']
sid | symbol | amount | dt | price | order_id | asset | commission | |
---|---|---|---|---|---|---|---|---|
2018-07-25 13:30:00+08:00 | 0 | 1101 | 1000 | 2018-07-25 13:30:00+08:00 | 45.1 | 9ab43e2f8af8492b8849fb2ba0d31f78 | Equity(0 [1101]) | None |
closing_price[2:3]
mdate | coid | close_d | |
---|---|---|---|
2 | 2018-07-26 | 1101 | 40.5 |
orders.query('created.dt.strftime("%Y-%m-%d") == "2018-07-25"')
sid | symbol | id | dt | reason | created | amount | filled | commission | stop | limit | stop_reached | limit_reached | asset | status | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2018-07-25 13:30:00+08:00 | 0 | 1101 | aeceec987b19442ebd37483fb5a6acab | 2018-07-25 13:30:00+08:00 | None | 2018-07-25 13:30:00+08:00 | 1000 | 0 | 0.00000 | 43.00 | None | False | False | Equity(0 [1101]) | 0 |
2018-07-26 13:30:00+08:00 | 0 | 1101 | aeceec987b19442ebd37483fb5a6acab | 2018-07-26 13:30:00+08:00 | None | 2018-07-25 13:30:00+08:00 | 1100 | 1100 | 130.30875 | 39.08 | None | True | False | Equity(0 [1101]) | 1 |
transactions.loc['2018-07-26']
sid | symbol | amount | dt | price | order_id | asset | commission | |
---|---|---|---|---|---|---|---|---|
2018-07-26 13:30:00+08:00 | 0 | 1101 | 1100 | 2018-07-26 13:30:00+08:00 | 40.5 | aeceec987b19442ebd37483fb5a6acab | Equity(0 [1101]) | None |
closing_price[3:]
mdate | coid | close_d | |
---|---|---|---|
3 | 2018-07-27 | 1101 | 40.30 |
4 | 2018-07-30 | 1101 | 40.70 |
5 | 2018-07-31 | 1101 | 39.35 |
6 | 2018-08-01 | 1101 | 41.05 |
7 | 2018-08-02 | 1101 | 40.60 |
8 | 2018-08-03 | 1101 | 40.45 |
9 | 2018-08-06 | 1101 | 40.35 |
10 | 2018-08-07 | 1101 | 40.15 |
11 | 2018-08-08 | 1101 | 40.60 |
12 | 2018-08-09 | 1101 | 40.50 |
13 | 2018-08-10 | 1101 | 41.50 |
14 | 2018-08-13 | 1101 | 42.15 |
15 | 2018-08-14 | 1101 | 43.30 |
positions
sid | symbol | asset | amount | cost_basis | last_sale_price | |
---|---|---|---|---|---|---|
2018-07-25 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 1000 | 45.231918 | 45.10 |
2018-07-26 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 2200 | 40.864231 | 40.50 |
2018-07-27 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 2200 | 40.864231 | 40.30 |
2018-07-30 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 2200 | 40.864231 | 40.70 |
2018-07-31 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 2200 | 40.864231 | 39.35 |
2018-08-01 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 2200 | 40.864231 | 41.05 |
2018-08-02 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 2200 | 40.864231 | 40.60 |
2018-08-03 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 2200 | 40.864231 | 40.45 |
2018-08-06 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 2200 | 40.864231 | 40.35 |
2018-08-07 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 2200 | 40.864231 | 40.15 |
2018-08-08 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 2200 | 40.864231 | 40.60 |
2018-08-09 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 2200 | 40.864231 | 40.50 |
2018-08-10 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 2200 | 40.864231 | 41.50 |
2018-08-13 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 2200 | 40.864231 | 42.15 |
2018-08-14 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 15200 | 43.055776 | 43.30 |
zipline.api.order_target(asset, target, limit_price=None, stop_price=None, style=None)
order_target
的概念和order
很像,差別是order_target
會透過買/賣讓帳上的股票數量達到指定的數量('target'),而不像order
直接買/賣該數量('amount')。if context.i == 0: # 2018-07-24
for asset in context.asset:
order(asset, 1000)
在回測的第一個時間點(context.i 為 0,2018-07-24),下單購買 1000 股的1101。
if context.i == 1: # 2018-07-25
for asset in context.asset:
order_target(asset, 1100)
在回測的第二個時間點(context.i 為 1,2018-07-25),對投資組合中的每檔股票進行調整,使其持有量達到 1100 股。
if context.i == 3: # 2018-07-27
for asset in context.asset:
order_target(asset, 2000)
在回測的第四個時間點(context.i 為 3,2018-07-27),對投資組合中的每檔股票進行調整,使其持有量達到 2000 股。
if context.i == 5: # 2018-07-31
for asset in context.asset:
order_target(asset, 3000, stop_price = 40, limit_price = 40.3)
在回測的第六個時間點(context.i 為 5,2018-07-31),對投資組合中的每檔股票進行調整,使其持有量達到 3000 股。此外,此訂單還設定了(stop_price)為 40 和(limit_price)為 40.3,代表當股價在 >= 40 及 <= 40.3 時才會進行交易。
record(close=data.current(context.asset, 'close'))
context.i += 1
記錄每檔股票的收盤價,並將 context.i
遞增 1,表示回測進入下一個時間點。
def initialize(context):
context.i = 0
context.tickers = ['1101']
context.asset = [symbol(ticker) for ticker in context.tickers]
set_slippage(slippage.FixedSlippage(spread=0.00))
set_commission(commission.PerDollar(cost=commission_cost))
set_benchmark(symbol('IR0001'))
def handle_data(context, data):
if context.i == 0: # 2018-07-24
for asset in context.asset:
order(asset, 1000)
if context.i == 1: # 2018-07-25
for asset in context.asset:
order_target(asset, 1100)
if context.i == 3: # 2018-07-27
for asset in context.asset:
order_target(asset, 2000)
if context.i == 5: # 2018-07-30
for asset in context.asset:
order_target(asset, 3000, stop_price = 40, limit_price = 40.3)
record(close=data.current(context.asset, 'close'))
context.i += 1
performance = run_algorithm(start=start_dt,
end=end_dt,
initialize=initialize,
handle_data=handle_data,
capital_base=capital_base,
trading_calendar=get_calendar(calendar_name),
bundle=bundle_name)
positions, transactions, orders = get_transaction_detail(performance)
orders.loc['2018-07-24':'2018-07-25']
sid | symbol | id | dt | reason | created | amount | filled | commission | stop | limit | stop_reached | limit_reached | asset | status | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2018-07-24 13:30:00+08:00 | 0 | 1101 | 820fc923a6ec4f85a374b399011c3d74 | 2018-07-24 13:30:00+08:00 | None | 2018-07-24 13:30:00+08:00 | 1000 | 0 | 0.0000 | None | None | False | False | Equity(0 [1101]) | 0 |
2018-07-25 13:30:00+08:00 | 0 | 1101 | 820fc923a6ec4f85a374b399011c3d74 | 2018-07-25 13:30:00+08:00 | None | 2018-07-24 13:30:00+08:00 | 1000 | 1000 | 131.9175 | None | None | False | False | Equity(0 [1101]) | 1 |
2018-07-25 13:30:00+08:00 | 0 | 1101 | dbc6e7a6a4474f46920d8008ac93dcdb | 2018-07-25 13:30:00+08:00 | None | 2018-07-25 13:30:00+08:00 | 100 | 0 | 0.0000 | None | None | False | False | Equity(0 [1101]) | 0 |
在下一個交易日(7/26)遇到除權日,ratio = 0.908945,所以7/25的單子amount會調整成 100 / 0.908945 = 110。
orders.query('created.dt.strftime("%Y-%m-%d") == "2018-07-25"')
sid | symbol | id | dt | reason | created | amount | filled | commission | stop | limit | stop_reached | limit_reached | asset | status | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2018-07-25 13:30:00+08:00 | 0 | 1101 | dbc6e7a6a4474f46920d8008ac93dcdb | 2018-07-25 13:30:00+08:00 | None | 2018-07-25 13:30:00+08:00 | 100 | 0 | 0.000000 | None | None | False | False | Equity(0 [1101]) | 0 |
2018-07-26 13:30:00+08:00 | 0 | 1101 | dbc6e7a6a4474f46920d8008ac93dcdb | 2018-07-26 13:30:00+08:00 | None | 2018-07-25 13:30:00+08:00 | 110 | 110 | 13.030875 | None | None | False | False | Equity(0 [1101]) | 1 |
原本帳上的 1000 股也在除權日調整成 1100 股,所以7/26收盤時手上共有 1100 + 110 = 1210 股。 不會是原先設定的 1100 股。
positions.loc['2018-07-25':'2018-07-26']
sid | symbol | asset | amount | cost_basis | last_sale_price | |
---|---|---|---|---|---|---|
2018-07-25 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 1000 | 45.231918 | 45.1 |
2018-07-26 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 1210 | 41.065315 | 40.5 |
在7/27時用 order_target 將手上股數調整成 2000,算出還需要 2000 - 1210 = 790股,下單後隔日成交。
orders.loc['2018-07-27':'2018-07-30']
sid | symbol | id | dt | reason | created | amount | filled | commission | stop | limit | stop_reached | limit_reached | asset | status | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2018-07-27 13:30:00+08:00 | 0 | 1101 | d08de58cacf9486ea3600687569cc154 | 2018-07-27 13:30:00+08:00 | None | 2018-07-27 13:30:00+08:00 | 790 | 0 | 0.000000 | None | None | False | False | Equity(0 [1101]) | 0 |
2018-07-30 13:30:00+08:00 | 0 | 1101 | d08de58cacf9486ea3600687569cc154 | 2018-07-30 13:30:00+08:00 | None | 2018-07-27 13:30:00+08:00 | 790 | 790 | 94.047525 | None | None | False | False | Equity(0 [1101]) | 1 |
positions[3:4]
sid | symbol | asset | amount | cost_basis | last_sale_price | |
---|---|---|---|---|---|---|
2018-07-30 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 2000 | 40.968039 | 40.7 |
在7/31時下單:order_target(asset, 3000, stop_price = 40, limit_price = 40.3)
# 下order_target(asset, 3000, stop_price = 40, limit_price = 40.3)
orders.loc['2018-07-31']
sid | symbol | id | dt | reason | created | amount | filled | commission | stop | limit | stop_reached | limit_reached | asset | status | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2018-07-31 13:30:00+08:00 | 0 | 1101 | a03305260c3d4760a7c586b5153970fb | 2018-07-31 13:30:00+08:00 | None | 2018-07-31 13:30:00+08:00 | 1000 | 0 | 0.0 | 40.0 | 40.3 | False | False | Equity(0 [1101]) | 0 |
# 8/1-8/6股價 > 40.3,8/7 <= 40.3
closing_price[4:11]
mdate | coid | close_d | |
---|---|---|---|
4 | 2018-07-30 | 1101 | 40.70 |
5 | 2018-07-31 | 1101 | 39.35 |
6 | 2018-08-01 | 1101 | 41.05 |
7 | 2018-08-02 | 1101 | 40.60 |
8 | 2018-08-03 | 1101 | 40.45 |
9 | 2018-08-06 | 1101 | 40.35 |
10 | 2018-08-07 | 1101 | 40.15 |
# 8/7成交
orders.loc['2018-08-07']
sid | symbol | id | dt | reason | created | amount | filled | commission | stop | limit | stop_reached | limit_reached | asset | status | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2018-08-07 13:30:00+08:00 | 0 | 1101 | a03305260c3d4760a7c586b5153970fb | 2018-08-07 13:30:00+08:00 | None | 2018-07-31 13:30:00+08:00 | 1000 | 1000 | 117.43875 | None | 40.3 | False | True | Equity(0 [1101]) | 1 |
# 8/7帳上由2000股->3000股
positions[4:10]
sid | symbol | asset | amount | cost_basis | last_sale_price | |
---|---|---|---|---|---|---|
2018-07-31 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 2000 | 40.968039 | 39.35 |
2018-08-01 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 2000 | 40.968039 | 41.05 |
2018-08-02 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 2000 | 40.968039 | 40.60 |
2018-08-03 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 2000 | 40.968039 | 40.45 |
2018-08-06 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 2000 | 40.968039 | 40.35 |
2018-08-07 13:30:00+08:00 | 0 | 1101 | Equity(0 [1101]) | 3000 | 40.734506 | 40.15 |