策略開發10分鐘上手
1.安裝套件¶
In [22]:
Copied!
!pip install finlab > log.txt
!pip install finlab > log.txt
2.取得資料¶
2-1.時間序列¶
In [ ]:
Copied!
from finlab import data
pb = data.get('price_earning_ratio:股價淨值比')
close = data.get('price:收盤價')
close.iloc[:5,:5]
from finlab import data
pb = data.get('price_earning_ratio:股價淨值比')
close = data.get('price:收盤價')
close.iloc[:5,:5]
輸入成功!
INFO:finlab.data:price_earning_ratio:股價淨值比 -- Daily data usage: 434.0 / 5000 MB INFO:finlab.data:price:收盤價 -- Daily data usage: 455.0 / 5000 MB
Out[ ]:
0015 | 0050 | 0051 | 0052 | 0053 | |
---|---|---|---|---|---|
date | |||||
2007-04-23 | 9.54 | 57.85 | 32.83 | 38.40 | NaN |
2007-04-24 | 9.54 | 58.10 | 32.99 | 38.65 | NaN |
2007-04-25 | 9.52 | 57.60 | 32.80 | 38.59 | NaN |
2007-04-26 | 9.59 | 57.70 | 32.80 | 38.60 | NaN |
2007-04-27 | 9.55 | 57.50 | 32.72 | 38.40 | NaN |
2-2.非時間序列¶
In [ ]:
Copied!
company_basic_info = data.get('company_basic_info')
company_basic_info.head(3)
company_basic_info = data.get('company_basic_info')
company_basic_info.head(3)
Out[ ]:
stock_id | 公司名稱 | 產業類別 | 外國企業註冊地國 | 住址 | 營利事業統一編號 | 董事長 | 總經理 | 發言人 | 發言人職稱 | ... | 公司網址 | 投資人關係聯絡人 | 投資人關係聯絡人職稱 | 投資人關係聯絡電話 | 投資人關係聯絡電子郵件 | 公司網站內利害關係人專區網址 | 市場別 | 上櫃日期 | 興櫃日期 | 公司簡稱 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1101 | 台灣水泥股份有限公司 | 水泥工業 | - | 台北市中山北路2段113號 | 11913502 | 張安平 | 李鐘培 | 黃健強 | 資深副總經理 | ... | http://www.taiwancement.com | 張佳琪 | 主任 | 02-25317099分機20358 | [email protected] | http://www.taiwancement.com/tw/csr/csr5-1.html | sii | nan | nan | 台泥 |
1 | 1102 | 亞洲水泥股份有限公司 | 水泥工業 | - | 台北市大安區敦化南路2段207號30、31樓 | 03244509 | 徐旭東 | 李坤炎 | 周維崑 | 副總經理 | ... | www.acc.com.tw | 陳韋仲 | 投資人關係副經理 | 02 27338000 ext.8336 | [email protected] | http://www.acc.com.tw/tw/stakeholder/stakehold... | sii | nan | nan | 亞泥 |
2 | 1103 | 嘉新水泥股份有限公司 | 水泥工業 | - | 台北市中山北路2段96號 | 11892801 | 張剛綸 | 祁士鉅 | 王立心 | 執行副總經理 | ... | www.chcgroup.com.tw | 王立心 | 執行副總經理 | (02)2551-5211#243 | [email protected] | www.chcgroup.com.tw/index.php?route=system/sys... | sii | nan | nan | 嘉泥 |
3 rows × 42 columns
3.撰寫策略¶
3-1.策略條件¶
價格 > 20 日均線入場, 價格 < 60 日均線出場,最多持有10檔,超過 10 個進場訊號,則以股價淨值比小的股票優先選入。
3-2.hold_until function¶
這大概是所有策略撰寫中,最重要的語法糖,上述語法中 entries 為進場訊號,而 exits 是出場訊號。所以 entries.hold_until(exits) ,就是進場訊號為 True 時,買入並持有該檔股票,直到出場訊號為 True 則賣出。
此函式有很多細部設定,可以讓你最多選擇 N 檔股票做輪動。另外,當超過 N 檔進場訊號發生,也可以按照客制化的排序,選擇優先選入的股票。最後,可以持外設定停損停利,來增加出場的時機點。以下是 hold_until 的參數說明:
- exit (pd.Dataframe): 出場訊號。
- nstocks_limit (int): 持有檔數上限。
- stop_loss (float): 停損基準。範例:0.1,代表成本價下跌 10% 時出場。
- take_profit (float): 停利基準。範例:0.1,代表成本價上漲 10% 時出場。
- trade_at (str): 停損停利參考價。可選 close 或 open。
- rank (pd.Dataframe): 當天進場訊號超過 nstocks_limit 時,以 rank 數字越大的股票優先進場。
In [23]:
Copied!
from finlab import data
from finlab.backtest import sim
close = data.get('price:收盤價')
pb = data.get('price_earning_ratio:股價淨值比')
sma20 = close.average(20)
sma60 = close.average(60)
entries = close > sma20
exits = close < sma60
position = entries.hold_until(exits, nstocks_limit=10, rank=-pb, take_profit=0.4)
backtest_report = sim(position, upload=False)
from finlab import data
from finlab.backtest import sim
close = data.get('price:收盤價')
pb = data.get('price_earning_ratio:股價淨值比')
sma20 = close.average(20)
sma60 = close.average(60)
entries = close > sma20
exits = close < sma60
position = entries.hold_until(exits, nstocks_limit=10, rank=-pb, take_profit=0.4)
backtest_report = sim(position, upload=False)
4.回測¶
4-1.顯示策略回測結果¶
In [24]:
Copied!
from finlab.backtest import sim
backtest_report = sim(position,upload=False)
# 新增對標的指數,你的策略能贏大盤嗎?
backtest_report.benchmark = data.get('benchmark_return:發行量加權股價報酬指數').squeeze()
backtest_report.display()
from finlab.backtest import sim
backtest_report = sim(position,upload=False)
# 新增對標的指數,你的策略能贏大盤嗎?
backtest_report.benchmark = data.get('benchmark_return:發行量加權股價報酬指數').squeeze()
backtest_report.display()