首页 > 解决方案 > 如何根据滚动分数从投资组合中选择股票?

问题描述

我正在处理一个家庭作业问题,我应该根据某些限制构建股票投资组合。基于这些限制,我将在投资组合中选择我的股票,并每月根据这些分数对我的投资组合进行重新平衡。所以我有两个数据框——一个是股票收益,另一个是我将在投资组合中挑选股票的分数。此外,数据框的形状是 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:\Overlay\09_Projects\Madhav\Trial.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])

标签: pythonrebalancing

解决方案


如果我理解正确,您有两个数据框:一个带有股票(更具体地说是股票代码?),另一个带有分数。要选择最高/最低的 30 个,只需执行以下操作(跨名为分数的列):

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

我不确定您如何将分数与股票联系起来(我猜您仅通过查看数字就无法知道哪个是哪个),但一种选择是将两个数据框合并在一起,这样更容易对它们进行操作。因此,如果您有这样的数据框:

ticker          score 
AAPL              10
XOM               20
PINS              30

那么很容易对你的分数数据框进行映射:(假设你的第一个数据框称为 df_tickers,第二个是 df_scores 并且都有一个名为“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 )


推荐阅读