Как избежать, чтобы амортизация стала отрицательной? - PullRequest
0 голосов
/ 03 апреля 2020

Я работаю над проектом для моей диссертации, которая связана с капитализацией расходов на исследования и разработки (R & D) для набора данных компаний, которые у меня есть.

Для тех, кто не знаком с финансовой терминологией я пытаюсь накапливать значения расходов на НИОКР каждого года с помощью следующих значений, уменьшая их стоимость (или «обесценивая») каждый период времени.

Мне удалось применить следующий код для получить суть операции:

df['rd_capital'] = [(df['r&d_exp'].iloc[:i] * (1 - df['dep_rate'].iloc[:i]*np.arange(i)[::-1])).sum() for i in range(1,len(df)+1)]

Однако у этого метода есть существенный недостаток, заключающийся в том, что он продолжает снижать норму амортизации, как только значение достигнет нуля, и, следовательно, перейти на отрицательную территорию. .

Например, если у нас расходы на исследования и разработки Apple в течение 5 лет при постоянной норме амортизации 20%, приведенный выше код дает мне следующий результат:

        year  r&d_exp  dep_rate  r&d_capital
0       1999    10       0.2          10   
1       2000    8        0.2          16 
2       2001    12       0.2        24.4 
3       2002    7        0.2        25.4 
4       2003    15       0.2          33 
5       2004     8       0.2        30.6
6       2005    11       0.2        29.6

Однако значение для 2005 год неверен и должен быть 31,6!

Если неясно, r & d_capital извлекается следующим образом way:

2000 = 10*(1-0.2) + 8

2001 = 10*(1-0.4) + 8*(1-0.2) + 12

2002 = 10*(1-0.6) + 8*(1-0.4) + 12*(1-0.2) + 7

2003 = 10*(1-0.8) + 8*(1-0.6) + 12*(1-0.4) + 7*(1-0.2) + 15

здесь возникает ключевая проблема, так как приведенный выше код выполняет следующее:

2004 = 10*(1-1) + 8*(1-0.8) + 12*(1-0.6) + 7*(1-0.4) + 15*(1-0.2) + 8

2005 = 10*(1-1.2) + 8*(1-1) + 12*(1-0.8) + 7*(1-0.6) + 15*(1-0.4) + 8*(0.2) + 11

Вместо этого он должен отбрасывать значения, как только значение достигает нуля, вот так:

2004 = 8*(1-0.8) + 12*(1-0.6) + 7*(1-0.4) + 15*(1-0.2) + 8

2005 = 12*(1-0.8) + 7*(1-0.6) + 15*(1-0.4) + 8*(0.2) + 11

Заранее благодарю за любую помощь, которую вы окажете, очень ценю :)

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Возможным способом будет вычисление остаточной части для каждой инвестиции. Предполагается, что существует конечное и известное количество лет, после которого любая инвестиция полностью обесценивается. Здесь я буду использовать 6 лет (5 будет достаточно, но это покажет, как избежать отрицательной амортизации):

# cumulated depreciation rates:
cum_rate = pd.DataFrame(index = df.index)
for i in range(2, 7):
    cum_rate['cum_rate' + str(i)] = df['dep_rate'].rolling(i).sum().shift(1 - i)
cum_rate['cum_rate1'] = df['dep_rate']
cum_rate[cum_rate > 1] = 1        # avoid negative rates

# residual values
resid = pd.DataFrame(index = df.index)
for i in range(1, 7):
    resid['r' + str(i)] = (df['r&d_exp'] * (1 - cum_rate['cum_rate' + str(i)])
                           ).shift(i)

# compute the capital
df['r&d_capital'] = resid.apply('sum', axis=1) + df['r&d_exp']

Это дает, как и ожидалось:

   year  r&d_exp  dep_rate  r&d_capital
0  1999       10       0.2         10.0
1  2000        8       0.2         16.0
2  2001       12       0.2         24.4
3  2002        7       0.2         25.4
4  2003       15       0.2         33.0
5  2004        8       0.2         30.6
6  2005       11       0.2         31.6
0 голосов
/ 03 апреля 2020

Необходимо отслеживать абсолютную амортизацию и прекращать амортизацию, когда актив достигает нулевого значения. Посмотрите на следующий код:

>>> exp = [10, 8, 12, 7, 15, 8, 11]
>>> dep = [0.2*x for x in exp]
>>> cap = [0]*7
>>> for i in range(7):
...     x = exp[:i+1]
...     for j in range(i):
...             x[j] -=(i-j)*dep[j]
...             x[j] = max(x[j], 0)
...     cap[i] = sum(x)
... 
>>> cap
[10, 16.0, 24.4, 25.4, 33.0, 30.599999999999998, 31.6]
>>> 

В циклах for я рассчитываю для каждого года остаточную стоимость всех активов (в переменной x). Когда это достигает нуля, я прекращаю обесцениваться. Это то, что делает утверждение x [j] = max (x [j], 0). Сумма стоимости всех активов затем сохраняется в cap [i].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...