請問回測能做到跌破起漲停損或移動停利嗎

  •   745 
  • 最後發表   FrankLi  2020 十一月 17
FrankLi 發文於   2020/10/15

您好, 

回測時後端執行邏輯還是不太確定, 有些問題想再請教一下,

本來以為回測能做到跌破起漲或移動停利出場, 但看起來..好像不行 Orz...

 

如下圖:

Q1. 自己看Log, 你們好像是ABC區三個腳本各自獨立跑完後, 然後匯整合併資料,

再依D區的條件, 去算進出場點和損益, 對嗎?

Q2. ABC三個腳本執行時, 有順序性嗎? 假設A->B-C依序跑,

   C能否得知A或B在當期是否 ret=1 成立呢?

Q3. 若Q2沒辦法, 那C出場腳本, 是否至少能得知, 【目前是否持有該股中】?

-----------------------------

Q4. 你們有沒有提供像API取資料的接口付費模組?

以我自己來說, 其實真正需要的只有你們完善資料庫的資料,

自己爬蟲,整理,維護, 真的是太累人, 我寧可用買的, 

其他回測還輯,損益計算..等, 這個都自己寫就行了,

透過你們提供的界面做, 反而覺得有點痛苦, 

真的還是太陽春了點, 很多策略其實都做不到的, 

而且要做更細節的Debug也有困難, 

上來技術論壇問, 一來一回的真的會耗掉許多時間 QQ

 

 

排序方式: 標準 | 最新
FrankLi 發文於   2020/10/19

文章好像沉了

XQ小幫手 發文於   2020/10/19

FrankLI 您好

關於您提的這些問題,

我需要幫您詢問一下RD部門是怎麼設計的

(因為我雖然了解大部分的語法跟解BUG  但系統開發的是隔壁部門的= =)

請給我一點時間去做詢問

感謝您的體諒~~~

FrankLi 發文於   2020/10/19

好的~ 再麻煩您了~

謝謝!!

XQ小幫手 發文於   2020/10/21

FrankLI 您好

在回測情況下

順序基本上為

每檔股票先抓取數據(也就是A)

然後丟入B之中判斷是否觸發進場條件

如果進場了 那就開始每天算報酬率AND 是否觸發到出場條件出場

出場時會把該天的報酬率呈現出來

所以是ABC 沒錯

C是否能知道 B已經成立 <-----這個是可以的,你可以把進出場策略寫在同一個腳本

設定一個變數做紀錄

-----

不好意思,我們目前沒有單獨對於資料庫進行販售 

感謝您的詢問

FrankLi 發文於   2020/10/21

您好, 

其實我之前想的和實作的, 應該跟小幫手說的差不多,

把A選到的股, 丟進B判斷, 然後BC是跑同一份腳本沒錯,

不過呢~實際執行結果和Log印出的, 好像不是這樣.

 

做策略回測時的資料切齊,

(1)若有用B進場腳本,BC腳本的close[0]是當日K棒,A腳本的close[0]則是昨日K棒。

(2)若沒用B進場腳本,C腳本的close[0]是當日K棒,A腳本的close[0]也是當日K棒。

 

我是第(1)種情況,

那先假設我的A選股腳本: 營收YoY需>10%,

BC同份腳本: 會在突破60日季線時進場, 並記錄進場價, 然後移動停利出場.

然後碰到以下幾個問題

 

第1個問題是:

   我發現,就算A明明沒有選出該股,但B腳本因突破季線,變數就記錄為進場並設Ret=1,

   B區警示腳本在執行過程中,其實跟本不知A到底有沒有選出該股,

   當我的B警示腳本發現突破季線時,我不能直接下ret=1,

   而需多做一個判斷=> IF (昨天選股A選中了) THEN ret = 1;

   這樣進場點才會正確,然後再看UI那是勾選當期或下期進場.

 

第2個問題是:

   假設只勾同時進場1次,我原以為你們背後的邏輯是:

for 日期開始 to 日期結束 {
    A腳本取得上個交易日選股名單;
    foreach A腳本中選名單 {
        if 未持股 {
            if B腳本成立 then 進場;
        }
    }
    if 持股中 {
        計算該日淨值;
        if C腳本成立 then 出場並算損益;
    }
}

   但你可以試著都Print到同一份Log,

   依Log顯示順序(雖然實務上Log顯示順序也不一定代表實際執行順序),

   邏輯比較像是:   

for 日期開始 to 日期結束 {
    SeriesResultA = A腳本上個交易日所有中選的股票清單;
    SeriesResultB = B腳本結果;
    SeriesResultC = C腳本結果;
}
for 日期開始 to 日期結束 {
    foreach 中選名單SeriesResultA[DateOffset] {
        if 未持股 {
            if SeriesResultB[DateOffset]成立 then 進場;
        }               
    }
    if 持股中 {
        計算該日淨值;
        if SeriesResultC[DateOffset]成立 then 出場並算損益;
    }
}

   有點像是拆成二段For迴圈來做的,因此我才會提出最上面Q1的問題,

   這二種邏輯,在B腳本裡有存變數的話,做出來的結果會不同。

 

第3個問題:

   BC是同份腳本同份Log情況下,同Date同Symbol,

   會在Log中印出了超過2次以上,這樣就蠻怪了,

   我用日線頻率且沒有勾逐筆洗價,邏輯上Log只會印出0~2次,而不會超過2次,

   超過代表BC腳本在同1根K,有人重覆跑。

 

第4個(不算問題): 

我看Log感覺,BC雖是同一份腳本, 邏輯可以共用(因此可知進場點),

        但變數無法真的共用,他們在記憶體中仍是不同的二個變數,對吧?

 

------

不好意思, 問了很多RD相關的問題,

但對背後的執行邏輯仍然沒弄懂的情況下,

有點不知道怎麼繼續寫下去Orz..

再麻煩您協助確認了

 

 

FrankLi 發文於   2020/10/26

又過了一週,請問這題有結果嗎,

沒有回覆,真的不知道到底是不是正在處理中...

XQ小幫手 發文於   2020/10/27

FrankLI 您好

相關問題有幫您做詢問了

待整理後會在說明給您聽 

感謝 

 

FrankLi 發文於   2020/10/27

感謝,但還是希望能盡快,

等待而無法動作的每一天,

付費模組都是在收費的 Q.Q

XQ小幫手 發文於   2020/10/28

問題一

我們寫一個簡單的選股腳本跟進場策略作範例 

選股

If Symbol = "2330.TW" then

ret=1;

 

策略

if close>0 then ret=1;

我們選股指定台積電 這檔股票 

但丟到回測內 他依然是會把所有股票都拿去跑的

=>因為回測是先跑"選股" (挑出選股選出的股票 2330)

=>然後拿挑出的東西再跑雷達 所以只有台積電會觸發進場 其他的股票都不會

(以下附上選股的回測報告)

-----

所以並不用指定股票,如果沒被選股選到的股票 他是不會觸發策略進場的

附加文件

FrankLi 發文於   2020/10/28

呃, 小幫手誤會我的問題點了,

我知道系統的進場點沒有問題,

問題是策略腳本中若有一個變數, 

要記錄進場點, 這個記錄的點會有問題,

因為我要做的是跑同一腳本實作移動停利,

所以只能在變數記錄.

varable: IsEntry(0);

if close>0 then
begin
    IsEntry = 1; //在這裡變數已記錄為進場, 
    ret=1;       //ret=1,不代表系統會進場,因為你們會看選股選中才進場
end;

 

若要正確記錄,應該要是:

varable: IsEntry(0);

if close>0 then
begin
    if(選股腳本選中) then IsEntry = 1; //這樣才會跟你們系統進場點一致
    ret=1;
end;

 

顯示更多回應 發表回覆
Close