Lọc khối lượng lớn hơn trung bình 5 ngày amibroker

Ở bài viết này tôi sẽ phân tích 1 hiện tượng liên quan đến chỉ báo rất quen thuộc với các trader đó là chỉ bảo Relative Strength Index (RSI) (tham số được sử dụng lần lượt là 2/3/4, tham số mặc định của đường RSI mà chúng ta hay đọc là 14). Bài viết được lấy cảm hứng từ blog AQR trên hub quantocracy.

0. RSI(2) Smile là gì?

a. Khái niệm smile.

*(Hiện tượng này không liên quan đến bài viết nhưng giải thích khái niệm đồ thị dạng smile)*

Khi sử dụng Black-Scholes để định giá quyền chọn, khi các tham số khác trong mô hình giữ nguyên, để giá lý thuyết tính toán dựa trên BS bằng đúng giá trị trên thị trường – market price, người ta thay đổi tham số sigma và gọi nó là implied volatility.

Khi tính toán implied volatility với các strike price khác nhau, người ta nhận thấy, khi strike price càng xa giá hiện tại của tài sản cơ sở, implied volatility càng lớn. Nếu dựng đồ thị mà trục hoành là strike price và trục tung là implied volatility, đồ thị sẽ có dạng chữ C nằm ngang, hõm lên trên, hay còn gọi là smile (nụ cười)

Vậy có thể hiểu smile ở đây là 1 dạng đồ thị đặc biệt giải thích 1 hiện tương nào đó.

  1. RSI(2) Smile

Cũng có dạng đồ thị như Volatility Smile, tuy nhiên RSI(2) Smile khác ở chỗ, trục tung trên đồ thị là frequency, tức là tần suất của các data point, còn trục hoành là các buckets. Đơn giản là, xem xét toàn bộ dữ liệu giá của các mã cổ phiếu, ở mỗi điểm giá chúng ta tính toán được giá trị của chỉ báo RSI với tham số là 2. Sau đó chúng ta xem xét phân phối của toàn bộ các giá trị RSI 2 tính toán được.

Ở các thị trường khác nhau, khi tính toán đều cho ra được phân phối có dạng smile (cong lên ở 2 đầu). Ở bài viết này tôi sẽ thử nghiệm tương tự để xem xét liệu thị trường Việt Nam có hiện tượng này hay không.

*Lưu ý: Tôi sẽ sử dụng RSI2 và RSI(2) đan xen trong các phần viết bên dưới*

1. Dữ liệu, công cụ và các tham số

Bài viết sử dụng dữ liệu chứng khoán EOD cung cấp bởi trang web http://www.cafef.vn và http://cophieu68.vn. Công cụ phân tích bao gồm:

* Python 3.5 * Amibroker 6.0 * Seaborn, pandas và numpy

Các dữ liệu và tham số cần tính toán là:

* Close: Giá đóng cửa của các cổ phiếu trên sàn HOSE, HNX và UPCOM * RSI2: Relative Strength Index sử dụng tham số = 2 * 100-day Volatility: Rủi ro 100 ngày được đo bằng độ lệch chuẩn (standard deviation) * Volume: khối lượng giao dịch * Moving Average: Trung bình động

2. Bộ lọc cổ phiếu

Đầu tiên tôi cập nhật toàn bộ dữ liệu cổ phiếu 3 sàn HOSE, HNX VÀ UPCOM vào Amibroker. Tôi lập bộ lọc với đoạn code sau đây:

Filter = MA(Volume, 15) > 10000 AND MA(Volume, 60) > 10000 AND Volume > 10000 AND Close > 2; ret1d = ROC(Close, 1); std100d = StDev(ret1d, 100) * sqrt(252); AddColumn(Close, "Close", 1.2); AddColumn(RSI(2), "RSI2", 1.2); AddColumn(std100d, "Volatility", 1.2);

Nội dung của đoạn code trên dùng để lọc toàn bộ mã cổ phiếu có MA volume 15 và MA của volume 60 lớn hơn 10,000 đồng thời khối lượng giao dịch ngày cuối cùng cũng lớn hơn 10,000. Đồng thời bộ lọc cũng lọc ra các cổ phiếu có thị giá nhỏ hơn 2,000 VND. Mục đích chính của bộ lọc là lọc ra các cổ phiếu penny-cap có rủi ro cao (sắp rời sàn, thanh khoản yếu, giao dịch giá thấp hơn giá trị sổ sách).

Áp dụng bộ lọc trên vào giai đoạn 2 năm (1/1/2016 đến 31/12/2017, trong amibroker sử dụng range from-to-dates trong automatic analysis), tôi có tổng số data point là 211,400 (xấp xỉ 460 mã sau khi lọc).

3. Phân tích dữ liệu 2016-2017

a. RSI2 smile cho toàn bộ dữ liệu

Sau khi xử lý dữ liệu, tôi được đồ thị như hình bên dưới

Lọc khối lượng lớn hơn trung bình 5 ngày amibroker

Nếu chia data point thành 10 nhóm khác nhau (nhóm nhỏ nhất có giá trị RSI2 < 10 và nhóm lớn nhất có giá trị RSI2 < 90), ta có thể thấy rõ có hiện tượng RSI2 smile ở thị trường Việt Nam trong 2 năm 2016 và 2017.

Cụ thể, số lượng các data point có giá trị rất cao hoặc rất thấp cao hơn hẳn so với nhóm còn lại. Giá trị trung bình của RSI2 ở thị trường Việt Nam chỉ là 48.41

Lọc khối lượng lớn hơn trung bình 5 ngày amibroker

Lấy ví dụ tôi có khoảng 30,000 data point thuộc nhóm < 5, tức là trung bình mỗi ngày sẽ có khoảng 30,000/(504) = 59 mã có giá trị RSI2 < 5, tức khoảng 13% số lượng mã sau khi chạy bộ lọc.

b. RSI2 smile phân nhóm theo rủi ro 100 ngày

Nếu đã từng giao dịch hoặc đọc chart sử dụng chỉ bảo RSI, chúng ta có thể nhận thấy rằng, RSI và giá chuyển động cùng chiều. Khi giá tăng thì giá trị RSI tăng, khi giá giảm thì RSI giảm. Nếu sử dụng tham số càng dài thì tốc độ tăng của chỉ báo sẽ càng chậm (14 sẽ tăng chậm hơn nhiều so với 2).

Lọc khối lượng lớn hơn trung bình 5 ngày amibroker

Lấy ví dụ, với chỉ số VNINDEX, RSI14 biến động ít hơn rất nhiều so với RSI2. Nếu trade sử dụng RSI(2) sẽ rất rủi ro nếu giá di chuyển nhanh mạnh, đột ngột.

Cách phổ biến để tìm ra tín hiệu giao dịch là lọc thêm 1 lần nữa, tức là lọc ra các mã có volatility thấp và cao, sau đó mới quyết định sử dụng các trading rule với từng nhóm với volatility khác nhau.

Ở bài viết này tôi sẽ tách toàn bộ sample ra thành 5 nhóm. Nhóm rủi ro nhất với volatility > hoặc = 60. Nhóm ít rủi ro nhất có volatility < 30. Cần lưu ý ở đây là độ lệch chuẩn (standard deviation) được tính toán trên dữ liệu 100 ngày trước đó. Để thỏa mãn yêu cầu 100 ngày, số data point được cắt bớt xuống 155,908. Đa số volatility của các data point (khoảng 60%) rơi vào nhóm từ 30 đến 40%.

Lọc khối lượng lớn hơn trung bình 5 ngày amibroker

Sau khi phân tích dữ liệu, tôi được đồ thị bên dưới

Lọc khối lượng lớn hơn trung bình 5 ngày amibroker

Tôi sẽ để các bạn tự phân tích đồ thị phía trên. Điểm nổi bật vẫn luôn nằm ở 2 nhóm 0-10 và 90-100.

c. Phân tích kết quả:

Vậy từ đống đồ thị phân phối phân tích phần trên, chúng ta rút ra được điều gì?

* Thứ nhất, nếu dùng chỉ báo RSI2, chỉ báo sẽ đưa ra rất nhiều tín hiệu nhiễu. Nó khá giống với giao dịch dựa trên giá đóng cửa ngày hôm trước và trước nữa (giả sử 3 lần tăng liên tục trong 1 tuần thì đặt 1 lệnh mua ngày thứ 4 và thứ 5). Trader có thể sử dụng thêm các chỉ báo về volatility để đo lường về độ biến động của mã cổ phiếu, phân nhóm và pick 1 nhóm các mã để sử dụng RSI2 thay vì backtesting toàn bộ sample.

* Thứ 2, nếu nhìn vào 2 cực của đồ thị volatility smile có thể nhận thấy được, nếu các mã trong bộ lọc đồng loạt tăng (không nói đến giá trị tăng lên của vốn hóa tức p nhân q mà chỉ xét đến p) trong một thời gian tương đối dài (3-5 tháng), số lượng data point bên phải sẽ cao hơn bên trái (nhóm > 50 sẽ có số lượng nhiều hơn nhóm < 50). Lúc này có khả năng đà tăng của mid cap và small cap sẽ mạnh mẽ ngang với nhóm large cap (lưu ý là chỉ nhìn vào p chứ không phải p nhân q). Ngược lại, khi có sự phân hóa, giả sử vnindex hay hnxindex vẫn tăng điểm trong khi số lượng data point dịch chuyển sang bên trái tăng lên, vậy có khả năng là 1 số cổ phiếu large cap đang ngầm kém thị trường trong khi đám còn lại đang giao dịch đi ngang hoặc trong down trend ( *Lưu ý là cách nhìn thị trường này không áp dụng cho mọi trường hợp và theo ý kiến chủ quan*). Việc sử dụng RSI2 tạo nên 1 góc nhìn mới cho thị trường (có rất nhiều chỉ báo có chức năng tương tự).

* Thứ 3, có thể hiểu khi giá trị RSI2 thay đổi qua từng ngày, chúng ta có những điểm data point mới và làm đầy các bar trên đồ thị RSI2 smile. Vậy khi thị trường uptrend, có khả năng các data point sẽ phân bổ nhiều hơn vào phần bên phải hơn phần bên trái. Chúng ta có hiện tượng tương tự nhưng ngược lại với downtrend. Khi thị trường đi ngang hoặc rung lắc nhẹ , các data point sẽ rải đều giữa các bar, không có sự biến động quá nhiều. Khó để phân tích nhất là khi trong thời gian ngắn, thị trường rung lắc dữ dội, sẽ không có khuôn mẫu cho đồ RSI2 smile.

* Thứ N: phụ thuộc vào các bạn đọc, có rất nhiều cách để giải thích về hiện tượng bên trên. Quan trọng đó là hiện tượng ở nhiều thị trường và không đc coi là 1 random pattern nữa (bản thân công thức tính RSI2 đã hàm ý điều này, nếu sử dụng RSI3 hay RSI4 chúng ta sẽ không thấy hiện tượng này nữa).

* Một điều thú vị nữa là với các thử nghiệm RSI2 trên các thị trường khác, lấy ví dụ cụ thể là Mỹ với chỉ số RUSELL3000, tác giả nhận thấy, số lượng mã chứng khoán có RSI2 < 10 tỉ lệ nghịch với total return của chỉ số hằng năm. Tức là khi có nhiều mã có RSI2 < 10 hơn, chỉ số RUSELL sẽ giảm, tức là có yearly total return âm. Ngược lại khi có ít mã có RSI2 <10, chỉ số sẽ tăng điểm. Tương tự với RSI2 > 90 đó là correlation dương. (tôi sẽ test điều với chỉ số vnindex và hnxindex trong phần 2 của bài viết)

5. Trading simulation

Ở phần này, tôi sẽ nghĩ ra 1 rule để trade dựa trên giả định của tôi về chỉ báo RSI2. Tôi sẽ gọi nó là “RSI2 world-cup strategy”. Cách thức hoạt động của nó khá đơn giản với ai đã từng đọc các research paper về finance. Mục đích của phần này chỉ là thử nghiệm ngẫu nhiên về chỉ báo RSI2 mà không dựa trên bất kì cơ sở lý thuyết hay kết quả thực nghiệm nào.

* Đầu tiên, trong khoảng thời gian từ 1/1/2016 tới 31/3/2016, tôi dùng bộ lọc ở trên, tính toán chỉ số RSI(2), sau đó mỗi khi mã nào có RSI(2) giảm xuống dưới 5, tôi sẽ cho vào watchllist. Sử dụng Amibroker với đoạn code

* Sau đó tôi sẽ mua toàn bộ các mã trong watchlist sử dụng phương thức equal-weight, nắm giữ tới ngày 29/12/2016 và thanh khoản toàn bộ danh mục ra tiền

Đầu tiên là sử dụng đoạn code ở phần 2 để lọc toàn bộ mã thỏa mãn tính thanh khoản. Sau đó sử dụng đoạn code sau để thực hiện tiếp filter cho RSI2 < 5 với Apply to AllQuotes và Range From-To-dates (1/1/2016 – 31/3/2016).

Filter = RSI(2) < 5;

Sau khi explore xong lưu toàn bộ kết quả vào 1 watchlist. Tiếp tục chạy đoạn code sau để in ra return và volatility của các mã đã đc chọn, với Apply to Filter (chọn watchlist) và Range From-To-dates (29/12/2016):

Filter = 1; AddColumn(ROC(Close,192)* 252/192, "ROC", 1.2); AddColumn(StDev(ROC(Close,1), 192)* sqrt(252), "StDev", 1.2);

* Quá trình trên sẽ lặp lại trong năm 2017.

* Sau khi quá trình hoàn tất tôi sẽ so sánh return của "RSI2 world-cup strategy" với buy-and-hold return của VNINDEX. (Lưu dữ liệu exploration vào file excel hay csv rồi xử lý tiếp)

Đầu tiên là phân phối của holding-period-return của 2 watchlist trong 2016 và 2017:

Lọc khối lượng lớn hơn trung bình 5 ngày amibroker

Tiếp đến là efficient frontier của 2 watchlist trong 2016 và 2017:

Lọc khối lượng lớn hơn trung bình 5 ngày amibroker

Lọc khối lượng lớn hơn trung bình 5 ngày amibroker

Cuối cùng là performance, “RSI2 world-cup strategy” có holding-period return là 19.50% trong năm 2016 và 2.15% trong năm 2017, thấp hơn so với VNINDEX là 18.9% trong năm 2016 và 36.28% trong năm 2017. Tuy nhiên điểm sáng của chiến lược là nó đã outperform VNINDEX trong năm 2016 khoảng 0.6% chưa tính đến volatility.