Quán nhỏ của Ranluc: Relative Strength và nhiều hơn thế

Cám ơn bác @chim_non mở quán và đặt tít dùm.​
Relative Strength - một chỉ báo đơn giản mà hiệu quả
Chỉ báo RS - Relative Strength (Comparative) so sánh độ mạnh cp với một cp khác, hay so sánh với chỉ số ngành, chỉ số thị trường chung.
Phương pháp giao dịch dựa trên độ mạnh cũng thường được gọi bằng tên Momentum trong các tài liệu khác.
Chỉ báo RS này khác với chỉ báo RSI.
Chỉ báo RS dường như không thấy nhắc đến trong các lớp PTKT bậc 1, bậc 2. Nó là 1 trong 9 bước test của phương pháp Wyckoff. Trong phương pháp VSA, cuốn Master the Markets, nó chỉ được nhắc đến ở chương cuối, trang cuối cùng. Các quỹ lớn cũng thừa nhận RS đơn giản mà hiệu quả, hơn hẳn phương pháp screening (lọc theo vốn hóa và thanh khoản như ETF).

Phần lớn cp bị ảnh hưởng bởi chỉ số chung, đây là vấn đề tâm lý dễ nhận thấy: khi VNI, VN30 tăng, người ta cùng mua, đẩy giá lên cao, khi VNI, VN30 giảm người ta lại ào ào bán ra, đạp giá xuống. Vấn đề ở đây là cp yếu, dù nó cũng được đẩy giá khi chỉ số chung tăng, cũng không thể tăng mạnh như cp mạnh. Vì vậy chọn cổ phiếu theo các chỉ báo kỹ thuật khác như MACD, RSI... cũng không đạt hiệu quả. Lúc đó người chơi sẽ hoang mang: tui cũng theo chart, đường đỏ cắt đường xanh, vậy mà banks CE còn cp tui chọn chỉ lèo tèo 1-2 nấc.
Phần nhỏ cp không bị ảnh hưởng bởi thị trường hay thậm chí ngươc thị trường. Tuy nhiên nhiều cơ hội nằm ở phần lớn vậy thì tìm ở phần nhỏ làm chi?

Trong một thị trường, có cổ phiếu mạnh, có cổ phiếu yếu. Khi thị trường tăng ta cần chọn mua (long) cp tăng mạnh hơn thị trường (tăng mạnh hơn VNIndex, VN30 index). Khi thị trường giảm ta cần chọn bán (short) cp yếu hơn thị trường hay đơn giản là nghỉ ngơi.

Dưới đây minh họa một mã cp mạnh, với code Amibroker.
cpmanh_ANV.PNG
Cửa sổ trên, thêm lớp chỉ số VN30 để so sánh trực tiếp, đường màu vàng.
Code:
_SECTION_BEGIN("Index");
base = ParamStr("Index", "^VN30"); //VNIndex or VN30
Nth = Param("Nth", 1,1,5);
baseC = Foreign(base, "C");
refBar = PeakBars(baseC,2,Nth);
baseCn = LastvisibleValue(Ref(C/baseC,-refBar))*baseC;
Plot( baseCn , "", colorYellow, stylethick|styleNoLabel); //index
Title += " " + base + "=" + baseC+" ("+WriteVal(ROC(baseC, 1),1.1)+"%)";
_SECTION_END();


Từ 30/1 đến 9/2 VN30 giảm từ 1100 về 996, ANV không giảm, chứng tỏ mạnh hơn thị trường, mặc dù trước đó đã có 1 đợt tăng nóng từ 10 lên 14. Khi VN30 tăng từ 996 lên 1150, tăng 15% thì ANV tăng từ 14. lên 22, đạt 50%. Tin tức không có gì thêm ngoại trừ cá tra bị Mỹ đánh thuế nặng, ngành thủy sản suy giảm mạnh.

Cửa sổ dưới là chỉ báo RS có sẵn của Amibroker, code sửa lại để dễ so sánh.
Code
//modified by ranluc
_SECTION_BEGIN("RS");
base = ParamStr("Base", "^VN30"); //GetBaseIndex() );
Nth = Param("Nth", 1,1,5);
change = 2 ;
baseC = Foreign( base, "C" );
refBar = PeakBars(baseC, change, Nth);
relStr = RelStrength(base) *LastVisibleValue(Ref(baseC/C,-refBar))/10 - 100;
Plot( relStr, "RS("+base+")", colorOrange, styleLine|styleThick);
Plot( EMA(relStr, 50), "", colorBlue, styleLine );
_SECTION_END();


Lấy ngày tham chiếu là 26/1 khi VN30 tạo đỉnh 1104, AVN close giá 14.15, giá trị RS = 0. Ngày 9/2 VN30 điều chỉnh sâu, RS=14.6, nghĩa là so với VN30 ANV vẫn tăng 14.6%. Nếu người chơi mua VN30=996 ngày 9/2 (hay mã đại diện cho VN30 là E1VFVN30=16.35) thì đến ngày 30/3, VN30=1153, E1VFVN30=18.88, ANV=22.9. Lợi nhuận của ANV so với VN30 là =55.0%-14.6%=40.4%

Ví dụ khác, cổ phiếu yếu:
cpyeu_FPT.PNG
Về kỹ thuật FPT từ tháng 11/2017 đến tháng 1/2018 liên tiếp tạo đỉnh mới cao hơn đỉnh cũ, đáy mới cao hơn đáy cũ, giao dịch theo MACD vẫn có lãi, nhưng không bằng thị trường, nghĩa là ví dụ trung bình người ta có lãi 30% thì FPT chỉ lãi 20%, thực ra là lỗ.

Các mã trên đây chọn ngẫu nhiên, không khuyến nghị gì cả.
 
Last edited:
(tiếp theo)
RelPerf.PNG
Hàm Relative Performance của Ami. Lấy mốc so sánh 1/2/2018, đến ngày 5/3 nhóm cổ phiếu mạnh tiếp tục mạnh và chiến thắng thị trường, đường Rel Performance nằm trên đường VN30 (xanh dương). Nhóm cp yếu tiếp tục yếu, nằm dưới đường VN30.
Sơ lược như vậy để thấy chiến lược chọn cp dựa trên RS khá hiệu quả.
 
Tool khác, chart trong ngày của danh mục VN30. So sánh các chart với VN30 có thể nhận thấy độ mạnh yếu của từng mã trong ngày, nhất là lúc VN30 bị sụt áp. Ví dụ ngày 5/4 khoảng 10:15 BID, CTG, MBB bị đánh úp, kế đó khoảng 10:30 GAS bị đạp làm VN30 rơi theo.
vn30intraday.PNG
 
Relative Strength RS + MACD = RSCD
Giá trị RS() có thể thay thế giá (price) để đưa vào các chỉ báo khác ví dụ như MACD
RSCD.PNG
RSCD và MACD có điểm khác nhau. Ở MACD, giá trị dương (phần phía trên trục 0.0) có nghĩa cp đang ở uptrend dài hạn, giá trị âm có nghĩa cp đang ở downtrend dài hạn. Ở RSCD giá trị dương có nghĩa cp mạnh hơn thị trường (hay mạnh hơn so với ngành, so với cp khác), giá trị âm có nghĩa cp yếu hơn thị trường.
Lấy tham số short time, long time giống nhau thì chart của RSCD và MACD khá giống nhau. Đường signal cắt đường MACD và signal cắt RSCD hầu như trùng 1 ngày. Tuy nhiên ở MACD với chiền lược mua thấp - bán cao, đường signal cắt MACD khuyến nghị điểm mua bán. Còn ở RSCD với chiến lược mua cao - bán cao hơn, điểm mua bán phụ thuộc nhiều vào thị trường.
RSCD cũng giúp dự đoán đảo chiều qua các mô hình như S-H-S hay phân kỳ. Trong một số trường hợp phân kỳ của RSCD rõ ràng hơn MACD. Trên hình là cp AAA, ngày 17/1 giá tạo đỉnh mới, MACD cũng tạo đỉnh mới, tuy nhiên RSCD cho thấy phân kỳ, AAA bắt đầu yếu hơn thị trường, bước đầu trong hành trình downtrend.

Code RSCD:
//RSCD= RS + MACD by ranluc
_SECTION_BEGIN("RSCD");
r1 = Param( "Fast avg", 12, 2, 200, 1 );
r2 = Param( "Slow avg", 26, 2, 200, 1 );
r3 = Param( "Signal avg", 9, 2, 200, 1 );

base = ParamStr("Base", "^VN30");
relStr = RelStrength(base);

Plot(ml= EMA(relStr, r1) - EMA(relStr, r2), StrFormat(_SECTION_NAME()+"(%g,%g)", r1, r2), colorgreen, styleThick );
Plot( sl = EMA(ml,9), "Signal" + _PARAM_VALUES(), ParamColor("Signal color", colorBlue ), ParamStyle("Signal style") );
Plot(1.5*( ml-sl), "MACD Histogram", ParamColor("Histogram color", colorDefault ), styleNoTitle | ParamStyle("Histogram style", styleHistogram | styleNoLabel, maskHistogram ) );

_SECTION_END();

*RSCD cũng được gọi bằng MoCD trong các tài liệu khác
 
Anh ranluc có thể hướng dẫn cách tạo Relative Strength như trong investor's Daily không? em muốn làm một cái Data sắp xếp tất cả các cp trên ttckvn theo kiểu đó?
IBD tính RS giống thế này:
tr13 = 40 * ROC(C, 60);
tr26 = 30 * ROC(C, 120);
tr52 = 30 * ROC(C, 240);
RS = tr13 + tr26 + tr52;
Nghĩa là lấy 40% thay đổi so với phiên 3 tháng trước đó, cộng 30% thay đổi so với phiên 6 tháng trước đó, cộng 30% thay đổi so với phiên 12 tháng trước đó. Số 40%, 30%, 30% có nghĩa tính trọng số lớn hơn của thay đổi gần nhất. Đó là tinh thần của công thức. Bạn không cần phải theo sát công thức đó, có thể chọn trong số tùy ý, ví dụ như 50%, 30%, 20%, và chọn thời gian 2 tuần, 4 tuần, 8 tuần. Điểm nguy hiểm mà IBD bỏ qua trong công thức này là khi bạn chọn cp đang có giá trị RS cao nhất thì có thể là lúc nó chuẩn bị điều chỉnh hay quay đầu giảm luôn.
Amibroker chỉ có thể tính RS và xếp hạng từng ngày, không có khả năng xếp hạng ngày này qua ngày kia. Bạn tính rồi chuyển qua excel mà xếp hạng.
 
IBD tính RS giống thế này:
tr13 = 40 * ROC(C, 60);
tr26 = 30 * ROC(C, 120);
tr52 = 30 * ROC(C, 240);
RS = tr13 + tr26 + tr52;
Nghĩa là lấy 40% thay đổi so với phiên 3 tháng trước đó, cộng 30% thay đổi so với phiên 6 tháng trước đó, cộng 30% thay đổi so với phiên 12 tháng trước đó. Số 40%, 30%, 30% có nghĩa tính trọng số lớn hơn của thay đổi gần nhất. Đó là tinh thần của công thức. Bạn không cần phải theo sát công thức đó, có thể chọn trong số tùy ý, ví dụ như 50%, 30%, 20%, và chọn thời gian 2 tuần, 4 tuần, 8 tuần. Điểm nguy hiểm mà IBD bỏ qua trong công thức này là khi bạn chọn cp đang có giá trị RS cao nhất thì có thể là lúc nó chuẩn bị điều chỉnh hay quay đầu giảm luôn.
Amibroker chỉ có thể tính RS và xếp hạng từng ngày, không có khả năng xếp hạng ngày này qua ngày kia. Bạn tính rồi chuyển qua excel mà xếp hạng.
cám ơn anh.
 
Cám ơn bác @chim_non mở quán và đặt tít dùm.​
Relative Strength - một chỉ báo đơn giản mà hiệu quả
Chỉ báo RS - Relative Strength (Comparative) so sánh độ mạnh cp với một cp khác, hay so sánh với chỉ số ngành, chỉ số thị trường chung.
Phương pháp giao dịch dựa trên độ mạnh cũng thường được gọi bằng tên Momentum trong các tài liệu khác.
Chỉ báo RS này khác với chỉ báo RSI.
Chỉ báo RS dường như không thấy nhắc đến trong các lớp PTKT bậc 1, bậc 2. Nó là 1 trong 9 bước test của phương pháp Wyckoff. Trong phương pháp VSA, cuốn Master the Markets, nó chỉ được nhắc đến ở chương cuối, trang cuối cùng. Các quỹ lớn cũng thừa nhận RS đơn giản mà hiệu quả, hơn hẳn phương pháp screening (lọc theo vốn hóa và thanh khoản như ETF).

Phần lớn cp bị ảnh hưởng bởi chỉ số chung, đây là vấn đề tâm lý dễ nhận thấy: khi VNI, VN30 tăng, người ta cùng mua, đẩy giá lên cao, khi VNI, VN30 giảm người ta lại ào ào bán ra, đạp giá xuống. Vấn đề ở đây là cp yếu, dù nó cũng được đẩy giá khi chỉ số chung tăng, cũng không thể tăng mạnh như cp mạnh. Vì vậy chọn cổ phiếu theo các chỉ báo kỹ thuật khác như MACD, RSI... cũng không đạt hiệu quả. Lúc đó người chơi sẽ hoang mang: tui cũng theo chart, đường đỏ cắt đường xanh, vậy mà banks CE còn cp tui chọn chỉ lèo tèo 1-2 nấc.
Phần nhỏ cp không bị ảnh hưởng bởi thị trường hay thậm chí ngươc thị trường. Tuy nhiên nhiều cơ hội nằm ở phần lớn vậy thì tìm ở phần nhỏ làm chi?

Trong một thị trường, có cổ phiếu mạnh, có cổ phiếu yếu. Khi thị trường tăng ta cần chọn mua (long) cp tăng mạnh hơn thị trường (tăng mạnh hơn VNIndex, VN30 index). Khi thị trường giảm ta cần chọn bán (short) cp yếu hơn thị trường hay đơn giản là nghỉ ngơi.

Dưới đây minh họa một mã cp mạnh, với code Amibroker.
View attachment 4993
Cửa sổ trên, thêm lớp chỉ số VN30 để so sánh trực tiếp, đường màu vàng.
Code:
_SECTION_BEGIN("Index");
base = ParamStr("Index", "^VN30"); //VNIndex or VN30
Nth = Param("Nth", 1,1,5);
baseC = Foreign(base, "C");
refBar = PeakBars(baseC,2,Nth);
baseCn = LastvisibleValue(Ref(C/baseC,-refBar))*baseC;
Plot( baseCn , "", colorYellow, stylethick|styleNoLabel); //index
Title += " " + base + "=" + baseC+" ("+WriteVal(ROC(baseC, 1),1.1)+"%)";
_SECTION_END();


Từ 30/1 đến 9/2 VN30 giảm từ 1100 về 996, ANV không giảm, chứng tỏ mạnh hơn thị trường, mặc dù trước đó đã có 1 đợt tăng nóng từ 10 lên 14. Khi VN30 tăng từ 996 lên 1150, tăng 15% thì ANV tăng từ 14. lên 22, đạt 50%. Tin tức không có gì thêm ngoại trừ cá tra bị Mỹ đánh thuế nặng, ngành thủy sản suy giảm mạnh.

Cửa sổ dưới là chỉ báo RS có sẵn của Amibroker, code sửa lại để dễ so sánh.
Code
//modified by ranluc
_SECTION_BEGIN("RS");
base = ParamStr("Base", "^VN30"); //GetBaseIndex() );
Nth = Param("Nth", 1,1,5);
change = 2 ;
baseC = Foreign( base, "C" );
refBar = PeakBars(baseC, change, Nth);
relStr = RelStrength(base) *LastVisibleValue(Ref(baseC/C,-refBar))/10 - 100;
Plot( relStr, "RS("+base+")", colorOrange, styleLine|styleThick);
Plot( EMA(relStr, 50), "", colorBlue, styleLine );
_SECTION_END();


Lấy ngày tham chiếu là 26/1 khi VN30 tạo đỉnh 1104, AVN close giá 14.15, giá trị RS = 0. Ngày 9/2 VN30 điều chỉnh sâu, RS=14.6, nghĩa là so với VN30 ANV vẫn tăng 14.6%. Nếu người chơi mua VN30=996 ngày 9/2 (hay mã đại diện cho VN30 là E1VFVN30=16.35) thì đến ngày 30/3, VN30=1153, E1VFVN30=18.88, ANV=22.9. Lợi nhuận của ANV so với VN30 là =55.0%-14.6%=40.4%

Ví dụ khác, cổ phiếu yếu:
View attachment 4996
Về kỹ thuật FPT từ tháng 11/2017 đến tháng 1/2018 liên tiếp tạo đỉnh mới cao hơn đỉnh cũ, đáy mới cao hơn đáy cũ, giao dịch theo MACD vẫn có lãi, nhưng không bằng thị trường, nghĩa là ví dụ trung bình người ta có lãi 30% thì FPT chỉ lãi 20%, thực ra là lỗ.

Các mã trên đây chọn ngẫu nhiên, không khuyến nghị gì cả.
 
Chào A Ranluc,
Mình add 2 đoạn Codes bạn vào Amibroker.
_SECTION_BEGIN("Index");
base = ParamStr("Index", "^VN30"); //VNIndex or VN30
Nth = Param("Nth", 1,1,5);
baseC = Foreign(base, "C");
refBar = PeakBars(baseC,2,Nth);
baseCn = LastvisibleValue(Ref(C/baseC,-refBar))*baseC;
Plot( baseCn , "", colorYellow, stylethick|styleNoLabel); //index
Title += " " + base + "=" + baseC+" ("+WriteVal(ROC(baseC, 1),1.1)+"%)";
_SECTION_END();

Đoạn code này thêm vào được nhưng nó không hiện ra đường vàng gì cả.
còn đoạn codes
_SECTION_BEGIN("RS");
base = ParamStr("Base", "^VN30"); //GetBaseIndex() );
Nth = Param("Nth", 1,1,5);
change = 2 ;
baseC = Foreign( base, "C" );
refBar = PeakBars(baseC, change, Nth);
relStr = RelStrength(base) *LastVisibleValue(Ref(baseC/C,-refBar))/10 - 100;
Plot( relStr, "RS("+base+")", colorOrange, styleLine|styleThick);
Plot( EMA(relStr, 50), "", colorBlue, styleLine );
_SECTION_END();

Này báo lỗi.
_SECTION_BEGIN("RS");
base = ParamStr("Base", "^VN30"); //GetBaseIndex() );
Nth = Param("Nth", 1,1,5);
change = 2 ;
baseC = Foreign( base, "C" );
refBar = PeakBars(baseC, change, Nth);
relStr = RelStrength(base) * LastVisibleValue(Ref(baseC/C,-refBar))/10 - 100 ;
Error 21. Relative strength base symbol not found
Plot( relStr, "RS("+base+")", colorOrange, styleLine|styleThick);
Plot( EMA(relStr, 50), "", colorBlue, styleLine );
_SECTION_END();
Bạn xem giúp mình với.

Cám ơn bạn

 
Bạn thử thay "^VN30" bằng "VN30" (không có dấu mũ)
hoặc click chuột phải vô chart, chọn Parameters... rồi gõ vào đó chỉ số bạn muốn so sánh.
 
Chào bạn,
Mình thay VN30= VNINDEX. Chạy được rồi.
Cám ơn bạn.
Bạn chỉ giúp mình cái lỗi RS luôn với.
_SECTION_BEGIN("RS");
base = ParamStr("Base", "^VN30"); //GetBaseIndex() );
Nth = Param("Nth", 1,1,5);
change = 2 ;
baseC = Foreign( base, "C" );
refBar = PeakBars(baseC, change, Nth);
relStr = RelStrength(base) * LastVisibleValue(Ref(baseC/C,-refBar))/10 - 100 ;
Error 21. Relative strength base symbol not found
Plot( relStr, "RS("+base+")", colorOrange, styleLine|styleThick);
Plot( EMA(relStr, 50), "", colorBlue, styleLine );
_SECTION_END();


Cám ơn bạn nhiều
 
Chào bạn,
Mình thay VN30= VNINDEX. Chạy được rồi.
Cám ơn bạn.
Bạn chỉ giúp mình cái lỗi RS luôn với.
Cám ơn bạn nhiều
Cũng giống vậy thôi. Bạn thay dòng 2
base = ParamStr("Base", "^VN30"); //GetBaseIndex() );
bằng dòng này là được
base = ParamStr("Base", "VNINDEX");
 
Back
Top