python - 如何根据滚动分数从投资组合中选择股票?
问题描述
我正在处理一个家庭作业问题,我应该根据某些限制构建股票投资组合。基于这些限制,我将在投资组合中选择我的股票,并每月根据这些分数对我的投资组合进行重新平衡。所以我有两个数据框——一个是股票收益,另一个是我将在投资组合中挑选股票的分数。此外,数据框的形状是 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])
解决方案
如果我理解正确,您有两个数据框:一个带有股票(更具体地说是股票代码?),另一个带有分数。要选择最高/最低的 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 )
推荐阅读
- javascript - 如何在 Tizen 可穿戴 Web 应用程序上使用语音控制?
- javascript - 如何修复反应过多的重新渲染错误?
- php - 标头中的多个 set-cookies 相互重写 curl
- powerbi - DAX - 在度量中将 EXCEPT 和 INTERSECT 替换为 NATURALLEFTOUTERJOIN
- view - 在 SwiftUI 中,我有两个包装 Shape 的结构,一个有效,一个无效,但我看不出两者在功能上有任何区别
- r - RStudio 中的 tinytex 无法生成 pdf 文件
- r - 是否有一个 R 函数可以为我的外生变量的所有可能组合拟合 ARIMAX 模型?
- android - 为什么我的 Flutter App 构建 APK 后会出现灰屏?
- node.js - Nodejs & SerialPort.list() -> 如何从 Promise 中获取变量并使其在漏洞项目中可用
- javascript - ReactJS - 如何处理回调?第二个函数在第一条语句之前调用