我们需要计算不断重新平衡的2只股票组合.让我们称他们为A和B.他们都应该有相同的投资组合部分.因此,如果我在我的投资组合中有100美元,则50美元投资A和50美元投资.由于两只股票的表现差异很大,他们不会保持相同的权重(3个月后A已经可能值70美元而B降至45 $).问题是他们必须将他们在投资组合中的份额保持在一定的容忍带宽内.此带宽为5%.所以我需要一个功能:如果A> B*1.05或A*1.05 <B则重新平衡.
第一部分仅用于以最快的方式获得一些数据以具有共同的讨论基础并使结果具有可比性,因此您只需复制并粘贴整个代码即可.
import pandas as pd
from datetime import datetime
import numpy as np
df1 = pd.io.data.get_data_yahoo("IBM",
start=datetime(1970, 1, 1),
end=datetime.today())
df1.rename(columns={'Adj Close': 'ibm'}, inplace=True)
df2 = pd.io.data.get_data_yahoo("F",
start=datetime(1970, 1, 1),
end=datetime.today())
df2.rename(columns={'Adj Close': 'ford'}, inplace=True)
df = df1.join(df2.ford, how='inner')
del df["Open"]
del df["High"]
del df["Low"]
del df["Close"]
del df["Volume"]
Run Code Online (Sandbox Code Playgroud)
现在开始用公式计算每种股票的相对表现:df.ibm/df.ibm [0].问题是,一旦我们打破第一个带宽,我们需要在公式中重置0:df.ibm/df.ibm [0],因为我们重新平衡并需要从该点开始计算.因此,我们将df.d用于此占位符函数,并在带宽被破坏时将其设置为等于df.t df.t基本上只计算数据帧的长度,因此可以告诉我们"我们在哪里".所以这里开始实际计算:
tol = 0.05 #settintg the bandwidth tolerance
df["d"]= 0 #
df["t"]= np.arange(len(df))
tol = 0.3
def flex_relative(x):
if df.ibm/df.ibm.iloc[df.d].values < df.ford/df.ford.iloc[df.d].values * (1+tol): …Run Code Online (Sandbox Code Playgroud) 我很遗憾地问这个看似简单的问题,但我是一个蟒蛇初学者,无法在任何地方找到答案.我想运行一个简单的if语句,但是python只返回:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Run Code Online (Sandbox Code Playgroud)
无论我申请哪种替代方案 - 它都行不通.你有什么想法?
import pandas as pd
df = pd.DataFrame({'a': [None] * 4, 'b': [2, 3, 10, 3]})
df["c"] =0
if df.b == 2:
df.c =1
Run Code Online (Sandbox Code Playgroud) 到目前为止,EdChum提供了以下代码:
In [1]:
df = pd.DataFrame({'a': [None] * 6, 'b': [2, 3, 10, 3, 5, 8]})
df["c"] =np.NaN
df["c"][0] = 1
df["c"][2] = 3
def func(x):
if pd.notnull(x['c']):
return x['c']
else:
return df.iloc[x.name - 1]['c'] * x['b']
df['c'] = df.apply(func, axis =1)
df['c'] = df.apply(func, axis =1)
df['c'] = df.apply(func, axis =1)
df
Out[1]:
a b c
0 None 2 1
1 None 3 3
2 None 10 3
3 None 3 9
4 None 5 45
5 None 8 …Run Code Online (Sandbox Code Playgroud)