Python: формула оценки последовательности убыточных сделок

Риск системы, и ее просадка во многом зависит от последовательности нескольких убыточных сделок. Как правило MaxDD возникает как серия из нескольких убытков, а не как один большой лось.

Существует аналитическая формула, которая позволяет оценить ожидаемое количество убытков подряд, на основе количества сделок в системе и вероятности выигрыша.

LoosingStreak = LN(1 / nTradesCount)/LN(1 – WinProbability)

FYI: Логарифмы натуральные. WinProbability – проценты в долях единицы, 0.6 = 60%

Я решил эту формулу численно перепроверить и написал простенький скрипт на Python.

Скрипт показывает количество убытков подряд, и их зависимость от числа сделок, при жестко заданной вероятности.

Вот результаты моделирования при Win% = 60%

14

Названия колонок:
Trades – число сделок
Theo – количество убыточных сделок подряд, по теоретической формуле
Real – количество убыточных сделок подряд, которое показало моделирование
Error – Theo – Real

Как вы видите показатели Theo и Real практически сходятся, а Error остается постоянной. Это говорит нам о том, что теоретическая формула работает.

Код на Python:

# -*- coding: utf-8 -*-
"""
Created on Thu Jul 19 15:10:23 2012

@author: ubertrader
"""

# -*- coding: utf-8 -*-
"""
Created on Tue Jul 17 14:06:39 2012

@author: ubertrader
"""

import random 
from math import *



winperc = 0.6
MCIterations = 10000

mintr = 100
maxtr = 1000
steptr = 100

TheoStreak = []
RealStreak = []

for trcount in range(mintr, maxtr, steptr):    
    sumstreak = 0
    cnt = 0
    for mci in range(1,MCIterations):
        streak = 0
        maxstreak = 0
        
        for t in range(0, trcount):        
            if random.random() < winperc:             
                profit = 1
            else:
                profit = -1
                
            if profit > 0:            
                streak = 0
            else:            
                streak = streak + 1
                        
            maxstreak = max(streak, maxstreak)
            
        
        sumstreak = sumstreak + maxstreak
        cnt = cnt + 1
        
    #Calc streak error
    LoosingStreak = log(1/float(trcount))/log(float(1-winperc))
    avgstreak = float(sumstreak) / float(cnt)
    
    RealStreak.append(avgstreak)
    TheoStreak.append(LoosingStreak)
    

print 'Trades\tTheo\tRealAvg\tError'
idx = 0
for trcount in range(mintr, maxtr, steptr):        
    print '{0}\t{1:0.2f}\t{2:0.2f}\t{3:0.2f}'.format(trcount, TheoStreak[idx], RealStreak[idx], TheoStreak[idx] - RealStreak[idx])
    idx = idx + 1
    

    

Leave a comment