Chiến lược giao dịch định lượng với hai đường trung bình động

Tác giả:ChaoZhang, Ngày: 2023-12-29 11:03:14
Tags:

img

Tổng quan

Chiến lược này được thiết kế dựa trên các chỉ số kỹ thuật của đường trung bình động và khối lượng giao dịch cho một chiến lược định lượng theo xu hướng dài hạn. Khi giá đóng đứng trên đường trung bình động 20 ngày và khối lượng mua của ngày lớn hơn khối lượng bán và khối lượng giao dịch trung bình trong n ngày qua, thị trường được coi là ở trạng thái tăng và đã đến lúc mua. Khi giá đóng phá vỡ dưới đường sắt dưới và khối lượng bán của ngày lớn hơn khối lượng mua và khối lượng giao dịch trung bình trong n ngày qua, thị trường được coi là ở trạng thái giảm và đã đến lúc bán.

Nguyên tắc chiến lược

Chiến lược chủ yếu dựa trên hai chỉ số đánh giá:

  1. Đường trung bình động kép: Tính toán đường 20 ngày và đường 60 ngày. Khi đường 20 ngày vượt qua đường 60 ngày, thị trường được coi là xu hướng tăng. Khi đường 20 ngày vượt qua đường 60 ngày, thị trường được coi là xu hướng giảm.

  2. Khối lượng giao dịch: Tính toán khối lượng mua hàng ngày và khối lượng bán hàng. Nếu khối lượng mua lớn hơn khối lượng bán và lớn hơn khối lượng giao dịch trung bình trong n ngày qua, nó được xác định là thị trường tăng. Nếu khối lượng bán lớn hơn khối lượng mua và lớn hơn khối lượng giao dịch trung bình trong n ngày qua, nó được xác định là thị trường giảm.

Chiến lược và logic giao dịch cụ thể là như sau:

Đi dài: Khi giá đóng đứng trên đường trung bình động 20 ngày và khối lượng mua của ngày lớn hơn khối lượng bán và khối lượng giao dịch trung bình trong n ngày qua, thị trường được coi là tăng.

Đi ngắn: Khi giá đóng vỡ dưới đường ray dưới và khối lượng bán hàng trong ngày lớn hơn khối lượng mua và khối lượng giao dịch trung bình trong n ngày qua, thị trường được coi là giảm.

Lấy lợi nhuận và dừng lỗ: Đặt mức lấy lợi nhuận và dừng lỗ hợp lý để khóa lợi nhuận hoặc giảm lỗ. Ví dụ, khi giá tăng 5% so với giá nhập cảnh, lấy lợi nhuận; khi lỗ đạt 10%, dừng lỗ; hoặc khi giá đạt mức cao mới gần đây và sau đó rút lui ở một mức độ nào đó, lấy lợi nhuận.

Phân tích lợi thế

Chiến lược có những lợi thế sau:

  1. Kết hợp hai đường trung bình động và chỉ số khối lượng giao dịch tránh các điểm mù của phán đoán chỉ số kỹ thuật duy nhất.

  2. Sử dụng Bollinger Bands với các tham số khác nhau xác định giá nhập khẩu chính xác hơn.

  3. Chiến lược lấy lợi nhuận và dừng lỗ là hợp lý, giúp khóa lợi nhuận và kiểm soát rủi ro.

  4. Kết quả backtesting tốt với lợi nhuận ổn định, có thể thực sự được áp dụng cho giao dịch định lượng.

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro:

  1. Các chiến lược trung bình động kép có xu hướng tạo ra các tín hiệu sai và cần được lọc bằng các chỉ số khối lượng.

  2. Các thiết lập tham số Bollinger Bands không chính xác có thể dẫn đến các mục nhập quá thường xuyên hoặc thưa thớt.

  3. Các điểm lấy lợi nhuận cố định và dừng lỗ không đúng có thể ảnh hưởng đến lợi nhuận chiến lược.

  4. Một lượng lớn dữ liệu lịch sử được yêu cầu để kiểm tra lại, và tổn thất bất ngờ vẫn có thể xảy ra trong giao dịch trực tiếp.

Hướng tối ưu hóa

Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:

  1. Tối ưu hóa các thông số của hệ thống trung bình động để tìm ra sự kết hợp trung bình động tối ưu.

  2. Tối ưu hóa các thông số Bollinger Bands để nhập chính xác hơn.

  3. Điều chỉnh năng động các điểm lấy lợi nhuận và dừng lỗ theo điều kiện thị trường để thiết lập tỷ lệ rủi ro-lợi nhuận hợp lý.

  4. Tăng đánh giá các chỉ số kỹ thuật khác như MACD, KD, vv để cải thiện độ chính xác chiến lược.

  5. Sử dụng các phương pháp học máy để tự động tìm các thông số tối ưu để làm cho các chiến lược mạnh mẽ hơn.

Tóm lại

Nhìn chung, đây là một chiến lược giao dịch định lượng rất thực tế với hiệu suất backtesting tốt. Nó dễ thực hiện, với rủi ro có thể kiểm soát được, và là một chiến lược ổn định phù hợp với giao dịch trực tiếp, đáng để học cho các nhà giao dịch định lượng. Tất nhiên, vẫn còn rất nhiều chỗ để tối ưu hóa chiến lược, và tôi mong đợi nhiều chuyên gia giao dịch định lượng cải thiện nó.


/*backtest
start: 2023-12-21 00:00:00
end: 2023-12-28 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KAIST291

//@version=4
strategy("prototype",initial_capital=0.01,commission_type=strategy.commission.percent,commission_value=0.1, format=format.volume, precision=0,overlay=true)
// SETTING //
length1=input(1)
length3=input(3)
length7=input(7)
length14=input(14)
length20=input(20)
length60=input(60)
length120=input(120)
ma1= sma(close,length1)
ma3= sma(close,length3)
ma7= sma(close,length7)
ma14=sma(close,length14)
ma20=sma(close,length20)
ma60=sma(close,length60)
ma120=sma(close,length120)
rsi=rsi(close,14)
// BUYING VOLUME AND SELLING VOLUME //
BV = iff( (high==low), 0, volume*(close-low)/(high-low))
SV = iff( (high==low), 0, volume*(high-close)/(high-low))
vol = iff(volume > 0, volume, 1)
dailyLength = input(title = "Daily MA length", type = input.integer, defval = 50, minval = 1, maxval = 100)
weeklyLength = input(title = "Weekly MA length", type = input.integer, defval = 10, minval = 1, maxval = 100)
//-----------------------------------------------------------
Davgvol = sma(volume, dailyLength)
Wavgvol = sma(volume, weeklyLength)
//-----------------------------------------------------------
length = input(20, minval=1)
src = input(close, title="Source")
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
mult2= input(1.5, minval=0.001, maxval=50, title="exp")
mult3= input(1.0, minval=0.001, maxval=50, title="exp1")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
dev2= mult2 * stdev(src, length)
Supper= basis + dev2
Slower= basis - dev2
dev3= mult3 * stdev(src, length)
upper1= basis + dev3
lower1= basis - dev3
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
plot(basis, "Basis", color=#FF6D00, offset = offset)
p1 = plot(upper, "Upper", color=#2962FF, offset = offset)
p2 = plot(lower, "Lower", color=#2962FF, offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))
//----------------------------------------------------
exit=(close-strategy.position_avg_price / strategy.position_avg_price*100)
bull=(close>Supper and BV>SV and BV>Davgvol)
bull2=(close>ma20  and BV>SV and BV>Davgvol)
bux =(close<Supper and close>Slower and volume<Wavgvol)
bear=(close<Slower and close<lower and SV>BV and SV>Wavgvol)
hi=highest(exit,10)
imInATrade = strategy.position_size != 0
highestPriceAfterEntry = valuewhen(imInATrade, high, 0)
// STRATEGY LONG //
if (bull and close>ma3 and ma20>ma60 and rsi<70)
    strategy.entry("Long",strategy.long,0.1)

if (strategy.position_avg_price*1.05<close)
    strategy.close("Long",0.1)

else if (highestPriceAfterEntry*0.999<close and close>strategy.position_avg_price*1.002)
    strategy.close("Long",0.1)
else if (highestPriceAfterEntry*0.997<close and close>strategy.position_avg_price*1.002)
    strategy.close("Long",0.1)
else if (highestPriceAfterEntry*0.995<close and close>strategy.position_avg_price*1.002)
    strategy.close("Long",0.1)
else if (strategy.openprofit < strategy.position_avg_price*0.9-close)
    strategy.close("Long",0.1)
//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////


Thêm nữa