0

我正在尝试运行一个模拟,其中我执行以下操作:

  1. 从 0 到 1 之间的均匀分布中抽取 2000 个随机样本
  2. 计算任何样本与之前选择的样本之间的差异 du
  3. 使用该差异计算 r=EXP(-a*du)
  4. 将另一个随机样本 z 与 r 的计算值进行比较
  5. 创建 r>z 的随机样本列表,并丢弃所有其他样本
  6. 重复这个过程,直到 2000 个样本被“接受”

这是我到目前为止所拥有的。当我运行此代码时,我收到错误消息“'numpy.float64' object has no attribute 'append'”。有关如何解决此问题的任何想法?

import numpy as np                                                          
import matplotlib.pyplot as plt                                             
import math                                                                 

NP=np.random.uniform(0,1,size=(2000,))                                      
a=np.linspace(0.1,2,num=20)                                                 

for i in range(len(a)):                                                     
    dr = []                                                                 
    du = []                                                                 
    for j in range(1999):                                                   
        du=N[j+1]-N[j]                                                      
        r=math.exp(-a[i]*du)                                                
        z=np.random.uniform(0,1)                                            
        if r>z:                                                             
            du.append(N[j+1])                                               
            dr.append(r)
4

2 回答 2

3

du对两个不同的概念(所有有效值的容器和每次迭代的du每个单独值)使用相同的变量名称。du

将您的代码更改为du_values = []anddu_values.append(N[j + 1])它应该可以工作。

顺便说一句,您的代码中似乎有一个错字 - 您将原始数组定义为NP,但稍后将其称为N.

于 2019-03-18T23:04:52.497 回答
0

请注意,由于您没有提供任何代码,因此我将向您展示的代码不是您准备的,而是我使用过的代码,听起来您可以轻松地满足您的需求。

 # this will simulate 1000 different combinations of my portfolio
    for x in range(1000):
        weights = np.random.random(len(tickers))
        weights /= np.sum(weights)
        portfolio_returns.append(np.sum(weights * log_returns.mean()) * 250)
        portfolio_volatilities.append(np.sqrt(np.dot(weights.T, np.dot(log_returns.cov() * 250, weights))))

这段代码所做的很短,是 1000x,它为我的数据点创建随机数和权重,然后附加结果。代码不会是统一的,因为它是随机的,但如果你真的想要统一,你可以简单地逐步完成增量。但是,我认为您不需要统一,而是需要足够大的样本量,以免被异常值抛弃。

比较结果的一种方法是这样的。

simple_return = (mydata / mydata.shift(1)) - 1

比较随机样本应该非常简单,所以如果您确实需要帮助,请跟进。使用 numpy 数组,您还可以根据条件过滤/删除项目。

抱歉,如果这些不能准确回答您想要的,但它应该让您朝着正确的方向前进。

于 2019-03-18T23:04:48.080 回答