【问题标题】:Modify code to get synthetic data that trends smoothly from bull to bear market cycles修改代码以获得从牛市到熊市周期平稳趋势的合成数据
【发布时间】:2019-10-21 08:20:01
【问题描述】:

我有一个生成合成外观(库存)数据的类,它工作正常。但是,我想修改它,以便 NewPrice 为 n-bars 生成平滑的趋势数据。

我知道,如果我降低波动性,我会得到更平稳的价格。但是,不确定如何保证数据进入交替的持续趋势上升/下降。看起来是正弦波,但价格看起来像股票,即没有负价格。

价格 = 趋势 + 先前价格 + 随机组件 我在下面的实现中缺少趋势组件。

有什么建议吗?

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()),

【问题讨论】:

  • 就其价值而言,您最好获得真实数据,有大量免费数据,并且会减少(略少)编写指标或曲线匹配的交易软件的机会或过度优化

标签: c# algorithm stock stochastic-process


【解决方案1】:

指数平滑或指数移动平均线将创建您想要的数据类型。理想情况下,您将拥有代表您想要生成的时间序列类型的现有股票价格数据。您将指数平滑模型拟合到您的数据。这将确定该模型的许多参数。然后您可以使用模型及其参数生成具有相同趋势的相似时间序列,并且可以控制与模型相关的随机变量的波动率(标准差)。

作为一个示例,下图中蓝色和黄色部分来自真实数据,绿色部分是使用适合真实数据的模型生成的合成数据。

时间序列预测是一个很大的话题。我不知道你对这个话题有多熟悉。请参阅Time Series Analysis,它涵盖了大量的时间序列,在 Excel 中提供了清晰的演示和示例。更多理论背景见exponential smoothing

以下是如何生成此类时间序列的具体示例。我选择了 30 种指数平滑模型中的一种,一种具有加性趋势和波动性且没有季节性成分的模型。生成时间序列的方程为:

时间索引是t,一个整数。时间序列的值为 ytltbt 分别是时间序列的偏移量和斜率分量。 alpha和beta是参数,l-1b-1是偏移量和斜率的初始值成分。 et 是遵循某种分布的随机变量的值,例如普通的。为了时间序列的稳定性,Alpha 和 beta 必须满足以下关系。

要生成不同的时间序列,您可以选择 alpha、beta、l-1b-1,以及et的标准差假设正态规律,并计算yt的连续值.我已经在 Excel 中针对几种值组合完成了此操作。以下是使用此模型生成的几个时间序列。 Sigma 是 et 的标准差(波动率)。

以下是 30 个模型的方程式。 N 表示没有趋势/季节性成分。 A 表示添加剂成分。 M 表示乘法分量。 d 下标表示阻尼变体。您可以从上面的参考资料中获得所有详细信息。

【讨论】:

  • 这就是你要找的东西吗?
  • 没有。我希望以编程方式生成合成数据。
  • 嗯,这正是我给你的第一个链接中解释的内容。所描述的时间序列背后的数学公式都很容易编程。我认为解决您的问题的难点在于决定您要对要合成的数据类型使用什么时间序列模型。我可以给你一段代码,生成一个随机时间序列,趋势跟随一个模型,只有几行代码,但你需要选择代表你想要的数据类型的参数。
  • @Ivan 我添加了一个示例,展示了如何使用指数平滑模型计算随机时间序列。
  • 谢谢,但这个例子并没有从牛市到熊市到牛市到熊市循环。
【解决方案2】:

我一直在寻找这样的东西:

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

【讨论】: