powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Формулы тренда (линейный, полиномы и т.п.) через VBA
12 сообщений из 12, страница 1 из 1
Формулы тренда (линейный, полиномы и т.п.) через VBA
    #37797149
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам искал готовые в нете, не нашел. В итоге решил написать сам и выложить сюда, чтобы народ мог использовать это в благих целях или находить в Гугле.
Для чистого бейсика код не подойдет - используются некоторые специфические функции Экселя.

Линейный
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Sub LineTrendFormula(ByRef y() As Double, ByRef b As Double, ByRef m As Double, Optional ByRef r2 As Double)
' данная функция возвращает коэффициенты для линейного тренда
' формула y = m * x + b
' вызов функции LineTrendFormula y, b, m, r2
' на входе массив значений
' на выходе свободный коэф, коэф x, достоверность
'
    Dim x() As Integer:    ReDim x(LBound(y) To UBound(y)) As Integer
    For i = LBound(x) To UBound(x):          x(i) = i:    Next i
    Dim Coefs As Variant: Coefs = Application.LinEst(y, x, , 1)
    b = Coefs(1, 2)
    m = Coefs(1, 1)
    r2 = Coefs(3, 1)
End Sub

Логарифмический
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Sub LogarithmTrendFormula(ByRef y() As Double, ByRef b As Double, ByRef c As Double, Optional ByRef r2 As Double)
' данная функция возвращает коэффициенты для логарифмического тренда
' формула y = (c * LN(x)) + b
' вызов функции LogarithmTrendFormula y, b, с, r2
' на входе массив значений
' на выходе свободный коэф, коэф ln(x), достоверность
'
    Dim x() As Double:    ReDim x(LBound(y) To UBound(y)) As Double
    For i = LBound(x) To UBound(x):          x(i) = Application.Ln(i):    Next i
    Dim Coefs As Variant:    Coefs = Application.LinEst(y, x, , 1)
    b = Coefs(1, 2)
    c = Coefs(1, 1)
    r2 = Coefs(3, 1)
End Sub

Степенной
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Sub StepenTrendFormula(ByRef y() As Double, ByRef b As Double, ByRef c As Double, Optional ByRef r2 As Double)
' данная функция возвращает коэффициенты для степенного тренда
' формула y=c*x^b
' вызов функции StepenTrendFormula y, b, c, r2
' на входе массив значений
' на выходе степень, коэф x, достоверность
'
    Dim x() As Double, y1() As Double: ReDim x(LBound(y) To UBound(y)) As Double: ReDim y1(LBound(y) To UBound(y)) As Double
    For i = LBound(x) To UBound(x): x(i) = Application.Ln(i): y1(i) = Application.Ln(y(i)): Next i
    Dim Coefs As Variant:    Coefs = Application.LinEst(y1, x, , 1)
    b = Coefs(1, 1)
    c = Exp(Coefs(1, 2))
    r2 = Coefs(3, 1)
End Sub

Экспоненциальный
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private Sub ExpTrendFormula(ByRef y() As Double, ByRef b As Double, ByRef c As Double, Optional ByRef r2 As Double)
' данная функция возвращает коэффициенты для экспоненциального  тренда
' формула y = c * e ^(b * x) что аналогично y = c * exp(b * x)
' вызов функции ExpTrendFormula y, b, с, r2
' на входе массив значений
' на выходе коэффициент степени x, коэф е, достоверность
'
    Dim x() As Double, y1() As Double
    ReDim x(LBound(y) To UBound(y)) As Double
    ReDim y1(LBound(y) To UBound(y)) As Double
    For i = LBound(x) To UBound(x): x(i) = i: y1(i) = Application.Ln(y(i)): Next i
    Dim Coefs As Variant:    Coefs = Application.LinEst(y1, x, , 1)
    b = Coefs(1, 1)
    c = Exp(Coefs(1, 2))
    r2 = Coefs(3, 1)
End Sub

Полиномальный
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Private Sub PolyTrendFormula(ByRef y() As Double, ByVal PolyStep As Integer, ByRef b As Double, ByRef c() As Double, Optional ByRef r2 As Double)
' данная функция возвращает коэффициенты для полинома любой степени
' пример формулы полинома второй степени y = (c2 * x^2) + (c1 * x ^1) + b
' пример формулы полинома третьей степени y = (c3 * x^3) + (c2 * x^2) + (c1 * x^1) + b
' пример формулы полинома четвертой степени y = (c4 * x^4)+(c3 * x^3) + (c2 * x^2) + (c1 * x^1) + b
' на входе массив значений, степень полинома
' на выходе свободный коэф, массив степенных коэф, достоверность
'
' ниже пример использования в коде
'Dim y() As Double, b As Double, r2 As Double, c() As Double
' .....генерация одномерного массива y.....
'PolyTrendFormula y, 4, b, c, r2
'
'Debug.Print b
'For i = 1 To UBound(c)
'    Debug.Print c(i)
'Next i
'Debug.Print r2
    Dim x() As Variant, y1() As Double
    ReDim x(LBound(y) To UBound(y), 1 To PolyStep) As Variant
    ReDim y1(LBound(y) To UBound(y), 1 To 1) As Double
    ReDim c(1 To PolyStep) As Double
    For i = LBound(x) To UBound(x): For n = 1 To PolyStep: x(i, n) = i ^ n: Next n: y1(i, 1) = y(i): Next i
    
    Dim Coefs As Variant
        Coefs = Application.LinEst(y1, x, , 1)
    
    b = Coefs(1, PolyStep + 1)
    For i = PolyStep To 1 Step -1
        c(PolyStep - i + 1) = Coefs(1, i)
    Next i
    r2 = Coefs(3, 1)

End Sub

Решение может быть не лучшее (я не претендую на магистра VBA), любые предложения по улучшению кода принимаются с удовольствием.

Еще вот функция, которая позволяет при передаче ей массива значений Y и значения на которое надо продлить тренды X , возвращает массив размера (Y+X)*8 1 столбец - исходные, 2-8 столбец линии тренда, которые можно построить из экселя, кроме линейной фильтрации. Использует указанные выше функции поэтому должна быть использована в одном проекте или классе с ними.
Функция
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
Public Sub CreateTrends(ByRef InArray() As Double, ByVal Forec As Long)
    On Error GoTo 1
    ' архивируем старый массив
    Dim TmpArr() As Double: ReDim TmpArr(LBound(InArray) To UBound(InArray)) As Double
    For i = LBound(InArray) To UBound(InArray): TmpArr(i) = InArray(i): Next i
    Erase InArray: ReDim InArray(LBound(TmpArr) To UBound(TmpArr) + Forec, 1 To 8) As Double
    
    ' строим формулы тренда
    Dim LinB As Double, LinM As Double, LogB As Double, LogC As Double, StepB As Double, StepC As Double
    Dim ExpB As Double, ExpC As Double, Poly2B As Double, Poly3B As Double, Poly4B As Double
    Dim Poly2C() As Double, Poly3C() As Double, Poly4C() As Double
1:
On Error Resume Next
    LineTrendFormula TmpArr, LinB, LinM
    LogarithmTrendFormula TmpArr, LogB, LogC
    StepenTrendFormula TmpArr, StepB, StepC
    ExpTrendFormula TmpArr, ExpB, ExpC
    PolyTrendFormula TmpArr, 2, Poly2B, Poly2C
    PolyTrendFormula TmpArr, 3, Poly3B, Poly3C
    PolyTrendFormula TmpArr, 4, Poly4B, Poly4C
    
    ' считаем тренды и засовываем их в массив
    For i = LBound(InArray) To UBound(InArray)
         If i <= UBound(TmpArr) Then InArray(i, 1) = TmpArr(i)      ' записываем сам массив фактов
         ' затем сами тренды записываем в 2-8 столбцы массива
         InArray(i, 2) = LinM * i + LinB
         InArray(i, 3) = (LogC * Application.Ln(i)) + LogB
         InArray(i, 4) = StepC * i ^ StepB
         InArray(i, 5) = ExpC * Exp((ExpB * i))
         InArray(i, 6) = (Poly2C(2) * i ^ 2) + (Poly2C(1) * i ^ 1) + Poly2B
         InArray(i, 7) = (Poly3C(3) * i ^ 3) + (Poly3C(2) * i ^ 2) + (Poly3C(1) * i ^ 1) + Poly3B
         InArray(i, 8) = (Poly4C(4) * i ^ 4) + (Poly4C(3) * i ^ 3) + (Poly4C(2) * i ^ 2) + (Poly4C(1) * i ^ 1) + Poly4B
    Next i
Erase TmpArr
End Sub

Я это использовал в реализации методологии прогнозирования продаж, которое взял вот отсюда если кому интересно. Сейчас у меня есть формула в экселе, которая позволяет посчитать прогноз по этой методологии. Правда я методологию доработал, предварительно автоматически чищу данные которым не верю от хлама. Но это совсем другая история.
...
Рейтинг: 0 / 0
Формулы тренда (линейный, полиномы и т.п.) через VBA
    #37797221
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините за дремучесть, а для чего эти формулы?
...
Рейтинг: 0 / 0
Формулы тренда (линейный, полиномы и т.п.) через VBA
    #37797225
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для маркетологов и тд и тп (воображаемые прогнозы продаж рисуют). на нестабильных рынках (Россия именно такой рынок) - это не работает.
...
Рейтинг: 0 / 0
Формулы тренда (линейный, полиномы и т.п.) через VBA
    #37797273
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneдля маркетологов и тд и тп (воображаемые прогнозы продаж рисуют). на нестабильных рынках (Россия именно такой рынок) - это не работает.Ну я бы не был так категоричен. Алгоритм в котором используется эта формула позволяет правильно построить модель. И все решает не географическое местоположение рынка, а выбранный размер атома прогнозирования.
...
Рейтинг: 0 / 0
Формулы тренда (линейный, полиномы и т.п.) через VBA
    #37797418
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть очень много случайных факторов, которые не учитываются в данной модели. а вообще, тема интересная. но советую всё-таки смотреть многофакторный анализ. а эти формулы неплохо работали в штатах на рынках стали, например, в 70-х годах прошлого века.
...
Рейтинг: 0 / 0
Формулы тренда (линейный, полиномы и т.п.) через VBA
    #37900558
skleppi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shamanus,

спасибо!
...
Рейтинг: 0 / 0
Формулы тренда (линейный, полиномы и т.п.) через VBA
    #37921351
analysts
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanus,
То что вы эти функции прописали через вба - это конечно замечательно.
Только методика , которой вы пользовались - мягко говоря примитивная!
...
Рейтинг: 0 / 0
Формулы тренда (линейный, полиномы и т.п.) через VBA
    #38337859
koJIo6ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор, ты тут есть?
...
Рейтинг: 0 / 0
Формулы тренда (линейный, полиномы и т.п.) через VBA
    #38352447
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
koJIo6ok,

да
...
Рейтинг: 0 / 0
Формулы тренда (линейный, полиномы и т.п.) через VBA
    #38352454
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
analystsShamanus,
То что вы эти функции прописали через вба - это конечно замечательно.
Только методика , которой вы пользовались - мягко говоря примитивная!Я с Вами не согласен, излишне категоричное утверждение

Как можно сказать, что бензопила это круто, а нож примитивен, потому что не спиливает деревья?
У каждой задачи есть идеальный инструмент, у каждого инструмента есть свое назначение.
...
Рейтинг: 0 / 0
Формулы тренда (линейный, полиномы и т.п.) через VBA
    #38362432
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
за лям и пол года могу написать функцию для полинома 10 степени
...
Рейтинг: 0 / 0
Формулы тренда (линейный, полиномы и т.п.) через VBA
    #38362485
analysts
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanus,

Согласен с вашим утверждением. Какие реальные практиктические задачи решаются с помощью этого ножа?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Формулы тренда (линейный, полиномы и т.п.) через VBA
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]