首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python中使一个简单的股票价格模拟过程更加高效?

如何在Python中使一个简单的股票价格模拟过程更加高效?
EN

Stack Overflow用户
提问于 2019-07-11 03:22:53
回答 2查看 312关注 0票数 1

我编写了一些非常简单的代码来模拟股票价格,假设股票价格每天在-2%和+2%之间随机波动(它过于简单,但出于演示目的,我认为它比使用GMB公式更容易)。

我的问题是它非常慢,我知道这是因为我使用了双循环。据我所知,我也许能够使用矢量化,但我不知道如何使用。

基本上,我所做的是创建100个模拟,假设一年中有256个交易日,每天之前的股票价格乘以一个介于.98和1.02之间的随机数。

我目前使用嵌套的for循环来完成这项工作。据我所知,这并不好,但作为一个新手,我在向量化方面遇到了困难。我在网上读到过,根据我的理解,你会尝试将它们转换成矩阵,并使用矩阵乘法,而不是使用循环,但我不确定如何在这里应用。有谁能给我指个方向吗?

代码语言:javascript
复制
from numpy import exp, sqrt, log, linspace
from random import gauss
from random import uniform
import pandas as pd


nsims = 100
stpx = 100
days = 256
mainframe = pd.DataFrame(0, index = list(range(1,days)), columns = list(range(1,nsims)))
mainframe.iloc[0] = stpx
for i in range(0, nsims-1):
    for x in range(1, days-1):
        mainframe.iloc[x, i] = mainframe.iloc[x-1, i]* uniform(.98, 1.02)
EN

回答 2

Stack Overflow用户

发布于 2019-07-11 03:42:16

当一个计算依赖于前一个计算的结果时,向量化可能是棘手的,比如在这种情况下,x天需要知道x-1天的结果。我不会说它做不到,因为很可能有人能找到一种方法,但这是我的解决方案,至少摆脱了其中一个循环。我们仍然循环几天,但我们通过生成一个随机数数组并利用numpy的逐个元素乘法(这比使用循环快得多)一次完成所有100个模拟:

您将需要添加以下导入:

代码语言:javascript
复制
import numpy as np

然后将您的嵌套循环替换为以下单个循环:

代码语言:javascript
复制
for x in range(1, days-1):
    mainframe.iloc[x] = mainframe.iloc[x-1] * np.random.uniform(0.98, 1.02, nsims-1)

编辑为相加:因为您使用的是一个非常简单的公式,只涉及基本乘法,所以您实际上可以通过生成一个随机的数字矩阵来消除这两个循环,使用numpy的累积乘积函数逐列地将其乘以一个DataFrame,其中每个值从100开始。但是,如果您开始使用更复杂的公式,我不确定这样的方法是否可行。不管怎样,它是这样的:

代码语言:javascript
复制
import pandas as pd
import numpy as np

nsims = 100
stpx = 100
days = 256

mainframe = pd.DataFrame(stpx, index=list(range(1, days)), columns=list(range(1, nsims)))
rand_matrix = np.random.uniform(0.98, 1.02, (days-2, nsims-1)).cumprod(axis=0)
mainframe.iloc[1:] *= rand_matrix
票数 0
EN

Stack Overflow用户

发布于 2019-07-11 03:42:16

我为这个问题找到了一个出人意料的好解决方案,基于haar小波!

这个想法是从从某一点开始的一些线性数据开始:

代码语言:javascript
复制
u = np.linspace(-1.0, 1.0, n)

要在此之上添加haar小波,为了确保第一个和最后一个点是固定的,haar小波必须包含在窗口中(对于1024的初始样本,此处为1:1023 )。

代码语言:javascript
复制
#!/usr/bin/env python3

import random

import numpy as np
import matplotlib.pyplot as plt

n = 1024
k = 0.1

i = list(range(1, n-1))
u = np.linspace(-1.0, 1.0, n)
plt.figure()
plt.plot(u)

for m in range(1000) :
    random.shuffle(i)
    a, b, c, d = i[:4]
    e = 1 if d % 2 == 0 else -1
    v = np.zeros((n,))
    v[a:b] = k * e
    v[b:c] = -k * e
    u = u + v

plt.plot(u)
plt.savefig("haar_stock.png")
plt.show()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56977362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档