Мне нужно было создать фиктивные рыночные данные для сим-игры, над которой я работал.Мне нужно было, чтобы данные выглядели как рыночные данные, но оставались в определенных диапазонах, поэтому они были предсказуемы с точки зрения начальной цены, максимума / минимума за день.
В итоге я объединил синусоидальные волны различной частоты, а затемдобавили некоторую случайность, и результаты не просто выглядят хорошо, но согласованно (вы не получите ничего, что выглядит странно).Даже там, где можно увидеть синусоидальный паттерн, он все равно выглядит хорошо.
Произвольно сгенерированные рыночные данные
Код написан на базовом языке сценариев, но он должен быть очень простым для понимания и преобразования на любой язык, который вы хотите.Получив массив нормализованных данных, умножьте значения на любое максимальное значение, которое вы хотите получить ограниченный набор данных.
dim values[] as float
dim offsets[] as integer
dim frequencies[] as float
function GetPoint(x#, f#, a#, o#)
f# = 360.0 / f#
x# = FMod(x# + o#, f#)
angle# = (x# / f#) * 360.0
r# = Sin(angle#) * a#
endfunction r#
function Generate()
// Empty arrays
offsets.Length = -1
frequencies.Length = -1
values.Length = -1
offsets.Insert(Random(0, 359))
offsets.Insert(Random(0, 359))
offsets.Insert(Random(0, 359))
f# = Random(100, 300)
f# = f# / 1000.0
frequencies.Insert(f#)
f# = Random(500, 1000)
f# = f# / 1000.0
frequencies.Insert(f#)
f# = Random(2000, 4000)
f# = f# / 1000.0
frequencies.Insert(f#)
c# = 0
for i = 0 to 1919
v# = 0
v# = v# + GetPoint(i, frequencies[0], 190, offsets[0])
v# = v# + GetPoint(i, frequencies[1], 85, offsets[1])
v# = v# + GetPoint(i, frequencies[2], 40, offsets[2])
r# = Random(0, 40)
r# = r# - 20.0
c# = Clamp(c# + r#, c# - 40, c# + 40)
v# = v# + c#
values.Insert(v#)
next i
start# = values[0]
max# = 0.0
for i = 0 to values.Length
values[i] = values[i] - start#
if Abs(values[i]) > max#
max# = Abs(values[i])
endif
next i
// Normalize
for i = 0 to values.Length
values[i] = (values[i] / max#)
next i
endfunction
function Clamp(v#, min#, max#)
if v# < min#
exitfunction min#
elseif v# > max#
exitfunction max#
endif
endfunction v#