В этом примере показано, как применяться, цепочечная лестничная структура загружают метод, чтобы сгенерировать несколько 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)
developmentTriangle
developmentTriangle
соединитесь отношения оцениваются с помощью формулы:
Используйте 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