В этом примере показано, как применяться, цепочечная лестничная структура загружают метод, чтобы сгенерировать несколько developmentTriangle объекты оценить окончательные требования.
Детерминированные методы оценки требования производят точечные оценки резервных значений без информации о неопределенности в этих оценках. Цель стохастического метода оценки требования состоит в том, чтобы оценить изменчивость предполагаемых резервных значений. Цепочечный лестничный подход начальной загрузки является основанным на симуляции методом, чтобы случайным образом изменить developmentTriangle данные и производят распределение предполагаемых резервов, которое представляет изменчивость предполагаемых резервных значений. Этот пример основан на работе Вютрича и Мерца [1].
load('InsuranceClaimsData.mat');
disp(head(data)); OriginYear DevelopmentYear ReportedClaims PaidClaims
__________ _______________ ______________ __________
2010 12 3995.7 1893.9
2010 24 4635 3371.2
2010 36 4866.8 4079.1
2010 48 4964.1 4487
2010 60 5013.7 4711.4
2010 72 5038.8 4805.6
2010 84 5059 4853.7
2010 96 5074.1 4877.9
developmentTriangleСоздайте developmentTriangle объект и использование claimsPlot визуализировать developmentTriangle. Для получения дополнительной информации о неоплаченной оценке требований см. Обзор Методов оценки Требований для Non-Life Insurance.
dTriangle = developmentTriangle(data);
dTriangleTable = view(dTriangle);
% visualize the development triangle
claimsPlot(dTriangle)
developmentTriangledevelopmentTriangle соединитесь отношения оцениваются с помощью формулы:
Используйте linkRatios вычислить факторы от возраста к возрасту.
factorsTable = linkRatios(dTriangle);
Используйте linkRatioAverages вычислить средние значения факторов от возраста к возрасту.
averageFactorsTable = linkRatioAverages(dTriangle); disp(averageFactorsTable);
12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120
______ ______ ______ ______ ______ ______ _____ ______ _______
Simple Average 1.1767 1.0563 1.0249 1.0107 1.0054 1.0038 1.003 1.002 1.001
Simple Average - Latest 5 1.172 1.056 1.0268 1.0108 1.0054 1.0038 1.003 1.002 1.001
Simple Average - Latest 3 1.17 1.0533 1.027 1.0117 1.0057 1.0037 1.003 1.002 1.001
Medial Average - Latest 5x1 1.1733 1.0567 1.0267 1.0103 1.005 1.004 1.003 1.002 1.001
Volume-weighted Average 1.1766 1.0563 1.025 1.0107 1.0054 1.0038 1.003 1.002 1.001
Volume-weighted Average - Latest 5 1.172 1.056 1.0268 1.0108 1.0054 1.0038 1.003 1.002 1.001
Volume-weighted Average - Latest 3 1.1701 1.0534 1.027 1.0117 1.0057 1.0037 1.003 1.002 1.001
Geometric Average - Latest 4 1.17 1.055 1.0267 1.011 1.0055 1.0037 1.003 1.002 1.001
Отобразите выбранную таблицу факторов от возраста к возрасту и вычислите совокупный фактор разработки (CDF) с помощью cdfSummary.
dTriangle.SelectedLinkRatio = averageFactorsTable{'Volume-weighted Average',:};
currentSelectedFactors = dTriangle.SelectedLinkRatio;
dTriangle.TailFactor = 1;
selectedFactorsTable = cdfSummary(dTriangle);
disp(selectedFactorsTable); 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120 Ultimate
_______ _______ _______ _______ _______ ______ _______ _______ _______ ________
Selected 1.1766 1.0563 1.025 1.0107 1.0054 1.0038 1.003 1.002 1.001 1
CDF to Ultimate 1.3072 1.111 1.0518 1.0261 1.0153 1.0098 1.006 1.003 1.001 1
Percent of Total Claims 0.76501 0.90008 0.95075 0.97453 0.98496 0.9903 0.99402 0.99701 0.999 1
Отобразите последнюю диагональ.
latestDiagonal = dTriangle.LatestDiagonal;
Вычислите спроектированные окончательные требования с помощью ultimateClaims.
projectedUltimateClaims = ultimateClaims(dTriangle);
Отобразите полный треугольник разработки использование fullTriangle.
fullTriangleTable = fullTriangle(dTriangle); disp(fullTriangleTable);
12 24 36 48 60 72 84 96 108 120 Ultimate
______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ________
2010 3995.7 4635 4866.8 4964.1 5013.7 5038.8 5059 5074.1 5084.3 5089.4 5089.4
2011 3968 4682.3 4963.2 5062.5 5113.1 5138.7 5154.1 5169.6 5179.9 5185.1 5185.1
2012 4217 5060.4 5364 5508.9 5558.4 5586.2 5608.6 5625.4 5636.7 5642.3 5642.3
2013 4374.2 5205.3 5517.7 5661.1 5740.4 5780.6 5803.7 5821.1 5832.7 5838.6 5838.6
2014 4499.7 5309.6 5628.2 5785.8 5849.4 5878.7 5900.8 5918.5 5930.3 5936.3 5936.3
2015 4530.2 5300.4 5565.4 5715.7 5772.8 5804.1 5825.9 5843.4 5855.1 5861 5861
2016 4572.6 5304.2 5569.5 5714.3 5775.4 5806.7 5828.6 5846.1 5857.7 5863.6 5863.6
2017 4680.6 5523.1 5854.4 6000.9 6065.1 6098 6120.9 6139.3 6151.6 6157.7 6157.7
2018 4696.7 5495.1 5804.4 5949.6 6013.3 6045.9 6068.6 6086.8 6099 6105.1 6105.1
2019 4945.9 5819.2 6146.7 6300.5 6367.9 6402.4 6426.5 6445.8 6458.7 6465.2 6465.2
Вычислите общие резервы с помощью ultimateClaims.
IBNR = ultimateClaims(dTriangle) - dTriangle.LatestDiagonal; IBNR = array2table(IBNR, 'RowNames', dTriangleTable.Properties.RowNames, 'VariableNames', {'IBNR'}); IBNR{'Total',1} = sum(IBNR{:,:}); disp(IBNR);
IBNR
______
2010 0
2011 5.1857
2012 16.89
2013 34.886
2014 57.583
2015 88.148
2016 149.34
2017 303.29
2018 609.99
2019 1519.3
Total 2784.6
Чтобы вывести подходы передискретизации, Модель Временных рядов модели цепочечной лестничной структуры (CL) без распределений задана как:
Для отношения ссылки, выбранного выше, Wüthrich [1] и Мэк [2] показывают, что стандартное отклонение оценивается как:
estimatedStandardDeviations = currentSelectedFactors; for i=1:width(estimatedStandardDeviations)-1 estimatedStandardDeviations(1,i) = sqrt(sum(((factorsTable{1:end-i,i} - currentSelectedFactors(:,i)).^2).*dTriangleTable{1:end-i,i}) / (height(dTriangleTable)-i-1)); end estimatedStandardDeviations(1,end) = sqrt(min([estimatedStandardDeviations(1,end-1)^4 / estimatedStandardDeviations(1,end-2)^2, estimatedStandardDeviations(1,end-2)^2, estimatedStandardDeviations(1,end-1)^2])); disp(estimatedStandardDeviations);
Columns 1 through 7
0.8667 0.3699 0.2420 0.1310 0.0673 0.0361 0.0001
Columns 8 through 9
0.0001 0.0001
Чтобы применить метод начальной загрузки, необходимо найти соответствующие остаточные значения, которые допускают конструкцию эмпирического распределения создать наблюдения начальной загрузки.
Рассмотрите следующие остаточные значения для .
где
После Wüthrich [1] можно масштабировать остаточные значения, чтобы увеличить их отклонение. Немасштабированные остаточные значения имеют тенденцию приводить к более легким хвостам в симулированном распределении.
Настройте остаточные значения, таким образом, что распределение начальной загрузки имеет настроенную функцию отклонения.
Можно применить алгоритм начальной загрузки с помощью трех различных версий:
Непараметрическая начальная загрузка Эфрона для остаточных значений
Непараметрическая начальная загрузка Эфрона для масштабированных остаточных значений
Параметрическая начальная загрузка под предположением, что остаточные значения имеют стандартное Распределение Гаусса, которое является передискретизируется от
Этот пример использует вторую версию (непараметрическая начальная загрузка Эфрона для масштабированных остаточных значений), чтобы вычислить .
% Create a copy of the factors table and modify it to create the % residuals table residuals = factorsTable.Variables; colSums = sum(dTriangle.Claims,'omitnan'); for i=1:height(residuals) for j=1:width(residuals) residuals(i,j) = (1 - (dTriangleTable{i,j}/colSums(j)))^-0.5 * (factorsTable{i,j} - currentSelectedFactors(1,j)) / (estimatedStandardDeviations(1,j)*(dTriangleTable{i,j}^-0.5)); end end
Остаточные значения задайте распределение начальной загрузки.
residualsVector = residuals(:); residualsVector(isnan(residualsVector)) = []; histogram(residualsVector,10) title('Scaled Residuals') xlabel('Residual Value') ylabel('Frequency')

Чтобы симулировать новый резервный сценарий с методом начальной загрузки, выполните эти шаги.
Передискретизируйте независимого политика и тождественно распределенный (i.i.d.) остаточные значения от распределения начальной загрузки.
resampledResiduals = residuals; rng('default'); rng(1); for i = 1:height(residuals)-1 for j = 1:width(residuals)-i+1 resampledResiduals(i,j) = datasample(residuals(~isnan(residuals)), 1); end end disp(resampledResiduals);
Columns 1 through 7
-1.5522 -0.5120 -1.2668 0.7776 -1.3649 0.2799 -0.5495
-0.4041 -1.5522 -0.4784 -1.2189 -0.7591 0.2610 -0.4784
-0.4091 -1.3649 -0.5495 -1.6767 -0.8571 -1.3143 -0.4879
-0.7591 1.3226 1.0791 0.2610 0.2861 -0.7591 NaN
0.2799 -1.5522 -0.8571 0.3243 -0.4879 NaN NaN
-1.3143 -0.4784 0.5556 -1.2668 NaN NaN NaN
1.9550 0 1.9550 NaN NaN NaN NaN
0.7693 0.5169 NaN NaN NaN NaN NaN
0.2799 NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN
Columns 8 through 9
-1.3146 -1.5364
-1.5522 NaN
NaN NaN
NaN NaN
NaN NaN
NaN NaN
NaN NaN
NaN NaN
NaN NaN
NaN NaN
Define и, для assumeThat:
Это выражение представляет новые симулированные значения требования. Используя симулированные значения требования, можно создать новый developmentTriangle оценить новые резервные значения.
bootstrappedClaims = dTriangleTable.Variables; for j = 2:width(bootstrappedClaims) bootstrappedClaims(:,j) = currentSelectedFactors(1,j-1).*bootstrappedClaims(:,j-1) + estimatedStandardDeviations(1,j-1).*sqrt(bootstrappedClaims(:,j-1)).*resampledResiduals(:,j-1); end stackedClaims = reshape(bootstrappedClaims',100,1); stackedClaims = stackedClaims(~isnan(stackedClaims)); newData = data; newData.values = stackedClaims; bootstrappedDevelopmentTriangle = developmentTriangle(newData,'Claims','values');
Взвешенное среднее объема является отношением ссылки, которое сопоставимо с моделью, используемой в этом подходе начальной загрузки.
bootstrappedAverageFactorsTable = linkRatioAverages(bootstrappedDevelopmentTriangle);
bootstrappedDevelopmentTriangle.SelectedLinkRatio = bootstrappedAverageFactorsTable{'Volume-weighted Average',:};
bootstrappedDevelopmentTriangle.TailFactor = 1;
bootstrappedSelectedFactorsTable = cdfSummary(bootstrappedDevelopmentTriangle);
disp(bootstrappedSelectedFactorsTable); 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120 Ultimate
_______ _______ ______ _______ _______ ______ _______ _______ _______ ________
Selected 1.1751 1.054 1.0253 1.0099 1.0048 1.0036 1.003 1.002 1.001 1
CDF to Ultimate 1.301 1.1072 1.0504 1.0245 1.0145 1.0096 1.006 1.003 1.001 1
Percent of Total Claims 0.76861 0.90321 0.952 0.97609 0.98572 0.9905 0.99403 0.99701 0.999 1
Используйте fullTriangle отобразить полное соответствие треугольника разработки выбранному отношению ссылки.
bootstrappedFullTriangle = fullTriangle(bootstrappedDevelopmentTriangle); disp(bootstrappedFullTriangle);
12 24 36 48 60 72 84 96 108 120 Ultimate
______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ________
2010 3995.7 4616.2 4863.2 4963.4 5023.7 5044.5 5064.1 5079.3 5089.5 5094.6 5094.6
2011 3968 4646.6 4869 4982.8 5024.8 5048.4 5068.1 5083.3 5093.4 5098.5 5098.5
2012 4217 4938.6 5181.1 5301.1 5341.9 5366.6 5383.3 5399.5 5410.2 5415.6 5415.6
2013 4374.2 5103.1 5425.3 5580.2 5642.5 5674.5 5693.8 5710.9 5722.3 5728 5728
2014 4499.7 5310.5 5567.5 5691.3 5755.4 5784.2 5804.8 5822.2 5833.8 5839.6 5839.6
2015 4530.2 5253.5 5536.3 5684.8 5733.2 5761 5781.5 5798.8 5810.4 5816.2 5816.2
2016 4572.6 5494.6 5803.9 5985.1 6044.2 6073.5 6095.1 6113.4 6125.6 6131.7 6131.7
2017 4680.6 5552.6 5879.4 6028.2 6087.7 6117.2 6139 6157.4 6169.7 6175.9 6175.9
2018 4696.7 5542.6 5842 5989.8 6048.9 6078.2 6099.9 6118.2 6130.4 6136.5 6136.5
2019 4945.9 5812 6126 6281 6343 6373.7 6396.4 6415.6 6428.4 6434.8 6434.8
Вычислите общие резервы из симулированного developmentTriangle.
bootstrappedDevelopmentTriangleTable = view(bootstrappedDevelopmentTriangle); bootstrappedIBNR = ultimateClaims(bootstrappedDevelopmentTriangle) - bootstrappedDevelopmentTriangle.LatestDiagonal; bootstrappedIBNR = array2table(bootstrappedIBNR, 'RowNames', bootstrappedDevelopmentTriangleTable.Properties.RowNames, 'VariableNames', {'IBNR'}); bootstrappedIBNR{'Total',1} = sum(bootstrappedIBNR{:,:}); disp(bootstrappedIBNR);
IBNR
______
2010 0
2011 5.0881
2012 16.188
2013 34.197
2014 55.485
2015 83.048
2016 146.61
2017 296.45
2018 593.94
2019 1489
Total 2720
Можно повторить предыдущие шаги много раз, чтобы сгенерировать полное, симулированный, распределение резервов. Симуляция производит резервы в течение каждого года и для общих резервов.
Создайте 1000 загруженные треугольники разработки и вычисляют понесенный, но не сообщил (IBNR) для каждого developmentTriangle.
n = 1000; simulatedIBNR = zeros(10,n); for i = 1:n simulatedResiduals = residuals; for j = 1:height(residuals)-1 for k = 1:width(residuals)-j+1 simulatedResiduals(j,k) = datasample(residuals(~isnan(residuals)),1); end end simulatedClaims = dTriangleTable.Variables; for j = 2:width(simulatedClaims) simulatedClaims(:,j) = currentSelectedFactors(1,j-1).*simulatedClaims(:,j-1) + estimatedStandardDeviations(1,j-1).*sqrt(simulatedClaims(:,j-1)).*simulatedResiduals(:,j-1); end simulatedClaims = reshape(simulatedClaims',100,1); simulatedClaims = simulatedClaims(~isnan(simulatedClaims)); simulatedData = data; simulatedData.ReportedClaims = simulatedClaims; simulatedDevelopmentTriangle = developmentTriangle(simulatedData); simulatedAverageFactorsTable = linkRatioAverages(simulatedDevelopmentTriangle); simulatedDevelopmentTriangle.SelectedLinkRatio = simulatedAverageFactorsTable{'Volume-weighted Average',:}; simulatedDevelopmentTriangle.TailFactor = 1; simulatedLatestDiagonal = simulatedDevelopmentTriangle.LatestDiagonal; simulatedProjectedUltimateClaims = ultimateClaims(simulatedDevelopmentTriangle); simulatedIBNR(:,i) = simulatedProjectedUltimateClaims - simulatedLatestDiagonal; end simulatedIBNR(end+1,:) = sum(simulatedIBNR);
Выберите год, чтобы построить распределение IBNR, вычислить среднее значение и сравнить то среднее значение с расчетным детерминированным значением.
originYear =5; гистограмма (simulatedIBNR (originYear+1, :)); содержание on; график (среднее значение (simulatedIBNR (originYear+1, :)), 0,'O','LineWidth',2) график (IBNR {originYear+1,1}, 0,'X','LineWidth',2); легенда'Simulated IBNR',['Simulated mean : ' num2str (вокруг (среднее значение (simulatedIBNR (originYear+1, :)), 2))], ['Deterministic IBNR : ' num2str (вокруг (IBNR {originYear+1,1}, 2))]); содержание off;

Постройте гистограмму общих количеств для IBNRs, симулированных средних значений и детерминированных значений.
histogram(simulatedIBNR(11,:)); hold on; plot(mean(simulatedIBNR(11,:)),0,'O','LineWidth',2) plot(IBNR{11,1},0,'X','LineWidth',2); legend('Simulated Total IBNR',['Simulated mean : ' num2str(round(mean(simulatedIBNR(11,:)),2))],['Deterministic Total IBNR : ' num2str(round(IBNR{11,1},2))]); hold off;

Wüthrich, Марио и Майкл Мерц. Стохастические методы резервирования требований в страховке. Хобокен, NJ: Вайли, 2008
Макинтош, Томас. "Вычисление без распределений стандартной погрешности цепочечных лестничных резервных оценок". Бюллетень Astin. Издание 23, № 2, 1993.
developmentTriangle | view | linkRatios | linkRatiosPlot | linkRatioAverages | cdfSummary | ultimateClaims | claimsPlot | fullTriangle | chainLadder | expectedClaims | bornhuetterFerguson | capeCod