Được phát minh bởi George C. Lane vào những năm 1950, Stochastic Oscillator (SO) là chỉ báo thuộc nhóm Momentum. Momentum ở đây được hiểu là thước đo cho tốc độ hoặc vận tốc thay đổi của giá cổ phiếu. Theo nguyên tắc, vận tốc thay đổi trước khi giá thay đổi. Hội tụ (Convergence) và phân kì (Divergence) của chỉ báo Stochastic Oscillator được sử dụng để dự đoán sự đảo chiều của xu hướng giá trong tương lai.
%D = 3-day SMA của %K
Lowest Low: Giá Low thấp nhất trong khoảng thời gian looking-back period.
Highest High: Giá High cao nhất trong khoảng thời gian looking-back period.
Highest High: Giá High cao nhất trong khoảng thời gian looking-back period.
Thông số mặc định của looking-back period cho Stochastic Oscillator là 14 ngày. Screenshot Excel bên dưới minh họa các tính toán :
Phiên bản nguyên thủy của Lane hiện đang được thay thế bởi phiên bản đầy đủ hơn, hay còn gọi là Full Stochastic Oscillator với :
Full %K = Đường %K cơ bản được smooth với SMA có giá trị X-ngày (X có thể thay đổi)
Full %D = SMA có giá trị Y-ngày của đường Full %K phía trên (Y có thể thay đổi)
2 đường Full %K và Full %D là các built-in function trong Amibroker có thể drop vào chart như hình bên trên.
Hàm Full %K có cú pháp:
1
| StochK(range = 14 , Ksmooth = 3 ); |
với 2 tham số là range và Ksmooth.
Hàm Full %D có cú pháp:
1
| StochD(range = 14 , Ksmooth = 3 , Dsmooth = 3 ); |
với 3 tham số là range, Ksmooth và Dsmooth. Thông thường, về mặt lý thuyết, tham số Ksmooth ở cả 2 hàm khi plot trên cùng 1 chart phải bằng nhau.
2. Sử dụng Stochastic Oscillator
Giống như RSI, chỉ báo SO được giới hạn trong khoảng từ 0 đến 100. Tác giả mặc định sử dụng 80 là mức quá mua (overbought) và 20 là mức quá bán (oversold). 2 ngưỡng này có thế thay đổi theo yêu cầu của người dùng.
Quy tắc trade nguyên thủy của chỉ báo là mua khi đường %K cắt lên trên đường %D, bán khi đường %K cắt xuống phía dưới đường %D. Do %D mặc định là SMA 3 day nên việc sử dụng hệ thống trading dựa trên nguyên tắc này sẽ dẫn đến tần suất open-close position rất lớn. Có 3 cách giải quyết trong trường hợp này
- Đầu tiên là tăng smooth period của đường %D lên mức 10-15 day. Đường %D lúc này sẽ trở nên “smooth” hơn và ít biến động hơn. Cũng có thể tăng hoặc giảm tham số looking-back period thay vì sử dụng 14-day.
- Cách giải quyết thứ 2 là kết hợp thêm điều kiện. Ở đây, tín hiệu mua có thể thêm ràng buộc là đường %K phải cắt đường %D ở vùng <20. Tương tự, tín hiệu bán chỉ xuất hiện khi đường %K cắt đường %D ở vùng >80.
- Cách giải quyết cuối cùng là kết hợp thêm các chỉ báo khác như Moving Average, MACD hay RSI vào trong hệ thống giao dịch.
3. Chiến lược CrossOver Stochastic Oscillator thuần túy trong Amibroker
Tôi sẽ kiểm tra hệ thống giao dịch cơ bản dựa vào chỉ báo Stochastic Oscillator. Tín hiệu mua bán xuất phát từ việc giao cắt thuần túy của 2 đường %K và %D mà không có ràng buộc về mức quá mua và quá bán. Chi tiết trình bày phía bên dưới
- Full %K sử dụng raw data không có smooth period
- Full %D sử dụng SMA 10-day
- Buy Signal: %K cắt lên phía trên %D
- Sell Signal: %K cắt xuống phía dưới %D
- Portfolio chỉ bao gồm 1 cổ phiếu, tối đa 1 open position
- Portfolio không có short-sale
- Giá trị tài khoản đầu kì ở mức 100 triệu VND
- Tradedelay được set là T + 3 theo tiêu chuẩn Việt Nam.
- Chưa bao gồm các khoản phí giao dịch ràng buộc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| SetOption( "maxopenpositions" , 1 ); SetOption( "MaxOpenLong" , 1 ); SetOption( "MaxOpenShort" , 0 ); SetPositionSize( 100 , spsPercentOfEquity); SetOption( "InitialEquity" , 100000 ); SetTradeDelays( 0 , 3 , 0 , 0 ); periods = Param( "Periods1" , 15 , 1 , 200 , 1 ); Ksmooth = Param( "%K average" , 1 , 1 , 200 , 1 ); Dsmooth = Param( "%D average" , 10 , 1 , 200 , 1 ); K1 = StochK( range = periods, Ksmooth = Ksmooth); K2 = StochD( range = periods, Ksmooth = Ksmooth, Dsmooth = Dsmooth); Buy1 = Cross(K1, K2) AND (K1 > 20 ) AND (K2 > 20 ) AND (K1 < 80 ) AND (K2 20 ) AND (K2 > 20 ) AND (K1 < 80 ) AND (K2 < 80 ); Buy2 = Cross(K1, K2) AND (K1 < 20 ) AND (K2 80 ) AND (K2 > 80 ); Buy = Buy1 OR Buy2; Sell = Sell1 OR Sell2; Shape = Buy * shapeUpArrow + Sell * shapeDownArrow; |
Sau khi tạo file SOT1.afl, tôi drag-drop vào chart vào send to automatic analysis trong Amibroker.
Ngay cả khi đã tăng smoothing average period lên mức 10 cho đường %D, vẫn có tới 7 tín hiệu mua và 8 tín hiệu bán cho mã cổ phiếu HSG dựa vào quy tắc giao dịch như phía trên trong khoảng thời gian 7 tháng (7/2016-2/2017) (lưu ý tín hiệu mua bán trên đồ thị không phản ánh được các điều kiện ràng buộc về open position và hạn chế short-sale như tôi đã đề cập ở trên).
Để xem xét tác động của ràng buộc thực tế đến hiệu quả của danh mục đầu tư, tôi sẽ xem xét phần mô phỏng backtest trong automatic analysis. Kết quả như sau:
Có tổng cộng 60 giao dịch được thực hiện từ ngày 1/1/2014 đến ngày 11/2/2017. Tỉ suất lợi nhuận trong 3 năm 2 tháng là 37.52%, tương đương mức annulized return bằng 11.23%.
Số giao dịch có lợi nhuận là 34, tức chiếm 56.67% tổng số giao dịch. Tuy nhiên, khi so sánh với cột cuối cùng là performance của chiến lược Buy-and-Hold (BoH), chiến lược giao dịch cơ bản dựa vào SO đã thất bại hoàn toàn khi lợi nhuận gộp của BoH trong khoảng thời gian trên là 177.93%. Nếu phần rule tôi để thêm ràng buộc về phí giao dịch thì chắc chắn performance của chiến lược trên sẽ thấp hơn rất nhiều ( tần suất trung bình là 20 giao dịch trên 1 năm).
4. Chiến lược giao dịch Crossver SO với ràng buộc oversold overbought trong Amibroker
Vẫn là chiến lược giao dịch như ở trên, nhưng tôi thêm 2 ràng buộc:
- Khi %K cắt lên trên đường %D, cần thêm 1 điều kiện nữa là cả 2 đường đang có giá trị nhỏ hơn hoặc bằng 20 để tạo ra tín hiệu mua
- Khi %K cắt xuống phía dưới %D, cần thêm 1 điều kiện nữa là cả 2 đường đang có giá trị lớn hơn hoặc bằng 20 để tạo ra tín hiệu bán.
1
2
3
| Buy2 = Cross(K1, K2) AND (K1 < 20 ) AND (K2 80 ) AND (K2 > 80 ); Buy = Buy2; Sell = Sell2; |
Chính sử đoạn code phần bên trên với tín hiệu và ràng buộc mới, ta có chart như sau:
Kết quả backtest được thể hiện như hình bên dưới:
Mặc dù đưa ra những ràng buộc khắt khe hơn, tỉ lệ chiến thắng cao hơn (71.43%), tần suất giao dịch ít hơn, tuy nhiên lợi nhuận khi backtest lại không được như mong muốn khi mức annualized return chỉ dừng ở 1.95%.
Để có thể đưa ra chiến lược hiệu quả hơn, chúng ta cần đánh giá các số liệu và biến động của giá in-sample, bằng cả trực quan để điều chỉnh các tham số của chỉ báo Stochastic Oscillator phù hợp tương ứng.
Add Your Comments