Chiến lược định hình vị trí động dựa trên đường cong vốn chủ sở hữu

Tác giả:ChaoZhang, Ngày: 2024-01-16 15:06:39
Tags:

img

Tổng quan chiến lược

Ý tưởng cốt lõi của chiến lược này là điều chỉnh kích thước vị trí một cách năng động dựa trên xu hướng của đường cong vốn chủ sở hữu - tăng kích thước vị trí trong thời gian lợi nhuận và giảm kích thước vị trí trong thời gian mất mát để kiểm soát rủi ro tổng thể.

Tên chiến lược

Chiến lược định hình vị trí động dựa trên đường cong vốn chủ sở hữu

Chiến lược logic

Chiến lược sử dụng hai phương pháp để xác định xem đường cong cổ phiếu có trong xu hướng giảm hay không: 1) Tính toán các đường trung bình di chuyển đơn giản nhanh và chậm của đường cong cổ phiếu, nếu SMA nhanh thấp hơn đường SMA chậm, nó được coi là xu hướng giảm; 2) Tính toán đường cong cổ phiếu so với đường trung bình di chuyển đơn giản dài hơn của nó, nếu cổ phiếu nằm dưới đường trung bình di chuyển, nó được coi là xu hướng giảm.

Khi xu hướng giảm đường cong cổ phiếu được xác định, kích thước vị trí sẽ được giảm hoặc tăng một tỷ lệ phần trăm nhất định dựa trên các cài đặt. Ví dụ, nếu giảm 50% được thiết lập, kích thước vị trí ban đầu 10% sẽ được giảm xuống còn 5%. Cơ chế này làm tăng kích thước vị trí trong thời gian lợi nhuận và giảm kích thước trong thời gian mất mát để kiểm soát rủi ro tổng thể.

Ưu điểm

  • Sử dụng đường cong vốn chủ sở hữu để đánh giá tổng lợi nhuận/mất và điều chỉnh kích thước vị trí để kiểm soát rủi ro
  • Kết hợp nhiều chỉ số để xác định tín hiệu nhập cảnh có thể cải thiện tỷ lệ thắng
  • Các tham số có thể tùy chỉnh cho điều chỉnh vị trí phù hợp với các khẩu vị rủi ro khác nhau

Rủi ro

  • Mất mát có thể được tăng lên với kích thước vị trí tăng trong khi lợi nhuận
  • Điều chỉnh hung hăng do cài đặt tham số không đúng
  • Chỉ riêng việc định kích thước vị trí không thể loại bỏ hoàn toàn rủi ro hệ thống

Hướng dẫn cải thiện

  • Hiệu quả thử nghiệm các thông số điều chỉnh vị trí khác nhau
  • Hãy thử các chỉ số khác để xác định xu hướng đường cong cổ phiếu
  • Tối ưu hóa điều kiện nhập cảnh để cải thiện tỷ lệ thắng

Kết luận

Lý thuyết tổng thể của chiến lược này là rõ ràng - nó điều chỉnh động kích thước vị trí dựa trên đường cong vốn chủ sở hữu, giúp kiểm soát rủi ro một cách hiệu quả.


/*backtest
start: 2024-01-08 00:00:00
end: 2024-01-15 00:00:00
period: 3m
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/
// © shardison
//@version=5

//EXPLANATION
//"Trading the equity curve" as a risk management method is the 
//process of acting on trade signals depending on whether a system’s performance
//is indicating the strategy is in a profitable or losing phase.
//The point of managing equity curve is to minimize risk in trading when the equity curve is  in a downtrend. 
//This strategy has two modes to determine the equity curve downtrend:
//By creating two simple moving averages of a portfolio's equity curve - a short-term
//and a longer-term one - and acting on their crossings. If the fast SMA is below
//the slow SMA, equity downtrend is detected (smafastequity < smaslowequity).
//The second method is by using the crossings of equity itself with the longer-period SMA (equity < smasloweequity).
//When "Reduce size by %" is active, the position size will be reduced by a specified percentage
//if the equity is "under water" according to a selected rule. If you're a risk seeker, select "Increase size by %"
//- for some robust systems, it could help overcome their small drawdowns quicker.

strategy("Use Trading the Equity Curve Postion Sizing", shorttitle="TEC", default_qty_type = strategy.percent_of_equity, default_qty_value = 10, initial_capital = 100000)

//TRADING THE EQUITY CURVE INPUTS
useTEC           = input.bool(true, title="Use Trading the Equity Curve Position Sizing")
defulttraderule  = useTEC ? false: true
initialsize      = input.float(defval=10.0, title="Initial % Equity")
slowequitylength = input.int(25, title="Slow SMA Period")
fastequitylength = input.int(9, title="Fast SMA Period")
seedequity = 100000 * .10
if strategy.equity == 0
    seedequity
else
    strategy.equity
slowequityseed   = strategy.equity > seedequity ? strategy.equity : seedequity
fastequityseed   = strategy.equity > seedequity ? strategy.equity : seedequity
smaslowequity    = ta.sma(slowequityseed, slowequitylength)
smafastequity    = ta.sma(fastequityseed, fastequitylength)
equitycalc       = input.bool(true, title="Use Fast/Slow Avg", tooltip="Fast Equity Avg is below Slow---otherwise if unchecked uses Slow Equity Avg below Equity")
sizeadjstring    = input.string("Reduce size by (%)", title="Position Size Adjustment", options=["Reduce size by (%)","Increase size by (%)"])
sizeadjint       = input.int(50, title="Increase/Decrease % Equity by:")
equitydowntrendavgs = smafastequity < smaslowequity
slowequitylessequity = strategy.equity < smaslowequity

equitymethod = equitycalc ? equitydowntrendavgs : slowequitylessequity

if sizeadjstring == ("Reduce size by (%)")
    sizeadjdown = initialsize * (1 - (sizeadjint/100))
else
    sizeadjup = initialsize * (1 + (sizeadjint/100))
c = close
qty = 100000 * (initialsize / 100) / c
if useTEC and equitymethod
    if sizeadjstring == "Reduce size by (%)"
        qty := (strategy.equity * (initialsize / 100) * (1 - (sizeadjint/100))) / c
    else
        qty := (strategy.equity * (initialsize / 100) * (1 + (sizeadjint/100))) / c
    
//EXAMPLE TRADING STRATEGY INPUTS
CMO_Length = input.int(defval=9, minval=1, title='Chande Momentum Length')
CMO_Signal = input.int(defval=10, minval=1, title='Chande Momentum Signal')

chandeMO = ta.cmo(close, CMO_Length)
cmosignal = ta.sma(chandeMO, CMO_Signal)

SuperTrend_atrPeriod = input.int(10, "SuperTrend ATR Length")
SuperTrend_Factor = input.float(3.0, "SuperTrend Factor", step = 0.01)
Momentum_Length = input.int(12, "Momentum Length")
price = close

mom0 = ta.mom(price, Momentum_Length)
mom1 = ta.mom( mom0, 1)
[supertrend, direction] = ta.supertrend(SuperTrend_Factor, SuperTrend_atrPeriod)
stupind = (direction < 0 ? supertrend : na)
stdownind = (direction < 0? na : supertrend)

//TRADING CONDITIONS
longConditiondefault = ta.crossover(chandeMO, cmosignal) and (mom0 > 0 and mom1 > 0 and close > stupind) and defulttraderule
if (longConditiondefault)
    strategy.entry("DefLong", strategy.long, qty=qty)

shortConditiondefault = ta.crossunder(chandeMO, cmosignal) and (mom0 < 0 and mom1 < 0 and close < stdownind) and defulttraderule
if (shortConditiondefault)
    strategy.entry("DefShort", strategy.short, qty=qty)
    
longCondition = ta.crossover(chandeMO, cmosignal) and (mom0 > 0 and mom1 > 0 and close > stupind) and useTEC
if (longCondition)
    strategy.entry("AdjLong", strategy.long, qty = qty)

shortCondition = ta.crossunder(chandeMO, cmosignal) and (mom0 < 0 and mom1 < 0 and close < stdownind) and useTEC
if (shortCondition)
    strategy.entry("AdjShort", strategy.short, qty = qty)
plot(strategy.equity)
plot(smaslowequity, color=color.new(color.red, 0))
plot(smafastequity, color=color.new(color.green, 0))

Thêm nữa