【问题标题】:How to go about selecting stocks from a portfolio based on scores on a rolling basis?如何根据滚动分数从投资组合中选择股票?
【发布时间】:2019-08-02 13:16:33
【问题描述】:

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

【问题讨论】:

    标签: python rebalancing


    【解决方案1】:

    如果我理解正确,您有两个数据框:一个包含股票(更具体地说是股票代码?),另一个包含分数。要选择 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 )
    
    

    【讨论】:

    • 感谢您的回复。两个数据框都有股票代码。一个数据框是带有股票回报的代码,另一个是带有分数的代码。现在对我来说棘手的是票是列标题而不是行。所以我将不得不遍历每一行(因为单行是一个数据点)。我了解代码可用于从其他数据框中选择股票
    • 您不能旋转它们来制作行情代码吗?这会让你更直观 10 倍
    • 我同意这会更直观,但由于我的分析是时间序列,我希望时间数据点是行,而代码是列标题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多