特定日期區間內計算類股在這段區間內的成交比重以及比重差

  •   456 
  • 最後發表   師哥  2024 八月 02
師哥 發文於   2024/07/27

我想要在比較類股在特定日期區間內的漲跌幅,同時去計算這個時段區間內佔大盤的成交比重是多少,以及這個成交比重相較於過去20日的成交比重,是量增或是量縮。特定日期漲跌幅的語法我知道了,但是不知道"時段區間內佔大盤的成交比重"、"成交比重相較於過去20日的成交比重,是量增或是量縮"的語法該如何寫。

先謝謝了

以下是區間漲跌幅的語法

input:startday(20150702,"區間起始日");

input:endday(20151002,"區間結束日");

input:ratio(10,"最低漲幅");

 

value1=rangechange(close,startday,endday);

 

if value1>=ratio

then ret=1;

 

outputfield(1,value1,1,"區間漲跌幅");

排序方式: 標準 | 最新
虎科大許教授 發文於   2024/07/28

思考邏輯如下:

(1)準備資料:setTotalBar(getBarOffset(startday)+20);

(2)計算資料:計算每天的成交量、累積成交量及大盤每天的成交量及累積成交量。

(3)當程式跑到startday時,計算過去20天的累積量比重或平均比重。

(4)當程式跑到endday時,計算期間的比重或平均比重。

(5)比較(3)與(4),判斷比重是否增加。

  • 按讚來自於
  • sky911191
師哥 發文於   2024/07/28

您好,

非常感謝許教授的回覆和指導!您的解釋對我理解問題的背景和思考邏輯非常有幫助。不過,由於我目前在這部分的知識有限,還是有點不太確定該如何實現。我有使用ChatGPT來協助我進一步實現這個具體的語法,但我仍然不確定該如何實現。許教授能否提供一個具體的範例或完整的程式碼來幫助我更好地理解呢?這樣我可以更直觀地看到您提到的解決方法的應用。非常感謝您的幫助!

以下是chatgpt給予的語法: 

input: startday(20150702,"區間起始日");

input: endday(20151002,"區間結束日");

input: ratio(10,"最低漲幅");

 

setTotalBar(getBarOffset(startday) + 20);

 

// 計算類股在區間內的漲跌幅

value1 = rangechange(close, startday, endday);

 

if value1 >= ratio then 

    ret = 1;

 

// 計算成交量相關數據

Var totalVolume = 0;

Var totalMarketVolume = 0;

 

// 計算個股每天的成交量累積值

for (i = getBarOffset(startday) to getBarOffset(endday)) {

    totalVolume += vol(i);

}

 

// 計算大盤每天的成交量累積值

for (i = getBarOffset(startday) to getBarOffset(endday)) {

    totalMarketVolume += marketVol(i); // marketVol 是假設的大盤成交量函數,依實際情況調整

}

 

Var totalVolume20 = 0;

Var totalMarketVolume20 = 0;

 

// 計算過去20天的個股累積成交量

for (i = getBarOffset(startday) - 20 to getBarOffset(startday) - 1) {

    totalVolume20 += vol(i);

}

 

// 計算過去20天的大盤累積成交量

for (i = getBarOffset(startday) - 20 to getBarOffset(startday) - 1) {

    totalMarketVolume20 += marketVol(i); // marketVol 是假設的大盤成交量函數,依實際情況調整

}

 

// 計算過去20天的平均比重

Var avgVolumeRatio20 = totalVolume20 / totalMarketVolume20;

 

// 計算指定區間內的平均比重

Var avgVolumeRatio = totalVolume / totalMarketVolume;

 

// 比較比重是否增加

if (avgVolumeRatio > avgVolumeRatio20) {

    print("成交比重增加");

} else {

    print("成交比重減少");

}

 

// 輸出成交比重變化

outputfield(1, value1, 1, "區間漲跌幅");

outputfield(2, avgVolumeRatio, 1, "區間成交比重");

outputfield(3, avgVolumeRatio20, 1, "過去20日成交比重");

outputfield(4, avgVolumeRatio - avgVolumeRatio20, 1, "成交比重變化");

虎科大許教授 發文於   2024/07/28

一般而言,若我回答問題只用提示,代表這個問題可能要花點時間,甚至已經達到代工水準。
當然,若我對問題有興趣(大部份是可當作教材的練習題)就另當別論了。
//此程式未經測試,請驗證。 setBarFreq("D"); input: startday(20240701,"區間起始日"); input: endday(20240705,"區間結束日"); input: ratio(10,"最低漲幅"); var: totalVolume(0),totalMarketVolume(0),proportion1(0),proportion2(0); setTotalBar(getBarOffset(startday) + 21); if date<startday then begin totalVolume=totalVolume+v; totalMarketVolume=totalMarketVolume+GetSymbolField("TSE.TW", "成交量", "D"); proportion1=totalVolume/totalMarketVolume; end else if date>=startday and date<=endday then begin once(date=startday) begin totalVolume=0; totalMarketVolume=0; end; totalVolume=totalVolume+v; totalMarketVolume=totalMarketVolume+GetSymbolField("TSE.TW", "成交量", "D"); proportion2=totalVolume/totalMarketVolume; if date=endday then value1=rateofChange(c,getBarOffset(startday)); end; if isLastBar and value1>=ratio and proportion2>proportion1 then ret=1;

  • 按讚來自於
  • sky911191
師哥 發文於   2024/07/29

真的謝謝許教授的實際演示。太棒了! 

XS小編 發文於   2024/08/02

Hello 師哥,

 

小編補充,網站上有教學區教學影片,裡面有XS語法的基礎和應用可以閱覽。

 

您可以用 summation 函數計算過去一定期數的累積值,或是像 虎科大許教授 的範例中那樣讓腳本累加每期的成交量。

 

感謝 虎科大許教授 的熱心回覆。

發表回覆
Close