修改代码以获取从牛市到熊市周期平滑趋势的合成数据
Modify code to get synthetic data that trends smoothly from bull to bear market cycles
我有这个 class 可以生成合成外观(库存)数据,并且工作正常。但是,我想对其进行修改,以便 NewPrice 为 n-bars 生成平滑的趋势数据。
我知道如果我降低波动性,我会得到更平滑的价格。但是,不确定如何保证数据进入交替 持续 趋势 up/down。看起来像正弦波的东西,但具有股票价格,即没有负价格。
价格=趋势+先前价格+随机成分我在下面的实现中缺少趋势成分。
有什么建议吗?
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()),
指数平滑或指数移动平均线将创建您想要的数据类型。理想情况下,您将拥有代表您要生成的时间序列类型的现有股票价格数据。您将指数平滑模型拟合到您的数据。这将确定该模型的许多参数。然后,您可以使用模型及其参数生成具有相同趋势的类似时间序列,并且可以控制与模型关联的随机变量的波动率(标准差)。
作为您可以执行的操作的示例,在下图中,蓝色和黄色部分来自真实数据,绿色部分是使用适合真实数据的模型生成的合成数据。
时间序列预测是一个很大的话题。我不知道你对那个话题有多熟悉。有关更多理论背景,请参阅 Time Series Analysis, it covers a large range of time series providing clear presentations and examples in Excel. See exponential smoothing
下面是如何生成这样的时间序列的具体示例。我选择了 30 种指数平滑模型中的一种,其中一种具有附加趋势和波动性,但没有季节性成分。生成时间序列的方程式为:
时间索引为t,一个整数。时间序列的值为yt。 lt和bt分别是偏移量和时间序列的斜率分量。 alpha和beta是参数,l-1和b-1 是偏移量和斜率分量的初始值。 et 是服从某种分布的随机变量的值,例如普通的。为了时间序列的稳定性,Alpha 和 Beta 必须满足以下关系。
要生成不同的时间序列,您可以选择 alpha、beta、l-1、b-1,和et的标准差假设正态分布,计算yt 的连续值。我已经在 Excel 中针对多种值组合完成了此操作。以下是使用此模型生成的几个时间序列。 Sigma 是 et.
的标准差(波动率)
这是 30 个模型的方程式。 N 表示没有趋势/季节性成分。 A表示添加成分。 M 表示乘法分量。 d 下标表示阻尼变体。您可以从上面的参考资料中获取所有详细信息。
我正在寻找这样的东西:
public static double[] Sine(int n)
{
const int FS = 64; // sampling rate
return MathNet.Numerics.Generate.Sinusoidal(n, FS, 1.0, 20.0);
}
虽然,对于想要处理价格和 time-based 周期性而不是数学函数的人来说,这并不直观。
我有这个 class 可以生成合成外观(库存)数据,并且工作正常。但是,我想对其进行修改,以便 NewPrice 为 n-bars 生成平滑的趋势数据。
我知道如果我降低波动性,我会得到更平滑的价格。但是,不确定如何保证数据进入交替 持续 趋势 up/down。看起来像正弦波的东西,但具有股票价格,即没有负价格。
价格=趋势+先前价格+随机成分我在下面的实现中缺少趋势成分。
有什么建议吗?
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()),
指数平滑或指数移动平均线将创建您想要的数据类型。理想情况下,您将拥有代表您要生成的时间序列类型的现有股票价格数据。您将指数平滑模型拟合到您的数据。这将确定该模型的许多参数。然后,您可以使用模型及其参数生成具有相同趋势的类似时间序列,并且可以控制与模型关联的随机变量的波动率(标准差)。
作为您可以执行的操作的示例,在下图中,蓝色和黄色部分来自真实数据,绿色部分是使用适合真实数据的模型生成的合成数据。
时间序列预测是一个很大的话题。我不知道你对那个话题有多熟悉。有关更多理论背景,请参阅 Time Series Analysis, it covers a large range of time series providing clear presentations and examples in Excel. See exponential smoothing
下面是如何生成这样的时间序列的具体示例。我选择了 30 种指数平滑模型中的一种,其中一种具有附加趋势和波动性,但没有季节性成分。生成时间序列的方程式为:
时间索引为t,一个整数。时间序列的值为yt。 lt和bt分别是偏移量和时间序列的斜率分量。 alpha和beta是参数,l-1和b-1 是偏移量和斜率分量的初始值。 et 是服从某种分布的随机变量的值,例如普通的。为了时间序列的稳定性,Alpha 和 Beta 必须满足以下关系。
要生成不同的时间序列,您可以选择 alpha、beta、l-1、b-1,和et的标准差假设正态分布,计算yt 的连续值。我已经在 Excel 中针对多种值组合完成了此操作。以下是使用此模型生成的几个时间序列。 Sigma 是 et.
的标准差(波动率)这是 30 个模型的方程式。 N 表示没有趋势/季节性成分。 A表示添加成分。 M 表示乘法分量。 d 下标表示阻尼变体。您可以从上面的参考资料中获取所有详细信息。
我正在寻找这样的东西:
public static double[] Sine(int n)
{
const int FS = 64; // sampling rate
return MathNet.Numerics.Generate.Sinusoidal(n, FS, 1.0, 20.0);
}
虽然,对于想要处理价格和 time-based 周期性而不是数学函数的人来说,这并不直观。