如何根据滚动基于分数从投资组合中选择股票



我正在处理一个家庭作业问题,我应该根据某些约束来构建股票组合。基于这些约束,我将在投资组合中选择我的股票,并根据这些分数每月进行投资组合的重新平衡。因此,我有两个数据范围 - 一个是股票回报,另一个是我将在投资组合中我的股票的分数。此外,数据框形状为12x360,即日期是索引,列标题是库存。我有一个360个股票宇宙,必须根据分数选择前30名和底部30。

由于我是Python的新手,因此我很难根据另一个数据框中的值从数据范围中选择库存。其次,是否可以在一行中选择前30个和底部的30个分数,因为我的日期是数据框架的索引。

以下是我准备清洁和计算退货的初始代码。如果有人可以指导我下一步,我将非常感激。

import pandas as pd
import numpy as np

def log_return(price):
    return np.log(price) - np.log(price.shift(1)) 
dataframe = pd.read_excel(r'M:Overlay9_ProjectsMadhavTrial.xlsx')
df1 = dataframe.iloc[:,0:14]
df1 = df1.transpose()
df1.columns = df1.iloc[0]
df1 = df1.drop(df1.index[[0,1]])

for cols in df1:
    df1[cols] = pd.to_numeric(df1[cols])
df1_ret = log_return(df1)
df2 = dataframe
df2.drop(df2.iloc[:, 1:14], axis = 1, inplace=True)
df2 = df2.transpose()
df2.columns = df2.iloc[0]
df2 = df2.drop(df2.index[0])
for cols in df2:
    df2[cols] = pd.to_numeric(df2[cols])

如果我正确理解,您有两个数据帧:一个带有股票(更具体的滴答器?(,另一个具有分数。选择三十高/最低的只是做(跨称为得分的列(:

top_30 = df.nlargest(30,'scores')
bottom_30= df.nsmallest(30,'scores')

我不确定您是如何将分数链接到股票的(我猜您不知道哪一个是通过查看数字(,但是一个选项是将两个数据帧合并在一起,所以它更容易对其进行操作。因此,如果您有这样的数据框架:

ticker          score 
AAPL              10
XOM               20
PINS              30

那么,很容易对您的分数数据帧进行映射:(假设您的第一个数据帧称为DF_Tickers,第二个是DF_SCORE,并且都具有称为" tickers"的通用列(

df_scores = df[['ticker','scores']] 
df_scores = df_scores.set_index('ticker').to_dict()['scores']
df_tickers['scores'] = df_tickers['ticker'].replace(df_scores )

最新更新