Phân tích định lượng hệ thống giao dịch ichimoku

Mây Ichimoku là gì

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

Thành phần cấu tạo nên mây Ichimoku

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)

  • Tenkan-sen (Conversion Line) còn gọi là đường tín hiệu, đường đảo chiều hay đường chuyển đổi, là điểm trung bình của giá cao nhất và giá thấp nhất trong 9 ngày giao dịch. Nối các điểm Tenkan-sen này lại với nhau ta được đường Tenkan-sen. Dựa vào đường này có thể tìm ra mức hỗ trợ và kháng cự cũng như tín hiệu cho sự đảo chiều giá trên thị trường
  • Kijun-sen (Base Line) còn gọi là đường xu hướng hay đường cơ sở, chính là điểm trung bình của giá cao nhất và giá thấp nhất trong 26 ngày giao dịch. Các chỉ số Kijun-sen đại diện cho mức hỗ trợ và kháng cự chính, xác nhận sự thay đổi xu hướng và có thể được sử dụng làm điểm cắt lỗ
  • Senkou Span A (Leading Span A) còn được gọi là đường dẫn A là trung bình của Tenkan-sen và Kijun-sen được vẽ về phía trước 26 phiên. Đường này tạo thành một cạnh của kumo hoặc đám mây – được sử dụng để xác định các khu vực hỗ trợ và kháng cự trong tương lai
  • Senkou Span B (Leading Span B) hay còn được gọi là đường dẫn B. Là trung bình của giá cao nhất và thấp nhất trong 52 phiên giao dịch gần nhất, sau đó được vẽ về trước 26 ngày. Đường Senkou Span B tạo thành cạnh khác của đám mây được sử dụng để xác định các khu vực hỗ trợ và kháng cự trong tương lai
  • Chikou Span (Lagging Span) còn gọi là đường trễ, là đóng cửa ngày hiện tại được thể hiện ở 26 phiên trước đó. Đường này thể hiện các khu vực hỗ trợ và kháng cự có thể có

Phương pháp định lượng

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:

Phân tích chi tiết

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

1. Tín hiệu mua bán khi đường Tenkan-Sen cắt đường Kijun-Sen

Tín hiệu giao cắt giữa đường Tenkan-Sen (đường chuyển đổi) và Kijun-Sen (đường cơ sở)

  • Tín hiệu mua: Khi Tenkan-Sen cắt Kijun-Sen theo chiều từ dưới lên trên và điểm giao cắt nằm phía dưới mây Kumo
  • Tín hiệu bán: Khi Tenkan-Sen cắt Kijun-Sen cắt nhau theo chiều từ trên xuống dưới, đồng thời vị trí giao cắt này nằm bên trên đám mây Kumo

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)

Kết quả tín hiệu Tenkan-Sen cắt Kijun-Sen
  • Số lần vào lệnh: 3721 lần
  • Thời gian giữ trung bình mỗi lệnh: 81.83 ngày
  • Lợi nhuận trung bình mỗi lệnh: 4.5045%
  • Xác suất lệnh đạt hiệu quả hơn VNINDEX: 54.29%

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

2. Tín hiệu đường Senkou Span A và Senkou Span B cắt nhau

Đâ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

  • Tín hiệu mua: Khi Senkou Span A cắt đường Senkou Span B từ dưới lên. Mây Kumo đổi từ đỏ sang xanh
  • Tín hiệu bán: Khi Senkou Span A cắt đường Senkou Span B hướng từ trên xuống. Mây Kumo đổi màu từ xanh thành đỏ

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

3. Tín hiệu khi giá breakout khỏi mây Kumo

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

  • Tín hiệu mua: Giá phá vỡ mây Kumo theo hướng từ dưới lên đồng thời giá đóng cửa nằm phía trên mây Kumo
  • Tín hiệu bán: Giá phá vỡ mây Kumo theo hướng từ trên xuống và giá đóng cửa nằm dưới mây Kumo

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

4. Kết luận

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