標籤:
1. 估計方法:Yule-Walker估計
.
2. 運行環境spyder2(python科學計算編輯器)
3. 實現代碼
# -*- coding: utf-8 -*-import numpy as np#建立數組用的包#設定初值A=9f = open(‘/Users/gaojiaxing/desktop/data.txt‘,‘a‘,encoding = ‘utf-8‘)f.write(‘時間跨度‘+‘ ‘+‘p值‘+‘ ‘+‘lamb值‘+‘ ‘+‘p均方誤差‘+‘ ‘+‘lamb均方誤差‘+‘ ‘+‘p的估計‘+‘ ‘+‘p的估計‘+‘ ‘+‘p的估計‘+‘ ‘+‘lamb的估計‘+‘ ‘+‘lamb的估計‘+‘ ‘+‘lamb的估計‘+‘\n‘)f.close()def sample_cov(alist,k): ‘‘‘ 這個函數是用來計算樣本的自共變數函數 ‘‘‘ n = len(alist) sum1 = 0 for i in range(n-k): sum1 = sum1 + (alist[i]-np.mean(alist))*(alist[i+k]-np.mean(alist)) return sum1/n def calc_lamb(alist): ‘‘‘ yule-walker估計求誤差項的 ‘‘‘ n = len(alist) error_sum = 0 for j in range(n-1): error_sum = error_sum + alist[j+1]-p*alist[j] return error_sum for time_len in range(50,250,50):#時間序列長度 for p in np.arange(0,1,0.1):#讓p值取0,0.1,0.2,...0.9的所有結果 for lamb in np.arange(0.2,1.4,0.4):#lamb取值0.2,0.6,1 claim_time_series = []#類比的最終1000組時間序列的存放在這裡 for i in range(1000): one_case = list(range(time_len))#one_case是一個理賠時間序列 one_case[0] = int(lamb/(1-p)) for j in range(1,time_len): one_case[j] = (np.random.binomial(one_case[j-1],p,size=1)+ np.random.poisson(lamb*np.random.gamma(shape=A,scale=1/A,size=1)))[0] claim_time_series.append(one_case) p_hat = []#根據樣本估計出來的P估計值將要存放的地方 for j in range(1000): p_hat.append(sample_cov(claim_time_series[j],1)/sample_cov(claim_time_series[j],0)) p_array = np.array(p_hat).reshape(1000)#轉換成數組,便於運算 p_mse = sum((p_array-p*np.ones(1000))**2)/1000#均方誤差 lamb_hat = [] for i in range(1000): lamb_hat.append(calc_lamb(claim_time_series[i])/(time_len-1)) lamb_array = np.array(lamb_hat).reshape(1000) lamb_mse = sum((lamb_array-lamb*np.ones(1000))**2)/1000 f = open(‘/Users/gaojiaxing/desktop/data.txt‘,‘a‘,encoding = ‘utf-8‘) f.write(str(time_len)+‘ ‘+str(p)+‘ ‘+str(lamb)+‘ ‘+str(p_mse)+‘ ‘+ str(lamb_mse)+‘ ‘+str(p_array[0])+‘ ‘+str(p_array[1])+‘ ‘+str(p_array[2])+‘ ‘+ str(lamb_array[0])+‘ ‘+str(lamb_array[1])+‘ ‘+str(lamb_array[2])+‘\n‘) f.close()
INAR(1)模型參數估計的電腦實現