【问题标题】:Value returns zero after one operation一次操作后值返回零
【发布时间】:2016-05-04 21:21:33
【问题描述】:
from numpy import std
import csv

data = []
with open('Data.csv') as file:
    reader = csv.reader(file)
    for column in zip(*reader):
        data.append(column)
dates = list(reversed(open('Dates.csv').read().split('\n')))
stock_value = [int(x) for x in open('stock_value.csv').read().split(',')]
companies = open('companies.csv').read().split(',')
stock_change = {}
with open('Data.csv') as file:
    reader = list(csv.reader(file))
    for i, j in enumerate(dates):
        stock_change[j] = map(float, reader[i])
company_value = dict(zip(companies, stock_value))


def change(invested, date):
    """Will return the change of invested stocks at the given date."""
    sum_product = sum([value[0] * value[1] * data for value, data
                  in zip(invested, stock_change[date])])
    _sum = sum([value[0] * value[1] for value in invested])
    return sum_product / _sum


def total_change(invested):
    """Will return the total change associated with an investment."""
    total_changes = []
    for date in dates:
        total_changes.append(change(list(zip(stock_value, invested)), date))
    return total_changes


def volatility(invested):
    """Will return the std deviation from the total_change of the invested."""
    return std(total_change(invested), ddof=1)


def tuner(invested):
    """Will return a weight list."""
    weights = []
    for i in range(465):
        temp = invested[:]
        temp1 = temp[:]
        print(stock_value)
        while True:
            temp[i] = temp[i] + 1
            if volatility(temp) < volatility(temp1):
                temp1 = temp[:]
            else:
                temp[i] = temp[i] - 1
                break
        weights.append(temp[i])
    return weights

invested = [0] * 465
invested[0] = 1
print(tuner(invested))

Data.csv 文件包含 881 行数据,如下所示:

1.7529880478,2.8552887735,2.2606138577,1.7495626093,0.9274873524,0.6702840728,0.2543720191,2.1072796935,2.2385449458,2.2860610965,0.2590673575,...

每行对应一个日期。 company.csv 是一个文件,其中包含 465 个以逗号分隔的条目,其中包含公司的所有名称,而 stock_value.csv 包含以逗号分隔的 465 个条目,其中每个条目是同一索引中公司股票的值就像它一样。

在我打印 temp 的波动率、temp1 = 0 的波动率之后的调谐器函数中,然后在 temp = 0 的下一个循环波动率中,temp1 的波动率也是如此。有谁知道为什么我的价值观变为零?

【问题讨论】:

  • @AlexanderHuszagh 抱歉,我现在修好了。
  • 另外,抱歉,示例中没有日期。而且我相信 stock_change 和 stock_value 也不包括在内。如果没有所有细节,很难修复一个示例。如果这太多了,创建一个 MVCE:stackoverflow.com/help/mcve
  • @AlexanderHuszagh 是否足够详细,还是我需要更多?
  • 您可能需要检查您的 changetotal_change 函数。老实说,我怀疑您将单个值附加到 total_change,因此您的标准偏差将始终为 0。
  • @AlexanderHuszagh 如果列表仅包含 1 项,我会收到错误消息。

标签: python-3.x numpy stocks


【解决方案1】:

哦,等等。我知道。抱歉,我只是仔细看了一下代码。

你有这个(我改变它使它更清晰一点):

def change(vs):
    product = sum([v[0] * v[1] * d for v, d in zip(vs, ds)])
    sums = sum([v[0] * v[1] for v in vs])
    return product / sums

现在,使用基本数学,我们得到:

(v1 * v2 * d) / (v1 * v2)
(v1 * v2) * d / (v1 * v2)
d

所以,这个等式总是等于:

def change(vs):
    return sum(ds)

如果您注意到,您的输出不依赖于您的输入,因此它是一个独立变量,因此返回一个常量值,将您的所有值归零。

这有点过于简单了,因为您确实通过了日期,然后抓住了库存变化。但是由于传递了相同的日期数组,因此您将得到一个从total_change 返回的常量数组。

【讨论】:

    猜你喜欢
    • 2023-01-30
    • 2021-03-28
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    相关资源
    最近更新 更多