Простые модели экономической динамики на Python


Введение


В моих публикациях [1,2] экономические задачи рассматривались в статике без учёта времени. В задачах оптимизации экономической динамики анализируются изменение экономических параметров и их взаимосвязей во времени. В моделях экономической динамики время может рассматриваться как дискретное изменяющееся скачком, например, за год. Для описания таких процессов используются разностные уравнения. При непрерывном изменении во времени для описания параметров модели используются дифференциальные уравнения.

Постановка задачи


Для первого знакомства с моделями экономической динамика достаточно рассмотреть две типовые модели. Это паутинообразная модель и модель и модель Калдора в которых и реализованы два указанных подхода к описанию экономической динамики.

Паутинообразная модель экономической динамики [3]


Модель позволяет исследовать устойчивость цен и объемов производства на рынке, описываемом кривыми спроса и предложения некоторого товара. Функция спроса S(p) характеризует зависимость объема спроса на товар от цены р товара в данный период i. Функция предложения D(p) характеризует объем предложения товара в зависимости от цены товара. Равновесная цена р, рынка определяется равенством спроса и предложения S(p) = D(p).
Производитель определяет объём предлагаемого товара исходя из спроса и цен на товар установившихся в предыдущем периоде – i-1.



Для решения этого уравнения зададим объём в начальный период Q0 и используя обратную функцию предложения определим цену на товар.



Объём производства в следующий период времени определим через функцию спроса



и так далее.
Если функции спроса и предложения меняются, то колебания цен будут определятся только отклонением цены от равновесной.

Листинг паутинообразной модели
from scipy.optimize import *
import numpy as np
import matplotlib.pyplot as plt
a=1;b=0.2# Постоянные для функций спроса и предложения 
def fun_1(x,a): #Функция спроса
         return np.e**(-a*x**2)
def fun_2(x,b): #Функция предложения
         return  b*x**2
x0=round(fsolve(lambda x:fun_1(x,a)-fun_2(x,b),1)[0],3)#Равновесная цена
x=np.arange(0,x0+1,0.01)
plt.figure()
plt.title('Паутинообразная модель динамики цен и объёмов производства', size=12)
plt.xlabel('Цена товара', size=12) 
plt.plot(x, fun_1(x,a), 'r', linestyle ='--',linewidth = 1, label='Функция спроса')
plt.plot(x, fun_2(x,b), 'b', linestyle ='-' ,linewidth = 1, label='Функция предложения ')
plt.plot(x0, fun_2(x0,b), marker = 'o',  markersize = 6,  markerfacecolor = 'g', label='Равновесное производство ' )
plt.plot(x0, 0, marker = 's',  markersize = 6,  markerfacecolor = 'r', label='Равновесная цена товара ' )
plt.legend(loc='best')
plt.grid(True)
q=[];p=[];x=[]
q.append(0.6)
p.append(round(fsolve(lambda x:fun_1(x,a)-q[0],1)[0],3))
for i in np.arange(0,7):
         x.append(i)
         if i!=0:
                  q.append(fun_2(p[i-1],b))
                  p.append(round(fsolve(lambda x:fun_1(x,a)-q[i],1)[0],3))                  
plt.figure()
plt.title('Колебания цены и объёмов производства ', size=12)
plt.xlabel('Период времени', size=12) 
plt.plot(x, p, 'r', marker = 's',  markersize = 6,  markerfacecolor = 'r', label='Колебания цены')
plt.plot(x, q, 'b', marker = 'o',  markersize = 6,  markerfacecolor = 'b', label='Колебания объёмов производства')
plt.legend(loc='best')
plt.grid(True)
plt.show()


Результаты работы программы





Вывод


Корректируя постоянные a, b по статистике работы рынка товаров (такой анализ хорошо разработан в scipy.stats) паутинообразную модель можно использовать для корректировки объёмов производства.

Модель Калдора[4]
В модели предпринята попытка объяснения циклического характера изменения экономической активности факторами сбережений S(y) и инвестиций I(y), где y – доход. В модели объемы сбережений и инвестиций являются не линейными, а логистическими (S-образными) функциями.

Листинг модели Калдора
from scipy.optimize import *
from scipy.misc import derivative
import numpy as np
import matplotlib.pyplot as plt
c=2.2;a=-0.9;h=0.1
def f(x):
         return 3*x-2*c*(a+x)**3+2*a**3-1.5
def  s(x):
         return c*(a+x)**3-a**3+2
def l(x):
         return 3*x-c*(a+x)**3+a**3+0.5
rx=[];ry=[];dy=[];dz=[]
for i in np.arange(0,3):
         x=round(fsolve(lambda x:f(x),i)[0],3)
         z=derivative(f, x, dx=1e-6)
         rx.append(x)        
         ry.append(s(x))
         dz.append(z)
x=[i*h  for i in np.arange(0,18)]
z=[s(i*h) for i in np.arange(0,18)]
v=[l(i*h) for i in np.arange(0,18)]
plt.figure()
plt.title('Модель Каллора динамики сбережений и инвестиций', size=12)
plt.xlabel('Доход', size=12) 
plt.plot(x, z, 'r', linestyle ='--',linewidth = 2, label='Логистическая функция сбережений -s(x)')
plt.plot(x, v, 'b', linestyle ='-' ,linewidth = 2, label='Логистическая функция инвестиций-l(x)')
plt.plot(rx[0], ry[0], marker = 's',  markersize = 6, label='Устойчивая точка y1 - df/dx<0,df/dx= '+ str(round(dz[0],3)))
plt.plot(rx[1], ry[1], marker = 'o',  markersize = 6, label='Не устойчивая точка y2 - df/dx>0,df/dx='+ str(round(dz[1],3)))
plt.plot(rx[2], ry[2], marker = 's',  markersize = 6, label='Устойчивая точка y3 - df/dx<0,df/dx= '+ str(round(dz[2],3)))
plt.legend(loc='best')
plt.grid(True)
T=4;N=50; h=T/N
y=[];y.append(1.2)
z=[];z.append(0.987)
u=[];u.append(0.5)
x=[ i*h for i in np.arange(0,N+2)]
for i in np.arange(1,N+2):    
         y.append(y[i-1]+h*f(y[i-1]))  
for i in np.arange(1,N+2):    
         z.append(z[i-1]+h*f(z[i-1]))
for i in np.arange(1,N+2):    
         u.append(u[i-1]+h*f(u[i-1]))
y1= [rx[0] for i in np.arange(0,N+2)]
y3= [rx[2] for i in np.arange(0,N+2)]
y2= [rx[1] for i in np.arange(0,N+2)]     
plt.figure()
plt.title('Модель Каллора интегрированный \n доход при различных начальных условиях', size=12)
plt.plot(x, y,linewidth = 2, label=' f(x0)=1.2')         
plt.plot(x, z,linewidth = 2, label='f(x0)=0.987')
plt.plot(x, u,linewidth = 2, label=' f(x0)=0.5')
plt.plot(x, y1,linewidth = 1, label=' y1')         
plt.plot(x, y3,linewidth = 1, label=' y3')
plt.plot(x, y2,linewidth = 1, label='y2')
plt.legend(loc='best')
plt.grid(True)
plt.show()


Результат работы программы – динамика сбережений и инвестиций.



Равновесие достигается при условии S(y) = 1(у). На графике таких точек три. Устойчивых точек только две y1 и y3, поскольку производная в них от функции f(y) =I(у) — S(y) отрицательна.

Изменение дохода в такой системе можно представить в виде дифференциального уравнения dy/dt=f(y) при начальных условиях y(0)=y0.

Результат работы программы – интегрированный доход при различных начальных условиях.



Когда величина дохода соответствует одному из равновесных состояний, оно может сохраняться неограниченно долго. Однако изменениях в экономической ситуации для неустойчивого равновесия, например, в точке y2, приведут к переходу в одну из устойчивых точек у1 или у3 в зависимости от ухода влево или вправо от положения равновесия. Для устойчивых точек при малых отклонениях от положения равновесия произойдет возврат к этому же состоянию. Это справедливо при постоянных функциях инвестиций и сбережений. Периодические изменения деловой активности приведут к деформации этих функций, что и объясняет циклический характер развития экономики и демонстрирует приведенный график.

Вывод


Корректируя по статистическим данным константы с и а входящие в функции сбережений и инвестиций используя модель Каллора можно получить информацию для поддержки управленческих решений.

Всём спасибо за внимание!

Ссылки


  1. Решение закрытой транспортной задачи с дополнительными условиями средствами Python.
  2. Решение задач линейного программирования с использованием Python.
  3. Паутинообразная модель равновесия.
  4. Модель делового цикла Калдора.




К сожалению, не доступен сервер mySQL