我正在尝试根据历史库存数据计算10年的远期回报。我有一个数据框:
import blpapi
options = blpapi.SessionOptions()
options.setServerHost('localhost')
options.setServerPort(8194)
session = blpapi.Session(options)
session.start()
from tia.bbg import LocalTerminal
import tia.bbg.datamgr as dm
# data manager
mgr = dm.BbgDataManager()
# Bloomberg variables
px = 'PX_LAST'
# start and end date
start_dt = '1952-01-01'
end_dt = date.today()
# tickers
mve_tick = 'NCBEILQ027S' # Fred
gdp_tick = 'GDP' # Fred
sp_tick = mgr['SPX INDEX'] # Bloomberg
# get data
mve = fred.get_series(mve_tick, observation_start = start_dt,
observation_end = end_dt)
gdp = fred.get_series(gdp_tick, observation_start = start_dt,
observation_end = end_dt)
sp = sp_tick.get_historical(px, start_dt, end_dt)
# create data frames
mve_df = pd.DataFrame(mve)
mve_df.index.name = 'Date'
mve_df.columns = ['MVE']
gdp_df = pd.DataFrame(gdp) * 1000
gdp_df.index.name = 'Date'
gdp_df.columns = ['GDP']
gdp_col = gdp_df['GDP']
sp_df = pd.DataFrame(sp)
sp_df.index.name = 'Date'
sp_df.columns = ['Price']
# convert S&P to quarterly return
sp_df = sp_df.resample('3MS').first()
sp_df_col = sp_df['Price']
# merge data frames
df = mve_df.join([gdp_col, sp_df_col])
df.reset_index(inplace = True)
df['Q Return'] = df['Price'].pct_change()
我想基于在“ Q Return”列上进行的计算来添加新列。
我想乘以col'Q Return'中前40个数据点的值,然后将该和乘积提高到(4/40),并将其作为我新添加的列中的第一个值。然后,下一个值将是“ Q return”列的1-41行的总和,然后将其提高到相同的指数,依此类推。
我编写了此函数来执行计算:
def fwdreturn(returns, t):
outp = 1
for i in range(t, t + 40):
outp = outp * i
return outp'
df['10 Year Fwd Return'] = [fwdreturn(df['Q Return'], t) for t in df['Q Return']] # this is where error is occuring
print(df)
我得到的错误是'float'对象无法解释为整数。
有没有更好的方法来解决这个问题?
答案 0 :(得分:0)
我不清楚您要完成什么,但是由于您将列中的每个值都以require 'delayed_job'
require 'delayed_job_active_record'
class Delayed::Job
establish_connection {"adapter"=>"mysql2",
"host"=>"127.0.0.1",
"username"=>"root",
"password"=>"aaaaa",
"port"=>3306,
"database"=>"users",
"reconnect"=>true,
"pool"=>10}
end
的形式传递给函数,然后尝试使用该错误,因此发生了错误将float值作为t
的参数(必须为整数)
如果您尝试将列中的每个值乘以该列中的下一个40个值,也许是这样的:
range
但是,当乘以少于40个后续值时,这将遇到一个巨大的问题。您必须弄清楚那时想要的结果是什么。
答案 1 :(得分:0)
我用这个来解决它:
def fwdreturn(returns, t):
outp = 1
for i in range(t, t + 40):
try:
outp = outp * df['Q Return'][i]
except KeyError:
return np.nan
return outp
df['10 Year Fwd Return'] = [fwdreturn(df['Q Return'], t) for t in df.index]
print(df)