Invest-currency.ru

Как обезопасить себя в кризис?
4 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Простой динамический анализ

Простой динамический анализ

Обзор базовых методов прогнозирования

Каждое значение временного ряда может состоять из следующих составляющих: тренда, циклических, сезонных и случайных колебаний. Метод простого динамического анализа используется для определения тренда имеющегося временного ряда. Данную составляющую можно рассматривать в качестве общей направленности изменений значений ряда или основной тенденции ряда. Циклическими называются колебания относительно линии тренда для периодов свыше одного года. Такие колебания в рядах финансовых и экономических показателей часто соответствуют циклам деловой активности: резкому спаду, оживлению, бурному росту и застою. Сезонными колебаниями называются периодические изменения значений ряда на протяжении года. Их можно вычленить после анализа тренда и циклических колебаний. Наконец, случайные колебания выявляются путем снятия тренда, циклических и сезонных колебаний для данного значения. Остающаяся после этого величина и есть беспорядочное отклонение, которое необходимо учитывать при определении вероятной точности принятой модели прогнозирования.

Метод простого динамического анализа исходит из предпосылки, что прогнозируемый показатель (Y) изменяется прямо (обратно) пропорционально с течением времени. Поэтому для определения прогнозных значений показателя Y строится, например, следующая зависимость:

(1),

где t — порядковый номер периода.

Параметры уравнения регрессии (a, b) находятся, как правило, методом наименьших квадратов. Существуют также другие критерии адекватности ( функции потерь), например метод наименьших модулей или метод минимакса. Подставляя в формулу (1) нужное значение t, можно рассчитать требуемый прогноз.

Авторегрессионые зависимости

В основу этого метода заложена достаточно очевидная предпосылка о том, что экономические процессы имеют определенную специфику. Они отличаются, во-первых, взаимозависимостью и, во-вторых, определенной инерционностью. Последняя означает, что значение практически любого экономического показателя в момент времени t зависит определенным образом от состояния этого показателя в предыдущих периодах ( в данном случае мы абстрагируемся от влияния других факторов), т.е. значения прогнозируемого показателя в прошлых периодах должны рассматриваться как факторные признаки. Уравнение авторегрессионой зависимости в наиболее общей форме имеет вид:

(2),

где Yt — прогнозируемое значение показателя Y в момент времени t;
Yt-i — значение показателя Y в момент времени (t-i);
Aii-й коэффициент регрессии.

Достаточно точные прогнозные значения могут быть получены уже при k = 1. На практике также нередко используют модификацию уравнения (2), вводя в него в качестве фактора период времени t, то есть объединяя методы авторегрессии и простого динамического анализа. В этом случае уравнение регрессии будет иметь вид:

(3)

Коэффициенты регрессии данного уравнения могут быть найдены методом наименьших квадратов. Соответствующая система нормальных уравнений будет иметь вид:

(4)

где j — длина ряда динамики показателя Y, уменьшенная на единицу.

Для характеристики адекватности уравнения авторегрессионой зависимости можно использовать величину среднего относительного линейного отклонения:

(5),

где Y * i — расчетная величина показателя Y в момент времени i;
Yi — фактическая величина показателя Y в момент времени i.

Если e

|следующая лекция ==>
Понятие прогноза|Многофакторный регрессионный анализ

Дата добавления: 2014-01-07 ; Просмотров: 628 ; Нарушение авторских прав?

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Статический и динамический анализ кода

Мне, как разработчику инструмента статического анализа PVS-Studio, часто приходят предложения, реализовать в инструменте новую диагностику. Многие из предложений, опираются на опыт использования динамических анализаторов кода, например, Valgrind. К сожалению, часто это невозможно или почти невозможно. В этой статье я хочу кратко объяснить, почему статические анализаторы кода не могут делать то же самое, что динамические анализаторы и наоборот. Каждый из них силён в своё области. Один вид анализа не способен заменить другой, зато они отлично дополняют друг друга.

Статический анализ кода — это процесс выявления ошибок и недочетов в исходном коде программ. Статический анализ можно рассматривать как автоматизированный процесс обзора кода (code review).

Динамический анализ кода — это способ анализа программы непосредственно при ее выполнении.

Я часто слышу приблизительно следующую мысль:

У вас отличный инструмент. Но он не находит некоторые ошибки. Например, недавно Valgrind нашёл вот такую ошибку, а анализатор кода PVS-Studio промолчал. Было бы замечательно, добавить в PVS-Studio диагностику вот таких и таких ошибок. Тогда станет возможным использовать только один инструмент, что будет удобнее.

Да, пользоваться только одним инструментом, было бы удобнее и проще. К сожалению, статический анализатор, не может выполнять многие проверки, которые осуществляют динамические анализаторы. Это не значит, что статический анализ хуже. Это просто две разные технологии, дополняющие друг друга. Попробую объяснить имеющиеся у них ограничения.

Предположим, что есть функция вида:

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

Чтение строки из файла, это крайний случай. Облегчим задачу. Предположим, что строка формируется где-то в другой функции. Тогда, теоретически анализ возможен. На практике же это нереально сложно. Нужно понять, в какой последовательности будет выполняться код, понять какие значения могут принимать переменные, что будет записано в буферы в памяти, возможен ли вариант, когда возникнет переполнение.

Хранение данных в строке приведено, чтобы продемонстрировать, как не просто работать статическому анализатору. И таких сложностей при анализе возникает масса. Чем дальше от места вычисления какого-то значения происходит его использование, тем сложней анализ. Если место формирования строки отделено от её использования вызовами нескольких функций, то я не представляю насколько сложен должен быть анализатор и сколько памяти ему потребуется. Количество возможных ветвлений и значений переменных растёт невообразимо быстро. Чтобы найти такую ошибку придётся практически виртуально выполнить программу, причём во всех возможных вариантах ветвления. Нереально сложная алгоритмическая задача, которая в добавок потребует недостижимых вычислительных ресурсов.

Читать еще:  Анализ факторов изменения прибыли

И самое главное, преодолевать все эти сложности просто ненужно! То, что для статического анализа невообразимо сложно, легко решается динамическим анализатором. Динамический анализатор видит, что затирается маркер после массива, а значит произошел выход за границы массива.

Более того, динамический анализатор решит задачу выхода за границу массива, даже если строка прочитана из файла!

Означает ли это, что динамический анализ лучше? Быть может стоит лучше усовершенствовать динамический анализатор, чтобы он умел тоже самое, что и статический?

И вновь ответ: к сожалению, ничего не получится. Есть задачи, с которыми легко справляется статический анализ и которые неразрешимы при динамическом анализе.

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

Для динамического анализатора в приведённом ниже коде нет никаких проблем. Сравнивается часть буфера. Ничего подозрительного. Полным полно ситуаций, когда функция memcmp() сравнивает не весь выделенный буфер памяти, а только его часть. Это очень частое явление, когда используется только часть буфера. Ругаться динамическому анализатору здесь не на что.

А вот статический анализатор смотрит на код и понимает, что количество сравниваемых байт, скорее всего вычисляется неверно. Пример, взятый из реального open source проекта:

Ошибка в том, что не там поставлена скобка. Статический анализатор легко замечает аномалию в коде и сообщает об этом. Для динамического анализатора здесь всё корректно. Сравнивается один байт. Бывает. Сравнение только одного байта частая ситуация, особенно в коде, построенного на макросах.

Заключение. Мы рассмотрели два примера ошибок. Каждый из анализаторов способен обнаружить только одну из них в силу тех принципов, которые положены в основу их работы. Как бы не хотелось, обойтись только одним инструментом, это невозможно. Наилучший результат можно получить только применяя статический и динамический анализ совместно.

Найдите ошибки в своем C, C++, C# и Java коде

Предлагаем попробовать проверить код вашего проекта с помощью анализатора кода PVS-Studio. Одна найденная в нём ошибка скажет вам о пользе методологии статического анализа кода больше, чем десяток статей.

Ряды динамики в статистике

9.3. Методы анализа основной тенденции в рядах динамики

Комплексный анализ динамических рядов, как правило, включает не только расчет характеристик интенсивности изменения уровней ряда при переходе от одного момента или промежутка времени к другому (абсолютных приростов, коэффициентов и темпов роста и прироста), а также нахождение обобщенных средних характеристик (среднего уровня ряда, средних темпов роста и прироста), но и выявление основных закономерностей в развитии динамического ряда. Определение тенденции развития, построение модели, описывающей изменение явления во времени, прогнозирование явления — все это важнейшие задачи при изучении динамических рядов экономических и социальных показателей.

На формирование уровней динамического ряда влияет множество различных факторов, которые по характеру воздействия можно объединить в три группы:

  1. действующие долговременно и определяющие основную тенденцию развития явления;
  2. действующие периодически — сезонные и циклические колебания;
  3. вызывающие случайные колебания уровней динамического ряда.

Соответственно, для анализа закономерности изменения уровней ряда динамики во времени применяют следующую модель:

где Тt — основная тенденция ряда ( тренд );

St — циклические (в частности, сезонные) колебания;

еt — случайные колебания.

В аддитивной модели ряд динамики представлен как сумма перечисленных компонент [yt = Tt + St + et], в мультипликативной модели — как их произведение []. В дальнейшем будем исходить из предположения мультипликативной формы связи между компонентами ряда динамики.

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

К методам выявления основной тенденции развития динамического ряда (Тt) относятся:

  • метод укрупнения интервалов;
  • метод скользящей средней;
  • аналитическое выравнивание динамических рядов.

Рассмотрим их подробнее.

9.3.1. Метод укрупнения интервалов

Применение метода укрупнения интервалов рассмотрим на основе данных табл. 9.13.

Таблица 9.13. Поставки товаров в торговую сеть

МесяцПоставка товаров, млн руб.
Январь80
Февраль78
Март75
Апрель80
Май82
Июнь85
Июль87
Август82
Сентябрь85
Октябрь84
Ноябрь86
Декабрь88

Как видим, визуальный анализ данных не позволяет сделать какие-либо выводы о наличии тенденции в данном динамическом ряду: в отдельные месяцы, например, в феврале, марте, августе, октябре и декабре, поставки товаров снижались по сравнению с предыдущими месяцами, в остальные периоды — возрастали.

Читать еще:  Анализ эффективности это

Применим к исходным данным метод укрупнения интервалов, образовав новый динамический ряд с более крупными временными периодами — кварталами, и рассчитаем средний месячный объем поставок в каждом квартале (табл. 9.14).

Таблица 9.14. Среднемесячные поставки товаров

КварталСреднемесячные поставки товаров, млн руб.
I77.7
II82.3
III84.0
IV84.7

Итак, по новым, более крупным интервалам уже четко видно, что значения исследуемого признака во временном аспекте имеют тенденцию к возрастанию.

Применение рассмотренного метода в основном ограничивается теми ситуациями, когда исходные данные относятся к дням, неделям или месяцам года, так как значения исследуемого признака по более мелким временным интервалам больше подвержены случайным колебаниям. Если временные промежутки представляют собой годы, то укрупнение интервалов становится малоэффективным.

9.3.2. Метод скользящей средней

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

Скользящими (подвижными) средними называются средние арифметические значения показателя, исчисленные по новым m-членным укрупненным интервалам. Правила построения этих интервалов следующие. Первый из интервалов включает первые m уровней ряда динамики, второй интервал образуется путем исключения первого члена укрупненного интервала и замены его последующим элементом ряда динамики, имеющим номер (m + 1) и т.д. — до включения в интервал последнего уровня ряда. По вычисленным подобным путем подвижным средним делают вывод о существовании тенденции в динамическом ряду.

Если в качестве укрупненного интервала используют период в три месяца, то первая подвижная трехчленная средняя вычисляется как средняя арифметическая из данных за январь, февраль и март, вторая — как средняя арифметическая из данных за февраль, март, апрель и т.д. Значения подвижных средних относят к конкретному временному периоду, соответствующему середине укрупненного интервала.

Проведем сглаживание ряда методом скользящей средней по трем членам (табл. 9.15).

Таблица 9.15. Сглаживание ряда динамики методом скользящей средней по трем членам

В нашем примере первая скользящая средняя относится к февралю, вторая — к марту и т. д.

В тех случаях, когда сглаживание проводится по четному числу уровней ряда динамики, середина временного интервала сглаживания будет находиться между двумя моментами (периодами) времени. Например, если проводить сглаживание по четырем членам, середина первого интервала будет находиться между февралем и мартом, второго интервала — между мартом и апрелем и т.д. В таких случаях возникает необходимость центрирования полученных результатов для отнесения сглаженных значений показателя к конкретным периодам или моментам времени. Расчет центрированных скользящих средних может проводиться в два этапа:

  1. определение скользящих сумм и нецентрированных скользящих средних по четному числу уровней ряда динамики;
  2. исчисление центрированных скользящих средних из двух смежных ранее исчисленных нецентрированных скользящих средних и отнесение их к соответствующим периодам или моментам времени.

Методика расчета центрированных скользящих средних показана ниже (табл. 9.16).

Таблица 9.16. Сглаживание ряда динамики методом скользящей средней по четырем членам

9.3.3. Аналитическое сглаживание (выравнивание) рядов динамики

Аналитическое выравнивание динамических рядов — это нахождение определенной модели (уравнения тренда), которая математически описывает тенденцию развития явления во времени. При этом уровни показателя рассматриваются только как функция от времени. В отличие от рассмотренных выше методов, таких, как укрупнение интервалов, скользящих средних, направленных в основном на то, чтобы ответить на вопрос: есть ли тенденция в динамическом ряду или нет, и определить ее направление, аналитическое выравнивание позволяет более точно установить характер развития явления, а главное — описать его математически, уловить все нюансы и направления развития и, что, пожалуй, наиболее интересно, использовать в дальнейшем полученную модель для прогнозирования.

Первым шагом в проведении аналитического выравнивания является выбор вида математической функции, которую предполагается использовать в качестве модели тренда. При этом можно руководствоваться формой кривой, полученной на основе отображения на графике эмпирических данных. Схема построения графика достаточно проста: по оси абсцисс откладываются временные периоды (даты), по оси ординат — значения уровней динамического ряда.

При анализе рядов динамики в качестве линии тренда чаще всего используются следующие функции:

Динамический анализ кода с помощью Iroh.js

Владислав Власов, инженер-программист в Developer Soft и преподаватель Нетологии, написал для блога цикл статей о EcmaScript6, в первой части которого на примерах рассмотрел динамический анализ кода в EcmaScript с помощью Iroh.js.

Статический и динамический анализ кода

Средства анализа кода — полезный инструмент, позволяющий обнаруживать и выявлять ошибки и особенности в работе кода. Анализ кода бывает статическим и динамическим. В первом случае производится разбор и анализ исходного кода без его выполнения, во втором — выполнение происходит в управляемой среде-песочнице (sandboxing), предоставляющей метаинформацию об элементах приложения в процессе его выполнения.

В языке EcmaScript, обладающим утиной типизацией (duck-typing), часто используются средства статического анализа, позволяющие без выполнения обнаружить потенциально опасные ситуации в коде: несоответствия типов передаваемых и принимаемых аргументов, некорректные операции с переменными несоответствующих типов, невыполняемые секции кода и так далее. Наиболее популярными являются решения Typescript и Flow, основанные на расширении языка специальным синтаксисом.

Читать еще:  Анализ управления производственным процессом

В отличие от языков программирования, в которых строгая система типов является их неотъемлемой частью, и соответственно, описания типов переменных и объектов уже заложено в исходном коде, в EcmaScript, напротив, требуется мануальное описание, причем зависимое и различающееся для отдельных средств статической типизации. Это влечет за собой следующие недостатки:

  • средство статической типизации вводит набор синтетических инструкций в язык, так что исходный код обязательно должен быть обработан транспилером (transpiler), вроде Вabel с соответствующим плагинами, или TypeScript compiler соответственно;
  • язык EcmaScript — динамический по своей природе, и во множестве случаев статическая типизация просто неприменима: для любых объектов, получаемых из внешней среды, типом данных будет string или any.

Iroh.js — решение для динамического анализа EcmaScript-приложений

Решение, устраняющее вышеперечисленные недостатки, — динамический анализатор EcmaScript-кода Iroh.js. Iroh.js позволяет выполнять анализ и манипуляцию кода в процессе выполнения, при этом нет необходимости модифицировать исходный код или снабжать его аннотациями, как в случае со средствами статической типизации.

Iroh.js позволяет записать схему исполнения кода в режиме реального времени, получать информацию о состоянии объектов и стеке вызовов, а также управлять поведением программы на лету.

Iroh.js может быть использован для получения информации о следующих аспектах времени выполнения: дерева вызова функций, актуальных типов данных объектов и переменных, неявных преобразований в объект и примитивный тип (boxing/unboxing), включая преобразования в строку.

Функционирует Iroh.js за счет предварительного исправления кода таким образом, чтобы осуществить запись происходящих событий, не изменяя логики и схемы выполнения исходной программы. Это обеспечивает возможность добавления функций-слушателей для последующего отслеживания и реакции на действия. Iroh.js позволяет не только отслеживать поведение кода в режиме выполнения, но и модифицировать его, перехватывая вызов определенных функций, устанавливая перекрывающее значение для переменных и так далее.

Iroh.js отслеживает стек вызовов только для модифицированного кода и не может предоставить метаинформацию или модификацию на лету для нативных функций среды исполнения или импортируемых библиотечных элементов. Как правило, не требуется анализировать и модифицировать поведение библиотечного кода, но при необходимости это также возможно — область действия Iroh.js определяется кодом, который был добавлен в песочницу исполнения Iroh.js посредством предварительного patching-а.

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

Пример 1. Анализ графа вызовов для функции вычисления чисел Фибоначчи

В качестве самого простого примера можно рассмотреть две реализации функции вычисления чисел Фибоначчи — наивный вариант с полным рекурсивным деревом, и оптимизированное решение с мемоизацией предыдущих результатов. Исходный код предполагаемых функций представлен ниже:

Теперь можно произвести динамический анализ этих функций. Разумеется, обе реализации обеспечивают правильный результат, однако fibonacciMemoized работает значительно быстрее, чем fibonacciNaive , и к тому же потребляем меньше памяти.

Очевидно, что дело в сохранении промежуточных вычислений и оптимизации хвостовой рекурсии. Анализатор потока исполнения на основе Iroh.js позволяет увидеть это наглядно:

Динамический анализатор позволяет с легкостью выявить, что в первом, неоптимальном случае, для расчета 6-го числа Фибоначчи число рекурсивных вызовов достигает 41, в то время как во втором — всего лишь 7. С увеличением номера рассчитываемого числа, в первом случае рост рекурсивных вызовов будет экспоненциальным, а во втором — линейным.

Хотя задача расчета чисел Фибоначчи крайне проста, и приведенная оптимизация тривиальна и широко известна, Iroh.js позволяет отследить граф вызовов функций и найти избыточные или некорректные вызовы.

Благодаря отображению актуальных значений аргументов и переменных, код можно отладить в процессе выполнения без добавления синтетических console.log -подобных инструкций.

Пример 2. Модификация объектов и переменных на лету

В процессе анализа поведения приложения с потенциально сложной и нелинейной логикой, может возникнуть необходимость отслеживания момента, когда значение определенной переменной или объекта поменялось, или же, наоборот, — в определенный момент инициировать изменения текущего значения на специальное. Все это можно осуществить средствами Iroh.js.

В качестве простого примера можно рассмотреть код web-страницы, которая исполняет AJAX-запросы к нескольким web-ресурсам, однако в отладочных целях необходимо перехватить обращение к некоторым из них, заменив URL-адрес на отладочную заглушку. Упрощенный фрагмент исходного кода может выглядеть так:

Допустим, необходимо заменить URL-адрес ADDR3 на ADDR3-test . С помощью Iroh.js соответствующую операцию можно провести следующим образом:

Iroh.js позволяет анализировать и перехватывать вызовы функций и аллокацию переменных, обеспечивая возможность модификации их значений и поведения на лету. Больше примеров можно посмотреть здесь.

Выводы

Iroh.js — мощный и функциональный инструмент для динамического анализа кода в EcmaScript-е. Этот инструмент может быть использован как для анализа кода, включая построения графа вызовов, вывода актуальных типов и значений в переменных и объектах, так и для модификации кода на лету, включая исправления кода, основанные на событиях.

Динамический анализ — довольно сложный метод, однако для EcmaScript, учитывая утиную типизацию, наличие host-объектов и нативных функций, позволяющих менять поведения кода на лету, это единственный способ для анализа и отладки кода в процессе выполнения.

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector
×
×