Example 1:利用買賣家數在籌碼集中時進場

input
dic={}
for symbol in ['0050','2330']:
    #拿資料級
    df1=api.Data.get('還原日K價量資料(個股、ETF、大盤)-單檔股票多個區間',symbol) 
    df2=api.Data.get('籌碼集中渙散/主力買賣超-單檔股票多個區間',symbol) 
    df1x=df1.set_index('日期')[['開盤價','收盤價']]
    df2x=df2.set_index('日期')[['家數差']]
    df=df1x.sort_index().join(df2x)
    buy= (df['家數差']<0)&(df['家數差']==df['家數差'].rolling(20).min())
    df.loc[buy[buy==True].index,'sig']=True
    df['qty']=1000
    df=df.reset_index()
    dic[symbol] =df

rp = api.backtest(dic, 
    date='日期' ,qty='qty', 
    sig_value='收盤價' ,open_value='開盤價' ,close_value='開盤價',
    longsig='sig' ,moveloss=10 )

Example 2:根據收盤價及ma5、ma10設定進出場

input
dic={} 
for symbol in ['0050','2330']:
    #拿資料級  
    df=api.Data.get('還原日K價量資料(個股、ETF、大盤)-單檔股票多個區間',symbol)  
    df=df.set_index('日期')[['開盤價','收盤價']]  
    ma5 = df['收盤價'].rolling(5).mean()  
    ma10 = df['收盤價'].rolling(10).mean()  
    buy = (df['收盤價']>ma5) &(ma5>ma10)  
    sell = (df['收盤價']<ma5) &(ma5<ma10) 
    df.loc[buy[buy==True].index,'sig']=True 
    df.loc[sell[sell==True].index,'sigout']=True 
    df['qty']=1000 
    df=df.reset_index() 
    dic[symbol] =df 

rp = api.backtest(dic,  
	date='日期' ,qty='qty', sig_value='收盤價' ,open_value='開盤價' 
	,close_value='開盤價', longsig='sig' ,longout='sigout' )

提供一系列方法展示對應數據。

Attribute

參數 資料型態 說明
data dict(symbol:DataFrame) or DataFrame 為資料本體,需為dataframe 或可為 dataframe 組成的dic
date str dataframe中代表"日期"欄位的column名稱。
symbol str 指定在 DataFrame 中代表"股票代號"欄位的列名。如data為字典,則使用字典的鍵作為 `symbol`。
sig_value str 設定用做停利停損判斷對象的"標準價"的column名稱,為必填欄位。
open_value str 設定"進場價"的column名稱,如果沒設定將使用sig_value設定的欄位名稱。
open_shift bool 默認為True,會在滿足信號後的下一根K棒執行進場;若為False,則在當根執行。
close_value str 設定"出場價"的column名稱,如果沒設定將使用sig_value設定的欄位名稱。
close_shift bool 默認為True,會在滿足信號後的下一根K棒執行出場;若為False,則在當根執行。
longsig str 做多方向的"進場信號"的column名稱,longsig和shortsig至少需設定一個;值為True代表進場,False為出場,nan不進行任何行爲。
longout str 做多方向的"出場信號"的column名稱,為longsig的補充欄位,非必填。值為True時代表出場。longsig和longout同時為True,依舊表示為出場。
shortsig str 做空方向的"進場信號"的column名稱,longsig和shortsig至少需設定一個。值為True代表進場,False為出場,nan不進行任何行爲。
shortout str 做空方向的"出場信號"的column名稱,為shortsig的補充欄位,非必填。值為True時代表出場。shortsig和shortout同時為True,依舊表示為出場。
qty int 設定"股數"的column名稱,為必填欄位。
tax float 交易稅率,默認為None將使用台灣交易規則的默認設置。默認規則為一般股票0.003、ETF為0.001、股票當沖0.0015-例如,設定為0.0005,在做多出場發生交易稅5bp,在做空時進場發生交易稅5bp。
美股需自行設定。
fee float 手續費率,用於計算進場和出場時的手續費,如不填寫為0.00025。-例如,設定為0.00125,代表進場及出場各會發生手續費12.5bp。
earn float 停利比率,表示當收益達到該比率時觸發停利。-例如,設定為 20 則代表停利為 20%。如果未指定,則不設定停利條件。
loss float 停損比率,表示當虧損達到該比率時觸發停損。
-例如,設定為 20 則代表停損為 20%。如果未指定,則不設定停損條件。
slippage float 滑點率,指在進場及出場時可能發生的往不利價格方向的變動量,默認為0。-例如,設定為0.001,代表進場及出場各會滑點10bp。
moveloss float 設定"移動停利",計算邏輯是用進場後設定的sig_value的最大值與進場價格計算。
若未設定數值,則不啟用移動停損條件
例如:
多方,moveloss=10:
移動止損=max(進場後的sig_value1 ,sig_value2 ,.... ,sig_valueN) * (1-0.01 * moveloss)
當 sig_valueN < 移動止損,觸發離場信號。

空方,moveloss=10:
移動止損=min(進場後的sig_value1 ,sig_value2 ,.... ,sig_valueN) * (1+0.01 * moveloss)
當 sig_valueN > 移動止損,觸發離場信號。
max_hold float 最大持有天數,表示持股的最大天數限制。
continuous_wins tuple or list 連勝N次後,交易量增為M倍的設置。-例如,設定為 (3, 2) 表示連勝3次後,交易量變為原來的2倍。如果未指定,則不調整交易量。
force_exit int 將列表裡的已持有股票在最後一根Kbar強制進行出場。
benchmark Series -對標價格,index需為日期,避免因日期錯誤產生誤差。
messages bool 是否顯示回測產出過程中的信息,默認為True。
_maxtrades int 最大交易次數,若未設定則默認為10000次。
可自行設定此參數值。

Return Attribute

將返回一個物件,封装了回測分析結果,並可使用以下方法展示對應數據。

方法 說明
dashboard 本次策略總績效報告儀錶板。
trade 交易明細。
position 每日持倉。
daily 每日帳戶損益。
report 策略績效報告。
plotly 顯示績效圖表。
save 將結果儲存在本地位置。