大学计算-第8章-随机数与采样-课后练习II-随机游走

本文包含四个部分:1)一维随机游走带漂移的实现;2)一维随机游走的向量版优化;3)二维有墙随机游走的实现,限制在特定区域内;4)模拟股票价格变化,使用随机过程理论。代码主要使用numpy和matplotlib进行数值计算与图形绘制。

第1关:带漂移的一维随机游走

import random
random.seed(10)

def random_walk1D_drift(np, ns, r):
    #---------begin-----------
    pos = [0] * np
    for s in range(ns):
        for p in range(np):
            if random.random() < r:
                pos[p] += 1
            else:
                pos[p] -= 1
    return sum(pos)/np

第2关:带漂移的一维随机游走-向量版

import numpy
numpy.random.seed(10)


def random_walk1D_drift(np, ns, r):

    positions = numpy.zeros(np)     # 粒子位置初始化(起点为0)
    #---------begin-----------
    for s in range(ns):
        for p in range(np):
            if numpy.random.random() < r:
                positions[p] += 1
            else:
                positions[p] -= 1
    #---------end-----------

    return numpy.mean(positions)

第3关:有墙的二维随机游走

import numpy 
numpy.random.seed(10)

# 2维有墙随机游走
def random_walk2D_barrier(np, ns):
    # 初始化粒子位置
    X = numpy.zeros(np)
    Y = numpy.zeros(np)
    # 定义矩形区域 A
    xL, yL, xH, yH = -numpy.sqrt(ns), -numpy.sqrt(ns), numpy.sqrt(ns), numpy.sqrt(ns)
    for s in range(ns):
        for p in range(np):
        # 产生方向
            d = numpy.random.randint(1,5)
            s = 1
            # 根据方向和步长移动粒子
            if d==1: #北
                Y[p] += 1
                Y[p] = min(Y[p],yH)
            elif d==2: #南
                Y[p] -= 1
                Y[p] = max(Y[p],yL)
            elif d==3: #西
                X[p] -= 1
                X[p] = max(X[p],xL)
            else: #东
                X[p] += 1
                X[p] = min(X[p],xH)
    # 计算平均位置并返回
    mx, my = X.mean(), Y.mean()
    return mx, my

np = 1000             # 粒子数量

for ns in [100, 200]:   # 步数

    mx, my = random_walk2D_barrier(np, ns)

    #  打印结果

    print('粒子随机游走%d步后平均位置: (%.5f, %.5f)' %(ns, mx, my))

第4关:模拟股票价格

import numpy as np

np.random.seed(10)
import matplotlib.pyplot as plt


def simulate(p0, mu, sigma, T, N):
    dt = T / N
    prices = np.zeros(N + 1)
    prices[0] = p0

    for i in range(1, N + 1):
        drift = mu * prices[i - 1] * dt
        shock = sigma * prices[i - 1] * np.random.normal(scale=np.sqrt(dt))
        prices[i] = prices[i - 1] + drift + shock

    return prices


def draw_picture(prices):
    plt.figure(figsize=(8, 4))
    plt.plot(prices)
    plt.axis([-100, 5200, 8, 29])
    plt.savefig('src/step4/student/result.png')


N = 5000
T = 180
x0 = 10

prices = simulate(x0, 0.01, 0.03, T, N)
draw_picture(prices)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值