【发布时间】:2017-04-17 16:53:31
【问题描述】:
我正在学习 Python 和 pandas,并练习不同的股票计算。我已尝试搜索有关此问题的帮助,但没有找到足够相似的响应,或者不明白如何根据之前的响应推断出正确的方法。
我已使用 datareader 将给定时间范围内的股票数据读取到数据帧 df 中。在 df 我有 Date Volume 和 Adj Close 列,我想用它们来根据给定的标准创建一个新列“OBV”。 OBV 是一个累积值,根据调整后的收盘价将今天的交易量值加上或减去前一天的 OBV。
OBV的计算很简单:
如果今天的调整收盘价高于昨天的调整收盘价,则将今天的交易量与昨天的(累计)交易量相加。
如果今天的调整收盘价低于昨天的调整收盘价,则从昨天的(累计)交易量中减去今天的交易量。
在第 1 天,OBV = 0
然后在时间范围内重复此操作并累积 OBV。
这是基本的导入并开始
import numpy as np
import pandas as pd
import pandas_datareader
import datetime
from pandas_datareader import data, wb
start = datetime.date(2012, 4, 16)
end = datetime.date(2017, 4, 13)
# Reading in Yahoo Finance data with DataReader
df = data.DataReader('GOOG', 'yahoo', start, end)
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
#This is what I cannot get to work, and I've tried two different ways.
#ATTEMPT1
def obv1(column):
if column["Adj Close"] > column["Adj close"].shift(-1):
val = column["Volume"].shift(-1) + column["Volume"]
else:
val = column["Volume"].shift(-1) - column["Volume"]
return val
df["OBV"] = df.apply(obv1, axis=1)
#ATTEMPT 2
def obv1(df):
if df["Adj Close"] > df["Adj close"].shift(-1):
val = df["Volume"].shift(-1) + df["Volume"]
else:
val = df["Volume"].shift(-1) - df["Volume"]
return val
df["OBV"] = df.apply(obv1, axis=1)
两者都给我一个错误。
【问题讨论】:
-
如果当天的 AdjClose 没有变化会怎样?
-
这是非常罕见的,因为在雅虎的数据中价格被评估到小数点后六位,但理论上,当然是实践。对于大多数 OBV,我的理解是,如果今天的调整收盘价高于或等于昨天的调整收盘价,则将今天的交易量添加到昨天的(累积)交易量。
标签: python function pandas dataframe