【问题标题】:Mysterious Bug Within Python Loop? [duplicate]Python循环中的神秘错误? [复制]
【发布时间】:2018-02-23 23:45:56
【问题描述】:

所以,当我在代码中遇到这个难以理解的错误时,我正在研究一些基本的金融,试图模拟一些随机的股票价格路径。我尝试在嵌套循环中多次print 输出一个数字,但由于某种原因,数字会有所不同。

到目前为止我的代码:

# Imports.

%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from math import *

# Error-producing section - randnorm holds a 10x10 vector of normally distributed 
# random numbers, used in calculating my price path.

sims = 5
intervals = 5
r=.02
T=1
sigma=.15

paths = [[1]*intervals]*sims
randnorm = [[np.random.normal() for x in range(10)] for y in range(10)]
# print(randnorm)

for i in range(sims):
    for j in range(1,intervals):
        paths[i][j] = paths[i][j-1] * exp((r - .5*sigma**2)*(T/intervals) + sqrt(T/intervals)*randnorm[i][j-1])
        print(paths[0][1])

我知道我之前的代码有问题,所以我尝试通过在每个循环中打印来进行调试,我明白了,

0.5937221173702402
0.5937221173702402
0.5937221173702402
0.5937221173702402
1.4849274521869171
1.4849274521869171
1.4849274521869171
1.4849274521869171
0.860018700453769
0.860018700453769
0.860018700453769
0.860018700453769
1.0709782525755074
1.0709782525755074
1.0709782525755074
1.0709782525755074
0.7184834195858915
0.7184834195858915
0.7184834195858915
0.7184834195858915

什么给了?我真的不知道我在这里可能错在哪里。这不是我的随机数,它们都不同,也不是索引问题。

【问题讨论】:

  • 期望输出是什么?
  • 您知道您在重复打印paths[0][1],而不是paths[i][j]
  • 不知道,你告诉我们。正如@jonrsharpe 所问,您期望什么?
  • 什么是paths
  • 心理调试时间:paths 被定义为[[something]*something]*something 或类似的东西,导致它成为一组对同一子列表的引用的列表。

标签: python loops for-loop random


【解决方案1】:

它必须与您的数组的创建方式有关,因为将 np.ndarray 的大小设为 simsxintervals 会导致输出保持完全相同(0.0 或类似零的浮动0.x*10-8 的错误)。

paths = np.ndarray((sims, intervals))
for i in range(sims):
    for j in range(1,intervals):
        paths[i][j] = paths[i][j-1] * exp((r - .5*sigma**2)*(T/intervals) + sqrt(T/intervals)*randnorm[i][j-1])
        print(paths[0][1])

输出:

0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0

如果没有更多解释 paths 究竟是什么,它是如何产生的,以及它是循环前的值,就不可能诊断出问题。


编辑

更新问题后,解决方法是只使用np.ones 来制作矩阵。

paths = np.ones((sims, intervals))

当前实现导致标记重复出现问题,其中每个列表都是对同一列表的引用,因此修改一个将修改所有列表。

【讨论】:

  • 我在我的代码中包含了我声明paths的方式,我之前不小心省略了。
  • @Coolio2654 我已经更新了答案,即使它被标记为重复。
猜你喜欢
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
  • 2014-06-07
  • 2015-06-29
  • 1970-01-01
  • 2015-03-13
相关资源
最近更新 更多