Phân tích định lượng phương pháp giao dịch theo chỉ báo MACD

Chỉ báo MACD là gì

MACD là viết tắt của cụm từ Moving Average Convergence Divergence, là một chỉ báo kỹ thuật được sử dụng để xác định xu hướng thị trường và các điểm đảo chiều trong thị trường. Chỉ báo trung bình động hội tụ phân kỳ là một chỉ báo trễ (lagging indicator) được phát triển bởi Gerald Appel vào năm 1979. Về mặt toán học, MACD histogram có thể xem như đạo hàm của giá được làm mịn.

MACD đã phát triển được gần 50 năm, vậy liệu MACD áp dụng vào thị trường chứng khoán Việt Nam liệu còn chính xác.

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

Chúng tôi sẽ định lượng chỉ báo MACD qua bài viết này. Các nghiên cứu sử dụng MACD với các hằng số phổ biến là (12, 26, 9), 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ủa chỉ báo

Các phương pháp giao dịch sử dụng MACD 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 talib, 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. Sử dụng talib để tính toán chỉ báo MACD như sau


MACD = {}; MACDhist = {}
for symbol in data:
  macd, signal, hist = talib.MACD(np.array(data[symbol]['Close']), 12, 26, 9)
  MACD[symbol] = macd
  MACDhist[symbol] = hist

1. Tín hiệu MACD giao với đường zero

Phương pháp này thực tế là giống phương pháp tín hiệu khi giao nhau giữa các đường EMA mà chúng tôi đã làm ở nghiên cứu trước

  • Tín hiệu mua khi MACD cắt lên trên đường zero, tương đương với EMA12 cắt lên trên EMA26
  • Tín hiệu mua khi MACD cắt xuống dưới đường zero, tương đương với EMA12 cắt xuống dưới EMA26

if macd > 0 and not inOrder_flag:
  bprice = price # Mua tại giá đóng cửa
  bvniprice = vprice
  n = 0; inOrder_flag = True; order = [dt]

if macd < 0 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 MACD giao với đường zero
  • Số lần vào lệnh: 11811
  • Thời gian giữ trung bình mỗi lệnh: 28.42 ngày
  • Lợi nhuận trung bình mỗi lệnh: 2.5992%
  • Xác suất lệnh đạt hiệu quả hơn VNINDEX: 32.11%

Kết quả sẽ tương tự như trong bài phân tích về điểm giao cắt các đường EMA10 và EMA20 dự đoán xu hướng trung hạn trước đó. Lợi nhuận trung bình mỗi lệnh ở đây là 2.6459%, 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 0.5673% trong thời gian giữ trung bình 27.85 ngày. sau khi trừ phí thuế giao dịch, thì mức sinh lợi khá thấp, nhưng vẫn có thể hiệu quả tại thị trường chứng khoán Việt Nam

2. Tín hiệu MACD histogram giao với đường zero

MACD Histogram bằng MACD trừ đi đường Signal, tín hiệu MACD histogram giao với đường zero cũng tương tự với đường MACD cắt đường MACD Signal

  • Tín hiệu mua khi MACD Histogram cắt lên trên đường zero hay MACD cắt lên MACD Signal
  • Tín hiệu bán khi MACD Histogram cắt xuống dưới đường zero hay MACD cắt xuống MACD Signal

if hist < 0: # 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 hist > 0: # 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.1111% trong thời gian nắm giữ trung bình 12.4 ngày. Rõ ràng phương pháp này không có hiệu quả ngay cả khi chưa trừ phí và thuế giao dịch

3. Tín hiệu MACD phân kỳ, hội tụ

Trong phân tích kỹ thuật nói chung, phân kỳ là một tín hiệu khi giá và một chỉ báo động lượng không biến động cùng hướng với nhau, trong khi hội tụ thì ngược lại. Phân kỳ thường báo hiệu một xu hướng đảo chiều (ngay cả trong phân kỳ ẩn, tín hiệu tiếp tục xu hướng dài hạn, nhưng vẫn thường là những điểm đảo chiều so với xu hướng ngắn hơn), hội tụ thường báo hiệu tiếp tục xu hướng, tín hiệu hội tụ là hiển nhiên với những chỉ báo động lượng, nên chúng ta có thể bỏ qua.

Đối với chỉ báo MACD chúng ta thường sử dụng hai loại là phân kỳ giữa đường MACD với giáphân kỳ giữa MACD Histogram với giá


if current_macd > min_macd and current_price < price_at_min_macd_pos: # Phân kỳ tăng giá
  signal = 'BUY'
if current_macd < max_macd and current_price > price_at_max_macd_pos: # Phân kỳ giảm giá
  signal = 'SELL'
if current_price > min_price and current_macd < macd_at_min_price_pos: # Phân kỳ ẩn tăng giá
  signal = 'BUY_'
if current_price < max_price and current_macd > macd_at_max_price_pos: # Phân kỳ ẩn giảm giá
  signal = 'SELL_'

Kết quả thể hiện ở bảng sau

Lợi nhuận trung bình | Thời gian nắm giữ trung bình
Phân kỳ thường Phân kỳ ẩn
Đường MACD phân kỳ với giá 0.3436% | 41.18 ngày -2.0771% | 47.14 ngày
MACD Histogram phân kỳ với giá -1.734% | 45.79 ngày 0.2765% | 26.99 ngày

Có thể thấy phương pháp phân kỳ thường với đường MACD và phân kỳ ẩn với đường MACD Histogram có hiệu quả một chút. Nhưng sẽ không còn hiệu quả khi trừ đi phí và thuế giao dịch, ngoài ra các phương pháp này còn không hiệu quả bằng một phương pháp đơn giản là sử dụng trực tiếp đường MACD so với đường zero. Các phương pháp phân kỳ ẩn với đường MACD và phân kỳ thường với đường MACD Histogram thì hoàn toàn không có hiệu quả

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 MACD giao với đường zero là còn hiệu quả, có thể thắng được thị trường khi đã trừ phí và thuế giao dịch. Nhưng thực tế phương pháp này cũng tương tự với giao nhau giữa hai đường MA mà chúng tôi đã kết luận là có hiệu quả ở phần trước. Còn lại các phương pháp khác sử dụng MACD đều không còn chính xác 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