무작위 걷는 전략

저자:차오장, 날짜: 2023-10-09 16:10:24
태그:

전반적인 설명

랜덤 워크 전략 (random walk strategy) 은 무작위 숫자 생성에 기반한 자동화 거래 전략이다. 선형 합동 생성기를 사용하여 집계 시드를 기반으로 무작위로 숫자를 생성한다. 숫자가 한 임계보다 크면 길게, 낮으면 짧게, 무작위 입력 긴 / 짧은 구현.

전략 논리

무작위 거래를 구현하는 주요 부분은 다음과 같습니다.

  1. 랜덤 숫자 생성에 대한 매개 변수 a, c 및 모듈스 m를 설정하고 초기 씨앗을 설정합니다.

  2. 무작위 숫자 생성 함수 GetRandom을 정의하여 선형 합동 알고리즘을 사용하여 0-m 사이의 무작위 숫자를 생성합니다.

  3. 각각의 촛불 위에, 만약 위치가 없다면, 생성된 무작위 숫자 크기를 비교하고, m/2보다 크면 긴 거리로 가거나, 그렇지 않으면 짧은 거리로 가십시오.

  4. 스톱 로스를 설정하고 이윤을 차지하는 조건은 비율로 설정합니다.

  5. 시간 프레임에 따라 백테스트 기간을 설정합니다.

위 단계를 통해 전략은 완전히 무작위적인 긴 / 짧은 거래를 실현합니다. 무작위 숫자가 m / 2보다 크면 긴 포지션을 열고 그렇지 않으면 짧은 포지션을 열고, 그 다음 손실을 중지하고 출구 포지션을 위해 이익을 설정합니다. 백테스트 기간은 사용자 정의됩니다.

이점 분석

  • 간단하고 명확한 전략 논리, 이해하기 쉽고 실행하기 쉽습니다.

  • 무작위 거래는 감정적인 영향을 효과적으로 피하고 주관적인 오작동을 줄입니다.

  • 무작위성을 조정할 수 있는 무작위 숫자 생성 매개 변수

  • 유연한 스톱 로스 설정과 단독 수익/손실을 제어하기 위한 수익 취득 설정

  • 전체 이익에 다른 매개 변수의 영향을 백테스팅을 통해 매개 변수 최적화를 지원합니다.

위험 분석

  • 무작위 거래는 정의되지 않은 장기 트렌드와 불확실한 수익성을 초래할 수 있습니다.

  • 시장 조건에 따라 위치를 조정하지 못하면 트렌드 기회를 놓칠 수 있습니다.

  • 한 번의 이익이 제한되어 있고, 사용 위험도 높습니다.

  • 상당한 손실을 피하기 위해 합리적인 스톱 손실/이익 취득 비율이 필요합니다.

  • 무작위성 때문에 빈번한 오픈/클로즈 포지션은 거래 비용을 증가시킵니다.

  • 합리적인 파라미터 설정을 확인하기 위해 필요한 충분한 역 테스트, 맹목적으로 사용하지 마십시오.

트렌드 판단을 추가하고, 스톱 로스 메커니즘을 최적화하고, 단일 이익/손실 등을 엄격하게 통제함으로써 위험을 줄일 수 있습니다.

개선 방향

  • 트렌드 판단을 추가해서 트렌드에 반대하는 거래를 피하세요.

  • 자본변화에 기초한 포지션 크기를 추가합니다.

  • 더 나은 무작위성을 위해 무작위 숫자 생성 알고리즘을 최적화합니다.

  • 동적 스톱 로스/익수율

  • 명령 주파수 제한

  • 여러 파라미터 백테스트 최적화

요약

무작위 행보 전략은 무작위 숫자로 제어 된 장기 / 단기를 통해 기계적 거래를 실현합니다. 강한 무작위성을 가지고 있으며 감정적 인 영향과 주관적 인 오작동을 피합니다. 그러나 무작위 항목은 또한 트렌드 기회를 놓칠 수 있으며 제한된 단일 이익이 필요하며 최적화된 리스크 제어 메커니즘이 필요합니다. 전반적으로 전략은 거래 아이디어를 확인하고 매개 변수 영향을 평가하는 데 적합하지만 실용적 사용에 대한 신중한 평가가 필요합니다.


/*backtest
start: 2022-10-02 00:00:00
end: 2023-10-08 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//@author=Tr0sT
strategy(title = "Random strategy", shorttitle = "Random", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

a = 16
c = 10
m = 1000
GetRandom(prev) =>
    GetRandom = (a * prev + c) % m

seed = input(200, minval = 2, maxval = m)
stopLoss = input(30, title = "Stop loss percentage(0.1%)")
takeProfit = input(30, title = "Take profit percentage(0.1%)")


curRandom = na
curRandom := nz(curRandom[1]) == 0 ? seed : GetRandom(curRandom[1])
if (strategy.position_size == 0)
    if (curRandom >= m / 2)
        strategy.entry("Enter", strategy.long)
    else
        strategy.entry("Enter", strategy.short)
        
    strategy.exit("Exit", "Enter", loss = close * stopLoss / 1000 / syminfo.mintick, profit = close * takeProfit / 1000 / syminfo.mintick)            

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(3, "Backtest Start Month")
testStartDay = input(6, "Backtest Start Day")
testStartHour = input(08, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()

더 많은