随机过程定义:
- collection of random variables indexed by time
按时间索引的随机变量集合
- A probability distribution over paths
路径上的概率分布
随机游走
举个例子:
例如:抛硬币,正面向前走1步,背面向后走1步。因此,向前走的概率是0.5,向后走的概率是0.5,每秒行走一次。假设我们现在处于第10秒。
- 马尔可夫(Markov Chain):我们“知道第10秒的位置,第11秒的概率分布”和“知道前10秒所有位置,第11秒的概率分布”相同。解释一下,比如说我们知道第十秒的位置在1,那么第11秒的位置在2的概率为0.5,在0的概率为0.5,在其他位置的概率为0。但是我们得到这个结论,与前9秒位置无关。 Markov Chain英文定义为“Stochastic process whose effect of the past on future is summarized only by the current state."
- 鞅过程(Martingale):假设我们知道第10秒的位置为1,预测第12秒的位置,那么最佳预测是什么呢?答案是,在第10秒的位置不变,即维持在1不变。这是一个简单的例子,有四种可能性,(+1,+1),(+1,-1),(-1,+1,)(-1,-1)。他们的概率均为0.25,因此期望为0. 那如果预测100秒的位置呢?答案还是在10秒的位置不变,即维持在1不变。假设Fk为已知信息,则l时刻的期望值为
- 二次变差(Quadratic variation): 相邻时间间隔内差值的平方和。 假设现在从0时刻开始:
- 方差(variance):
.假设现在从0时刻开始:
注意二次变差(Quadratic variation)和方差(variance)的区别,前者基于已实现的路径,后者描述未来的不确定性。虽然结果相同
我们来模拟几条随机游走曲线
import
用二项分布产生随机产生0,1个数,从0时刻到100时刻,左侧是模拟的四条随机游走曲线,右侧是模拟100条随机游走曲线在终点的位置。(黑色曲线为
,由图可知,由于不服从大数定律,因此时刻100的概率分布
不服从正态分布。
标准布朗运动
如果每秒投掷n次(足够大),每次向前行走
步,那么简单随机游走就变成了标准布朗运动
性质:
- 马尔可夫(Markov Chain):标准布朗运动与随机游走均为马尔可夫过程。
- 鞅过程(Martingale):标准布朗运动与随机游走均为鞅过程
- 二次变差(Quadratic variation): 相邻时间间隔内差值的平方和。 假设现在从0时刻开始,且t和t-1间隔无穷小,则:
。可以得到一个重要结论
- 方差(variance):
.服从正态分布。(随机游走不服从正态分布,因为不服从大数定律)
我们来模拟几条随机游走曲线:
def Brown_movement(length):
line =[]
line.append(float(0))
for i in range (1,length):
each_step = float((2*np.random.binomial(1,0.5,1)-1)/math.sqrt(length))
add=float(line[i-1]+each_step)
line.append(add)
return line
y1=np.sqrt(np.array(range(1001))/1000)
y2=2*np.sqrt(np.array(range(1001))/1000)
for i in range(0,4):
walk=Brown_movement(1000)
plt.plot(walk)
plt.plot(y1,'k')
plt.plot(-y1,'k')
plt.plot(y2,'k')
plt.plot(-y2,'k')
plt.grid(True)
plt.xticks(range(0,1001,1000),{"0","1"})
plt.show()
nnn=10000
sum = []
for i in range(0,nnn):
walk=Brown_movement(1000)
sum.append(walk[-1])
b=np.array(range(-90,91))/30
plt.hist(sum, b)
plt.show()
用二项分布产生随机产生0,1个数,从0时刻到1时刻,每个时刻震动1000次,左侧是模拟的四条标准布朗运动曲线,右侧是模拟10000条随机游走曲线在终点的位置。(黑色曲线为
,由图可知,由于服从大数定律,因此时刻1的概率分布
服从正态分布。
下面是分别模拟100,1000,10000,100000条标准布朗运动曲线,可以看出服从正态分布。(大数定律)
几何布朗运动
通常认为股票的收益率服从几何布朗运动。
,其中
是收益率,
是趋势(drift),
是风险、不确定性(Volatility)。由此可以得出
- 不是鞅过程(Martingale):
因为存在趋势项
- 方差(variance):
.
Hurst指数
参考:Gingili的做法,计算Hurst指数。具体计算方法见链接
- Hurst指数>0.5,保持趋势的可能性强。
- Hurst 指数< 0.5 ,反转的的可能性强。
- Hurst指数=0.5 近似于随机游走
计算布朗运动的Hurst指数。
假设标准布朗运动每秒振动1000次(n取向无穷大),计算1000秒布朗运动。计算Hurst指数。
图左表示收益率,即每1秒布朗运动的值,Hurst指数为0.57
图右表示累计收益率,即0秒-1000秒的累计收益(初始价格为1元的股票的股价),Hurst指数为1.00
def Hurst(data):
pannel_num = 8
ARS =[]
lag =[]
for i in range(pannel_num):
size = np.size(data) // (2 ** i)
lag.append(size)
panel = {}
for sub_pannel_num in range((2 ** i)):
panel["sub_pannel:"+str(sub_pannel_num)] = data[sub_pannel_num*size:(sub_pannel_num+1)*size]
panel = pd.DataFrame(panel)
mean = panel.mean()
Dev = (panel - mean).cumsum()
sigma = panel.std()
RS = (Dev.max() - Dev.min())/sigma
ARS.append(RS.mean())
lag = np.log10(lag)
ARS = np.log10(ARS)
hurst_exponent = np.polyfit(lag, ARS, 1)
hurst = hurst_exponent[0]
return hurst
ret=[]
price=[]
ret.append(float(0))
price.append(float(0))
for i in range(1,1000):
walk=Brown_movement(1000)
ret.append(float(walk[-1]))
price.append(float(walk[-1])+price[i-1])
print(Hurst(ret))
print(Hurst(price))
plt.plot(ret,'k')
plt.show()
plt.plot(price,'k')
plt.show()