Модифицируйте код, чтобы получить синтетические данные, которые плавно переходят от бычьего к медвежьему рыночному циклу - PullRequest
1 голос
/ 05 июня 2019

У меня есть этот класс, который генерирует синтетически выглядящие (стоковые) данные, и он отлично работает.Однако я хочу изменить его так, чтобы NewPrice генерировал сглаженные трендовые данные, например, для n-баров .

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

Цена = тренд + предыдущая цена + случайный компонент Мне не хватает компонента тренда в реализации ниже.

Есть предложения?

class SyntheticData
{
    public static double previous = 1.0;

    public static double NewPrice(double volatility, double rnd)
    {               
        var change_percent = 2 * volatility * rnd;
        if (change_percent > volatility)
            change_percent -= (2 * volatility);

        var change_amount = previous * change_percent;
        var new_price = previous + change_amount;
        previous = new_price;

        return new_price;
    }
}

Trade.previous = 100.0;
Price = Trade.NewPrice(.03, rnd.NextDouble()),

Ответы [ 2 ]

3 голосов
/ 05 июня 2019

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

В качестве примера того, что вы можете сделать, на изображении ниже синие и желтые части взяты из реальных данных, а зеленая часть - это синтетические данные, созданные с помощью модели, которая была адаптирована к реальным данным.

Exponential smoothing example

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

Вот конкретный пример того, как такой временной ряд может быть сгенерирован. Я выбрал одну из 30 моделей экспоненциального сглаживания, модель с аддитивным трендом и волатильностью, без сезонной составляющей. Уравнения для генерации временного ряда:

enter image description here

Индекс времени - t , целое число. Значения временного ряда: y t . l t и b t являются соответственно компонентами смещения и наклона временного ряда. Альфа и бета являются параметрами, а l -1 и b -1 являются начальными значениями компонентов смещения и наклона. e t - это значение случайной величины, которая следует за некоторым распределением, например, нормальный. Альфа и бета должны удовлетворять приведенным ниже соотношениям для стабильности временного ряда.

enter image description here

Для генерации различных временных рядов вы выбираете значения для альфа, бета, l -1 , b -1 и стандартное отклонение e t при условии нормального закона и вычисление последовательных значений y t . Я сделал это в Excel для нескольких комбинаций значений. Вот несколько временных рядов, созданных с помощью этой модели. Сигма - это стандартное отклонение (волатильность) e t .

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

Вот уравнения для 30 моделей. N означает отсутствие тренда / сезонной составляющей. Средство аддитивного компонента. М означает мультипликативный компонент. Индекс d указывает на вариант, который является демпфированным. Вы можете получить все детали по ссылкам выше.

enter image description here

enter image description here

0 голосов
/ 19 июня 2019

Что-то вроде того, что я искал:

public static double[] Sine(int n)
{
    const int FS = 64; // sampling rate

    return MathNet.Numerics.Generate.Sinusoidal(n, FS, 1.0, 20.0);
}

Хотя для человека, который хочет иметь дело с ценами и периодичностью, основанной на времени, а не с математическими функциями, это не интуитивно понятно.

https://numerics.mathdotnet.com/Generate.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...