Mây Ichimoku hay còn có tên gọi khác là Ichimoku Kinko Hyo, Ichimoku hay Ichimoku Indicator là một chỉ báo kỹ thuật được phát triển bởi Satoru Hosoda – một nhà báo, phóng viên của tờ Metropolitan vào thời điểm cuối những năm 1930. Ông đã dành 30 năm để hoàn thiện kỹ thuật này trước khi công bố những phát hiện của mình cho công chúng vào năm 1969. Từ đó đến nay nó đã trở thành một trong những kim chỉ nam được các nhà đầu tư Nhật Bản thường xuyên sử dụng
Ichimoku là một hệ thống dự đoán xu hướng dựa trên đường trung bình động (Moving Average). Sự khác biệt chính giữa cách vẽ đường trung bình động trong Ichimoku so với các phương pháp khác là các đường của Ichimoku được xây dựng bằng cách sử dụng điểm 50% của mức cao và mức thấp thay vì giá đóng cửa của nến. Trong bài này chúng ta sẽ xem liệu Ichimoku khi áp dụng vào thị trường chứng khoán Việt Nam có còn hiệu quả hay không
Ichimoku được cấu tạo bởi 5 đường chỉ báo, mỗi đường chỉ báo lại đóng một vai trò và ý nghĩa khác nhau. Dưới đây là chi tiết về từng đường chỉ báo
tenkan_sen = (d['High'].rolling(window=9).max() + d['Low'].rolling(window=9).min()) / 2
kijun_sen = (d['High'].rolling(window=26).max() + d['Low'].rolling(window=26).min()) / 2
senkou_span_a = ((tenkan_sen + kijun_sen) / 2).shift(26)
senkou_span_b = ((d['High'].rolling(window=52).max() + d['Low'].rolling(window=52).min()) / 2).shift(26)
chikou_span = d['Close'].shift(-26)
Chúng tôi sẽ định lượng hệ thống giao dịch sử dụng mây Ichimoku qua bài viết này. Dữ liệu bao gồm toàn bộ các cổ phiếu ở sàn HOSE từ 2018 đến bây giờ. Chúng tôi sẽ tìm ra các điểm mua, bán trong bộ dữ liệu trên, qua đó nghiên cứu xác suất, lợi nhuận để đánh giá độ hiệu quả
Các phương pháp giao dịch sử dụng Ichimoku bao gồm:
Chúng tôi sử dụng python trên môi trường google colab và các thư viện numpy, pandas để làm thống kê. Hướng dẫn cài đặt các thư viện, tải và xử lý dữ liệu có thể xem ở các nghiên cứu trước đây
Tín hiệu giao cắt giữa đường Tenkan-Sen (đường chuyển đổi) và Kijun-Sen (đường cơ sở)
if tenkan_sen > kijun_sen and tenkan_sen < min(senkou_span_a, senkou_span_b) and not inOrder_flag:
bprice = price # Mua tại giá đóng cửa
bvniprice = vprice
n = 0; inOrder_flag = True; order = [dt]
if tenkan_sen < kijun_sen and tenkan_sen > max(senkou_span_a, senkou_span_b) and inOrder_flag and n >= 2:
sprice = price # Bán tại giá đóng cửa
svniprice = vprice
profit = sprice / bprice - 1
inOrder_flag = False; order.append(dt); order_data[symbol].append(order)
order_profit.append(profit)
vni_change.append(svniprice / bvniprice - 1)
nhold.append(n)
Lợi nhuận trung bình mỗi lệnh khá tốt, nhưng khi chúng tôi phân tích cả chiều SHORT cho phương pháp, thì mức sinh lợi -1.9781% trong thời gian giữ trung bình 82.26 ngày. Chứng tỏ phương pháp này không còn hiệu quả. Để so sánh với phương pháp trên đường MA, tín hiệu này có hiệu quả không bằng với tín hiệu khi MA9 giao với MA26, nên đường trung bình động sử dụng (max + min) / 2 ở phương pháp này không có hiệu quả bằng đường MA đơn giản
Đây là 2 đường quan trọng tạo nên mây Kumo. Khi hai đường này cắt nhau tạo ra tín hiệu mua bán
if senkou_span_a < senkou_span_b: # SHORT
if inOrder_flag == 'LONG' and n >= 2:
# Đóng vị thế LONG
sprice = price # Mua tại giá đóng cửa
order_profit.append(sprice / bprice - 1)
order.append(dt); order_data[symbol].append(order)
inOrder_flag = 'None'; nhold.append(n)
if inOrder_flag == 'None':
# Mở vị thế SHORT
bprice = price; n = 0; inOrder_flag = 'SHORT'; order = [dt]
if senkou_span_a > senkou_span_b: # LONG
if inOrder_flag == 'SHORT' and n >= 2:
# Đóng vị thế SHORT
sprice = price # Mua tại giá đóng cửa
order_profit.append(1 - sprice / bprice)
order.append(dt); order_data[symbol].append(order)
inOrder_flag = 'None'; nhold.append(n)
if inOrder_flag == 'None':
# Mở vị thế LONG
bprice = price; n = 0; inOrder_flag = 'LONG'; order = [dt]
Đoạn code trên giả sử có hai chiều LONG và SHORT cho cổ phiếu, chúng tôi dùng để thống kê phương pháp mà không phụ thuộc vào thị trường. Kết quả cho thấy lợi nhuận trung bình mỗi lệnh là 0.5261% trong thời gian nắm giữ trung bình 35.1 ngày. Sau khi trừ phí thuế giao dịch, phương pháp này đạt lợi nhuận tầm 0.15% trong khoảng 35 ngày, hiệu quả khá thấp
Mây kumo được tạo thành bởi hai đường Senkou Span A và Senkou Span B. Thông thường giá sẽ nằm trong mây nghĩa là nằm giữa hai đường này, khi giá break khỏi mây người ta thường xem là có một xu hướng mạnh và có tín hiệu để mua bán
if price < min(senkou_span_a, senkou_span_b): # SHORT
if inOrder_flag == 'LONG' and n >= 2:
# Đóng vị thế LONG
sprice = price # Mua tại giá đóng cửa
order_profit.append(sprice / bprice - 1)
order.append(dt); order_data[symbol].append(order)
inOrder_flag = 'None'; nhold.append(n)
if inOrder_flag == 'None':
# Mở vị thế SHORT
bprice = price; n = 0; inOrder_flag = 'SHORT'; order = [dt]
if price > max(senkou_span_a, senkou_span_b): # LONG
if inOrder_flag == 'SHORT' and n >= 2:
# Đóng vị thế SHORT
sprice = price # Mua tại giá đóng cửa
order_profit.append(1 - sprice / bprice)
order.append(dt); order_data[symbol].append(order)
inOrder_flag = 'None'; nhold.append(n)
if inOrder_flag == 'None':
# Mở vị thế LONG
bprice = price; n = 0; inOrder_flag = 'LONG'; order = [dt]
Đoạn code trên mô tả tín hiệu và cách xử lý khi giá đi ra khỏi mây kumo, chúng tôi thống kê trên hai chiều và kết quả lợi nhuận mỗi lệnh tầm 0.3075% trong khoảng thời gian nắm giữ trung bình 32.53 ngày. Lợi nhuận không thắng được phí thuế giao dịch và kém phương pháp tín hiệu khi 2 đường Senkou Span cắt nhau
Trong các phần trên chúng tôi đã làm thống kê định lượng các phương pháp giao dịch sử dụng MACD bao gồm
Trong các phương pháp trên, chỉ có phương pháp Tín hiệu đường Senkou Span A và Senkou Span B cắt nhau là còn hiệu quả, có thể thắng được thị trường khi đã trừ phí và thuế giao dịch. Nhưng sau khi trừ phí thuế giao dịch, phương pháp này cũng đạt được hiệu quả tầm 2% mỗi năm so với thị trường. Còn lại các phương pháp khác sử dụng Ichimoku đều không còn chính xác, không thắng được phí thuế giao dịch trên thị trường chứng khoán Việt Nam
Mọi nghiên cứu phía trên chúng tôi thực hiện trên môi trường google colab, bấm vào để xem vào thực thi đoạn code