📘 프로젝트 명:Excel VBA + 8단계 : 조건매매 시스템에 리스크 관리 로직 추가하기 – 손절, 일간 제한, 휴식 로직까지 자동화

반응형

🔍 개요

아무리 수익성 있는 전략이라도 리스크 관리가 없다면 모든 수익은 단 한 번의 손실로 무너질 수 있습니다.
조건매매 자동화 시스템에서 리스크 관리는 단순한 보조 기능이 아니라, 수익을 보전하고 계좌를 지키기 위한 핵심 전략입니다.

이 단계에서는 Excel VBA 기반 자동매매 시스템에 다음과 같은 리스크 제어 로직을 추가하는 방법을 다룹니다:


✅ 주요 리스크 관리 항목

항목 설명
✅ 일간 최대 손실 제한 하루 -5% 이상 손실 시 자동 매매 중지
✅ 연속 손실 제한 손실이 연속 3회 발생하면 휴식 또는 정지
✅ 일일 거래 횟수 제한 하루 최대 거래 10회까지만 허용
✅ 거래 가능 시간 제한 장 중 특정 시간만 거래 (예: 09:10~15:20)

📦 필수 데이터 구조 (전제조건)

열 번호내용
51열 매매 상태 (📥 매수, 📤 매도(익절), 📤 매도(손절) 등)
54열 수익률 (거래당 수익률 %, 소수로 저장됨)
1열 날짜 ('2025/04/20 등)

✅ 왜 RiskModule로 따로 분리해야 하나요?

이유 설명
📦 기능 역할 분리 Module1은 실시간 매매/시그널, ReportModule은 분석, RiskModule은 제어 기능
🛠 유지보수 쉬움 리스크 로직만 수정하거나 ON/OFF 하고 싶을 때 빠르게 찾고 제어 가능
🚧 에러 범위 최소화 실시간 함수와 섞이면 디버깅이 어려워질 수 있음
🔄 확장성 확보 향후 거래 제한 시간, 계좌 상태 검사, 전략 차단 스위치 등 추가 로직 삽입이 용이

🧱 추천 모듈 구조 예시

모듈이름 용도
Module1 실시간 기록, 조건매매 시그널, 기술지표 계산 (1~5단계)
ReportModule 전략 리포트 생성, 전략별 성과 분석 (6~7단계)
RiskModule 리스크 관리 (일간 손절, 연속 손실, 거래 제한 등 – 8단계) ✅ ← 여기에 넣으세요

✅ 작업 절차 요약

  1. Alt + F11 → VBA 편집기 열기
  2. 삽입 → 모듈 클릭 → Module3 생성됨
  3. 이름을 RiskModule로 변경 (좌측 모듈 이름 우클릭 → 이름 바꾸기)
  4. 아래 함수들 붙여넣기:
    • 일간손실초과()
    • 연속손실초과()
    • 일일거래횟수초과()
    • (선택) 시간제한확인()

🧠 VBA 리스크 관리 코드 – 실전 적용 예제

✅ 1. 일간 누적 손실 체크 & 자동 중단

vba(RiskModule.bas) <= 새로 생성함.

Function 일간손실초과() As Boolean
    Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
    Dim today As String: today = Format(Date, "yyyy/mm/dd")
    Dim lastRow As Long: lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    
    Dim sumProfit As Double, r As Long
    For r = 7 To lastRow
        If ws.Cells(r, 1).Value = "'" & today Then
            If IsNumeric(ws.Cells(r, 54).Value) Then
                sumProfit = sumProfit + ws.Cells(r, 54).Value
            End If
        End If
    Next r
    
    If sumProfit < -0.05 Then ' -5% 이상 손실 시
        MsgBox "❗일간 최대 손실 초과. 자동 중단됩니다.", vbCritical
        일간손실초과 = True
    Else
        일간손실초과 = False
    End If
End Function

✅ 2. 연속 손실 N회 체크 (예: 3회)

vba(RiskModule.bas)

Function 연속손실초과() As Boolean
    Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
    Dim r As Long: r = ws.Cells(ws.Rows.Count, 54).End(xlUp).Row
    
    Dim count As Long: count = 0
    Dim i As Long
    For i = r To 7 Step -1
        If ws.Cells(i, 51).Value Like "*매도*" Then
            If ws.Cells(i, 54).Value < 0 Then
                count = count + 1
                If count >= 3 Then
                    MsgBox "❗연속 3회 손실 발생. 전략 정지!", vbExclamation
                    연속손실초과 = True
                    Exit Function
                End If
            Else
                Exit For ' 손실이 아닌 경우 → 연속 끊김
            End If
        End If
    Next i
    연속손실초과 = False
End Function

✅ 3. 일일 거래 횟수 제한 (예: 10회)

vba(RiskModule.bas)

Function 일일거래횟수초과() As Boolean
    Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
    Dim today As String: today = Format(Date, "yyyy/mm/dd")
    Dim r As Long, count As Long: count = 0
    For r = 7 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
        If ws.Cells(r, 1).Value = "'" & today Then
            If ws.Cells(r, 51).Value Like "*매도*" Then
                count = count + 1
            End If
        End If
    Next r
    If count >= 10 Then
        MsgBox "❗일일 거래 횟수 초과. 전략 일시 중단!", vbInformation
        일일거래횟수초과 = True
    Else
        일일거래횟수초과 = False
    End If
End Function

🔁 리스크 제어 조건

vba(Module1.bas)

If 일간손실초과() Or 연속손실초과() Or 일일거래횟수초과() Then
    isRunning = False
    Exit Sub
End If

🔁 기록저장()  함수에 적용된코드(리스크 제어 조건)

vba(Module1.bas)

Sub 기록저장()
    ' 데이터 수집 및 저장
    Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
    Dim r As Long: r = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1

    ws.Cells(r, 1).Value = Format(Now, "yyyy/mm/dd")
    ws.Cells(r, 2).Value = Format(Now, "hh:nn:ss")
    ' ... 나머지 실시간 데이터 저장

    ' 📍 ✅ 리스크 검사 위치: 여기 삽입!
    If 일간손실초과() Or 연속손실초과() Or 일일거래횟수초과() Then
        isRunning = False
        MsgBox "📛 리스크 조건에 의해 자동 종료되었습니다.", vbCritical
        Exit Sub
    End If

    ' 기술지표 계산
    ' ...
    
    ' 시그널 감지
    조건매매시그널_감지 r

    ' 매매 판단
    조건매매_매수매도판단 r
End Sub

✅ 흐름 요약

단계 설명
1단계 실시간 DDE 값 저장 (ws.Cells...)
✅ 2단계 리스크 검사 후 즉시 종료 여부 판단
3단계 MA, BB 등 기술지표 계산
4단계 시그널 감지 (조건매매시그널_감지)
5단계 매매 실행 판단 (조건매매_매수매도판단)

🛠 삽입에 대한 추가 팁

  • 이 위치에 넣으면 실시간 매매 전에 항상 리스크를 체크하게 됩니다.
  • 조건을 만족하면 Exit Sub으로 해당 기록을 저장만 하고, 매매 판단은 건너뜁니다.
  • 장 종료 검사(Time 조건) 와도 별도로 병행할 수 있어요.

✅ 조건매매_매수매도판단()에 넣는 건 어떤가요?

위치 추천여부 설명
기록저장() 내 ✅ 매우 추천 실시간 루틴 전체 중단에 적합
조건매매_매수매도판단() 내 ⚠️ 부분 사용은 OK "직전 손실 후 바로 다음 매매" 같은 미세제어 시 사용 가능

✅리스크 제어 조건-결론

리스크 제어 코드는 반드시 기록저장() 함수 내
"기술지표 계산 및 매매 시그널 감지 전에"
삽입해야 시스템이 신속하게 위험을 차단할 수 있습니다.


📍 응용 확장: 거래 가능 시간 제한(선택가능)

vba(Module1.bas)

If Time < TimeSerial(9, 10, 0) Or Time > TimeSerial(15, 20, 0) Then
    Exit Sub ' 거래 불가 시간대
End If

📍기록저장()  함수에 적용된코드(응용 확장: 거래 가능 시간 제한)

vba(Module1.bas)

Sub 기록저장()
    ' 거래 가능 시간 확인 (예: 09:10~15:20 사이만 허용)
    If Time < TimeSerial(9, 10, 0) Or Time > TimeSerial(15, 20, 0) Then
        Exit Sub ' 거래 불가 시간대엔 저장 및 매매 중지
    End If

    ' 기존 데이터 저장
    Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
    Dim r As Long: r = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1

    ' 데이터 저장
    ws.Cells(r, 1).Value = Format(Now, "yyyy/mm/dd")
    ws.Cells(r, 2).Value = Format(Now, "hh:nn:ss")

    ' ✅ 리스크 검사
    If 일간손실초과() Or 연속손실초과() Or 일일거래횟수초과() Then
        isRunning = False
        Exit Sub
    End If

    ' 기술지표 계산...
    ' 조건매매시그널_감지 r
    ' 조건매매_매수매도판단 r
End Sub

✅ 왜 맨 앞줄이 좋은가요?

이유 설명
💡 시간 외 거래 방지 장 시작 전(예: 08:45) 또는 마감 후(15:45) 자동 차단
⚙️ 불필요한 저장 방지 시간 외에는 행도 추가하지 않음 (r 계산도 안 함)
🔒 실전 연동 시 필수 실거래 API는 정해진 시간 외 주문 시 에러 발생 위험 있음

✅ 필요 시 설정 범위 변경 가능

시간 구간코드 예시
08:59~15:20 Time < TimeSerial(8, 59, 0) Or Time > TimeSerial(15, 20, 0)
점심시간 제외 Or (Time > TimeSerial(11, 50, 0) And Time < TimeSerial(13, 0, 0)) 등도 추가 가능

✅거래 가능 시간 제한-결론

📍 거래 가능 시간 제한 코드는 기록저장() 함수 가장 상단에 삽입하세요.

이로써 시간 외 기록 + 매매 시그널 실행을 원천 차단하여 시스템 안정성이 대폭 향상됩니다.

📝  적용해 보시고 모르는것 있으시면 댓글 달아주세요. 확인해서 알려드릴께요 !!! 

 

반응형