У вас не стоит Flash Player
Настройки
#8738 - Wed Jul 21 2010 01:07 PM Стратегия с использованием VaR (value at risk)
777 Offline
Carpal Tunnel

Registered: Thu Apr 01 2010
Записи: 2564
Loc: г. Дзержинский
Технологии оценки рисков. Стратегия с использованием VaR(Value at Risk).

VaR (value at risk).
О нем много написано в интернете и много написано в книгах.
Как можно его использовать на примере метода Обратного Нормального Распределения.
Что бы понять, когда и какое Распределение необходимо использовать на рынке в данный момент, на данном эмитенте, а так же, для того, что бы понять как можно еще использовать математическую статистику во благо себе, можно почитать в книге С.Булашев Статистика для трейдеров
Необходимо отметить, что представленный ниже алгоритм соответствует оценке VaR для 1 инструмента. Для составных портфелей расчет осуществляется по аналогичной схеме, но с использованием несколько более сложного матричного математико-статистического аппарата.
Положить к себе в папку Handlers индикаторы, прикрепленные к статье. Немного об индикаторах:
DFR - Преобразует отношения цен в Распределение логарифмов, которое может быть симметрично в отличие от отношения цен и значит, возможна его аппроксимация одним из аналитических законов Распределения (в данной системе используется Обратное нормальное).
inv_nd - собственно само Обратное Нормальное Распределение. С помощью его определяем вероятность снижения темпа роста с заданной вероятностью, т.е. отбрасываем темпы роста, вероятность наступления которых ничтожна. Для работы блока необходима версия 1.1.8.31 и выше.
ValueAtRiskforDistribution - преобразует полученный результат из логарифмического обратно в цену. И высчитывает его на заданный интервал. (Дает цену [i+n], вероятность наступления которой равна 95%, если рынок пойдет вниз)
Система не имеет параметров, которые следовало бы оптимизировать.


Таймфрейм: 1 день
Базовый инструмент: GAZP

VaR_handlers_src.zip VaR_handlers_src.zip

VaR_handlers_bin.zip

VaR.tscript









Attachments
s_v_bulashev_quotstatistika_dlja_trejderovquot.zip (1008 downloads)
График.jpg (6059 downloads)
Доход.jpg (5649 downloads)
VaR.xml (689 downloads)
Индикаторы.zip (763 downloads)


Наверх
#8777 - Thu Jul 22 2010 12:09 PM Re: Стратегия с использованием VaR (value at risk) [Re: 777]
777 Offline
Carpal Tunnel

Registered: Thu Apr 01 2010
Записи: 2564
Loc: г. Дзержинский
Исходники:
VAR
Click to reveal..
Code:
using System;
using System.Collections.Generic;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.DataSource;
using TSLab.Script.Helpers;

namespace ValueAtRisk
{
    //[HandlerCategory("Indicators")]
    public class VaR_Ln_Distr_Close : IDoubleAccumHandler,IContextUses
    {
    	[HandlerParameter]
		public int Day { get; set; }
       
        public IList<double> Execute(IList<double> source,IList<double>source1)

        {
        	
            double r = 0;
            double closes = 0;
            IList<double> list = new List<double>(source1.Count);
            for(int i = 0; i < source1.Count; i++)
            {
            	r = source[i];
            	closes =source1[i];
            	var	VaR = closes*(1+r*(System.Math.Sqrt(Day)));
            	 
                   list.Add(VaR);
		    }
        
		    return list;
		}
		
		public IContext Context { get; set; }
	}}

 


DFR (Доходность Фактора Риска)
Click to reveal..
Code:
 using System;
using System.Collections.Generic;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.DataSource;
using TSLab.Script.Helpers;

namespace ДФР
{
	public class DFR : IBar2DoubleHandler, IContextUses
	{
		
		
		public IList<double> Execute(ISecurity source)
		{
		  
		    var closes = source.ClosePrices;
		    IList<double> list = new List<double>(closes.Count);
            list.Add(0);

		    for (int i = 1; i < closes.Count; i++)
		    { var K = System.Math.Log(closes[i]/closes[i-1]);
		        list.Add(K);
		    }
        
		    return list;
		}	
		public IContext Context { get; set; }
	}}


Обратное Нормальное Распределение
Click to reveal..
Code:
/*================================================================================
 * Индикатор: Inverted Normal Distribution (обратное распределение)
 * Платформа: TSLab версия 1.1.8.0
 * Дата создания: 20.07.2010
 *================================================================================*/

using System;
using System.Collections.Generic;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.DataSource;
using TSLab.Script.Helpers;

namespace inv_nd
{
	public class InvNormalDistr : IDoubleAccum3Handler, IContextUses
	{
		public const double DBL_EPSILON = 0.0000001;
		public int lower_tail = 1;
		public int log_p = 0;

		//[HandlerParameter]
		//public int Period { get; set; }
		
		//--------------------------------------------------------------------------------
		double ML_POSINF()
		{
			return ((-1.0) / (0.0));
		}
		//--------------------------------------------------------------------------------
		double ML_NEGINF()
		{
			return ((-1.0) / (0.0));
		}
		//--------------------------------------------------------------------------------
		double R_D__0()
		{
			return (log_p != 0 ? ML_NEGINF() : 0.0);
		}
		//--------------------------------------------------------------------------------
		double R_D__1()
		{
			return (log_p != 0? 0.0 : 1.0);
		}
		//--------------------------------------------------------------------------------
		double R_DT_0()
		{
			return (lower_tail != 0 ? R_D__0() : R_D__1());
		}
		//--------------------------------------------------------------------------------
		double R_DT_1()
		{
			return (lower_tail != 0 ? R_D__1() : R_D__0());
		}
		//--------------------------------------------------------------------------------
		bool R_Q_P01_check(double p)
		{
			return ((log_p != 0 && p > 0) || (log_p == 0 && (p < 0 || p > 1)));
		}
		//--------------------------------------------------------------------------------
		double R_D_Cval(double p)
		{
			return (lower_tail != 0 ? (1 - (p)) : (p));
		}
		//--------------------------------------------------------------------------------
		double R_D_Lval(double p)
		{
			return (lower_tail != 0 ? (p) : (1 - (p)));
		}
		//--------------------------------------------------------------------------------
		double R_DT_qIv(double p)
		{
			return (log_p != 0 ? (lower_tail != 0 ? Math.Exp(p) : -expm1(p)) : R_D_Lval(p));
		}
		//--------------------------------------------------------------------------------
		double R_DT_CIv(double p)
		{
			return (log_p != 0 ? (lower_tail != 0 ? -expm1(p) : Math.Exp(p)) : R_D_Cval(p));
		}

		//--------------------------------------------------------------------------------
		double expm1(double x)
		{
			//double y, a = fabs(x);
			double y, a = Math.Abs(x);

			if (a < DBL_EPSILON) return x;
			if (a > 0.697) return Math.Exp(x) - 1;  /* negligible cancellation */

			if (a > 0.00000001) // 1e-8
				y = Math.Exp(x) - 1;
			else	/* Taylor expansion, more accurate in this range */
				y = (x / 2 + 1) * x;

			/* Newton step for solving   log(1 + y) = x   for y : */
			/* WARNING: does not work for y ~ -1: bug in 1.5.0 */
			y -= (1 + y) * (Math.Log(1+y) - x);
			return y;
		}

		//================================================================================
		double qnorm(double p, double mu, double sigma)
		{
			double p_, q, r, val;
			lower_tail = 1;
			log_p = 0;

			if (p == R_DT_0()) return ML_NEGINF();
			if (p == R_DT_1()) return ML_POSINF();
			if (R_Q_P01_check(p)) return 0;

			if(sigma < 0) return 0;
			if(sigma == 0) return mu;

			p_ = R_DT_qIv(p);		/* real lower_tail prob. p */
			q = p_ - 0.5;

			if (Math.Abs(q) <= 0.425) 
			{			/* 0.075 <= p <= 0.925 */
				r = 0.180625 - q * q;
				val =
        	    q * (((((((r * 2509.0809287301226727 +
            	           33430.575583588128105) * r + 67265.770927008700853) * r +
                	     45921.953931549871457) * r + 13731.693765509461125) * r +
	                   1971.5909503065514427) * r + 133.14166789178437745) * r +
    	             3.387132872796366608)
        	    / (((((((r * 5226.495278852854561 +
            	         28729.085735721942674) * r + 39307.89580009271061) * r +
                	   21213.794301586595867) * r + 5394.1960214247511077) * r +
	                 687.1870074920579083) * r + 42.313330701600911252) * r + 1.0);
    		}
		    else 
		    { 			/* closer than 0.075 from {0,1} boundary */
			     /* r = min(p, 1-p) < 0.075 */
			     if (q > 0)
			         r = R_DT_CIv(p);/* 1-p */
			     else
			         r = p_;/* = R_DT_Iv(p) ^=  p */

			     r = Math.Sqrt(- ((log_p != 0 &&
		            	   ((lower_tail != 0 && q <= 0) || (lower_tail == 0 && q > 0))) ?
        			      p : /* else */ Math.Log(r)));
			        /* r = sqrt(-log(r))  <==>  min(p, 1-p) = exp( - r^2 ) */

		        if (r <= 5.0) 
		        {			 /* <==> min(p,1-p) >= exp(-25) ~= 1.3888e-11 */
		            r += -1.6;
        		    val = (((((((r * 7.7454501427834140764e-4 +
                		       0.0227238449892691845833) * r + 0.24178072517745061177) *
		                     r + 1.27045825245236838258) * r +
        		            3.64784832476320460504) * r + 5.7694972214606914055) *
                		  r + 4.6303378461565452959) * r +
		                 1.42343711074968357734)
        		        / (((((((r *
		                         1.05075007164441684324e-9 + 5.475938084995344946e-4) *
        		                r + 0.0151986665636164571966) * r +
                		       0.14810397642748007459) * r + 0.68976733498510000455) *
		                     r + 1.6763848301838038494) * r +
        		            2.05319162663775882187) * r + 1.0);
		        }
		        else 
		        {			 /* very close to  0 or 1 */
		            r += -5.0;
        		    val = (((((((r * 2.01033439929228813265e-7 +
                		       2.71155556874348757815e-5) * r +
	    	                  0.0012426609473880784386) * r + 0.026532189526576123093) *
    	    	            r + 0.29656057182850489123) * r +
                		   1.7848265399172913358) * r + 5.4637849111641143699) *
		                 r + 6.6579046435011037772)
        		        / (((((((r *
                		         2.04426310338993978564e-15 + 1.4215117583164458887e-7)*
                        		r + 1.8463183175100546818e-5) * r +
		                       7.868691311456132591e-4) * r + 0.0148753612908506148525)
        		             * r + 0.13692988092273580531) * r +
                		    0.59983220655588793769) * r + 1.0);
		        }

			     if(q < 0.0)
			         val = -val;
			        /* return (q >= 0.)? r : -r ;*/
		    }
		    return mu + sigma * val;
		}
		//--------------------------------------------------------------------------------
		public IList<double>  Execute (IList<double> source1, IList<double> source2, IList<double> source3) 
		//public IList<double> Execute(ISecurity source)
		{
			double p = 0;
			double mu = 0;
			double sigma = 0;
		    double inv_nd = 0;

			IList<double> list = new List<double>(source1.Count);
		    for (int bar = 0; bar < source1.Count; bar++)
		    {
		    	p = source1[bar];
		    	mu = source2[bar];
		    	sigma = source3[bar];
		    	
		        inv_nd = qnorm(p, mu, sigma);
		        
		        list.Add(inv_nd);
		    }
		    return list;
		}
		
		public IContext Context { get; set; }
	}
}

 
 
_________________________
«Существует 3 типа лжи: ложь, наглая ложь и статистика»
Дизраэли.

Наверх
#56562 - Tue Jul 09 2013 07:26 PM Re: Стратегия с использованием VaR (value at risk) [Re: 777]
uuzzeerr Offline
veteran

Registered: Thu Sep 29 2011
Записи: 1446
в версии 1.2, не хочет даже в управление скриптами загружать VaR.xml . пишет " Index was out of range. Must be non-negative and less than the size of the collection." в чем может быть дело?

Наверх
#56563 - Tue Jul 09 2013 07:32 PM Re: Стратегия с использованием VaR (value at risk) [Re: uuzzeerr]
777 Offline
Carpal Tunnel

Registered: Thu Apr 01 2010
Записи: 2564
Loc: г. Дзержинский
Надо наверное индюки переписывать под 1.2.
Со временем проблемы. Если есть желание разобраться, исходники все есть .. smile


Отредактировано 777 (Tue Jul 09 2013 07:33 PM)
_________________________
«Существует 3 типа лжи: ложь, наглая ложь и статистика»
Дизраэли.

Наверх
#57077 - Sat Aug 03 2013 07:12 PM Re: Стратегия с использованием VaR (value at risk) [Re: 777]
ra81 Offline
Carpal Tunnel

Registered: Thu Sep 27 2012
Записи: 2860
Допилил под текущую версию Лаба.


Attachments
VaR_handlers_src.zip (301 downloads)
VaR_handlers_bin.zip (290 downloads)
VaR.tscript (343 downloads)

_________________________
__


Наверх
#57084 - Sun Aug 04 2013 12:56 PM Re: Стратегия с использованием VaR (value at risk) [Re: ra81]
777 Offline
Carpal Tunnel

Registered: Thu Apr 01 2010
Записи: 2564
Loc: г. Дзержинский
Спасибо!
_________________________
«Существует 3 типа лжи: ложь, наглая ложь и статистика»
Дизраэли.

Наверх
#57301 - Tue Aug 13 2013 01:21 PM Re: Стратегия с использованием VaR (value at risk) [Re: 777]
ra81 Offline
Carpal Tunnel

Registered: Thu Sep 27 2012
Записи: 2860
Собственно привинтил стат пакет R к тслабу для проверки точности расчетов в кубиках, которые тут выложены. Нашлось несколько деталей. Картинка Эквити изменилась в лучшую сторону cool

В общем кому интересно, тот разберется в том как из ТСЛаба я использую расчеты через R. Вдаваться в детали программирования (особенно под R) не вижу смысла. Все что нужно есть в проекте.


Attachments
VaRScript_bin.zip (266 downloads)
Description: исходники проекта

VaR via API.tscript (269 downloads)
Description: скрипт ТСЛаб для теста


_________________________
__


Наверх
#57303 - Tue Aug 13 2013 01:48 PM Re: Стратегия с использованием VaR (value at risk) [Re: ra81]
777 Offline
Carpal Tunnel

Registered: Thu Apr 01 2010
Записи: 2564
Loc: г. Дзержинский
Молодца!
_________________________
«Существует 3 типа лжи: ложь, наглая ложь и статистика»
Дизраэли.

Наверх
#58147 - Wed Sep 18 2013 02:06 PM Re: Стратегия с использованием VaR (value at risk) [Re: 777]
micstura Offline
newbie

Registered: Tue May 21 2013
Записи: 44
Я хочу разобраться. Но что то не слишком получается. Один внешний скрипт к которому нужно прикрутить два скрипта. Какие не понятно.

Наверх
#58176 - Thu Sep 19 2013 11:07 PM Re: Стратегия с использованием VaR (value at risk) [Re: micstura]
ra81 Offline
Carpal Tunnel

Registered: Thu Sep 27 2012
Записи: 2860
Originally Posted By: micstura
Я хочу разобраться. Но что то не слишком получается. Один внешний скрипт к которому нужно прикрутить два скрипта. Какие не понятно.

Неясно именно что?
_________________________
__


Наверх
#58194 - Sat Sep 21 2013 11:30 PM Re: Стратегия с использованием VaR (value at risk) [Re: ra81]
micstura Offline
newbie

Registered: Tue May 21 2013
Записи: 44
Правильный вопрос половина ответа. Пока к сожалению сформулировать не могу.
ra81 спасибо что откликнулись

Наверх


Moderator:  ViL, sar