將多個 DataFrame(以 dataframes 傳入)依證券代碼拆分,整理成字典格式,方便後續個股逐筆處理。同時過濾掉停牌日期的資料,並附加調整後的開盤與收盤價格。
轉成符合backtest的數據格式
adjclose = api.MSMP.日_K.adj_Close
con1 = adjclose >100
con2 = api.MSMP.月_營收.YoY >10
con3 = adjclose>adjclose.rolling(5).mean()
con4 = adjclose.shift(1)<adjclose.shift(1).rolling(5).mean()
pos = con1&con2&con3&con4
Open = api.MSMP.日_K.Open
qty = np.floor(1000000/(Open*1000))*1000
dic = api.MSMP.msmp_to_dic(['sig','qty'] ,pos ,qty)
dic['8054']
| date | id | sig | qty | adjclose | adjopen | adjhigh | adjlow | |
|---|---|---|---|---|---|---|---|---|
| 0 | 2022-03-21 | 8054 | False | 17000 | 51.1615 | 52.4521 | 53.0052 | 51.1615 |
| 1 | 2022-03-22 | 8054 | False | 18000 | 50.7006 | 51.0694 | 51.8990 | 50.5163 |
| 2 | 2022-03-23 | 8054 | False | 17000 | 55.7707 | 51.3459 | 55.7707 | 51.2537 |
| 3 | 2022-03-24 | 8054 | False | 16000 | 58.8127 | 54.8489 | 59.2736 | 53.8349 |
| 4 | 2022-03-25 | 8054 | False | 15000 | 54.2036 | 58.2596 | 58.3518 | 54.2036 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 995 | 2026-04-28 | 8054 | False | 9000 | 109.5000 | 107.5000 | 111 | 107 |
| 996 | 2026-04-29 | 8054 | False | 9000 | 107.5000 | 107.5000 | 110.5000 | 106.5000 |
| 997 | 2026-04-30 | 8054 | False | 9000 | 106 | 108 | 111 | 106 |
| 998 | 2026-05-04 | 8054 | False | 9000 | 106 | 107.5000 | 107.5000 | 103 |
| 999 | 2026-05-05 | 8054 | True | 9000 | 112 | 106.5000 | 112 | 106.5000 |
| 參數 | 資料型態 | 說明 |
|---|---|---|
| names | list | 對應每個dataframe的欄位名稱。例如:['sig', 'qty'] |
| dataframes | kgi.msmp.dataframe.ProboDataFrame | 多檔股票多個時間的資料表,index 是日期,columns 是股票代碼。可以放1個或多個。 |
| startday | object | 起始日,格式為YYYYMMDD |
以證券代碼(symbol)為鍵,對應值為該證券的 pandas.DataFrame
dic{symbol1:dataFrame1, symbol2:dataFrame2,….}
DataFrame 欄位說明:
| 欄位名稱 | 資料型態 | 說明 |
|---|---|---|
| date | datetime64 | 日期 |
| id | object | 股票代號 |
| sig | bool |
是longsig設定的欄位 值為True表示進場信號,False為出場信號 |
| qty | int | 進場時的進場股數 |
| adjclose | float | 調整後收盤價 |
| adjopen | float | 調整後開盤價 |
| adjhigh | float | 調整後最高價 |
| adjlow | float | 調整後最低價 |