我想创建一个脚本,根据该篮子的整体回报,寻找在一个月内购买和出售一篮子股票的最佳时间。
例如,如果我在第2天买入并在第12天卖出,则股票1的最高收益为8%。如果我在第9天买入并在第15天卖出,则股票2的最高收益为4%。如果我在第1天买入,而在第20天卖出,则股票3的最高收益为-1%。我的问题是,您如何编写一个脚本来查看所有三只股票的所有收益可能性,并得出一个输出如果我必须在同一天买进所有三只股票并在同一天卖出,则将产生一篮子股票的最高回报。
例如,所有三只股票的最高收益可能是在第4天买入并在第17天卖出,其中,股票1,股票2、3.5%和-1.25的总投资回报率为7%股票3的百分比。这是基于以下事实:如果必须在同一天买卖这三只股票,我们将无法获得每种股票的最佳收益。
答案 0 :(得分:1)
按日期对df进行排序。
df = df.sort_values(by ='Date', ascending=True)
然后每天汇总所有库存
df['total'] = df[['TSLA Price', 'NVDA Price', 'AAPL Price']].sum(axis=1)
然后使用以下功能
def max_profit(li):
max_profit, purchase_on, sell_on = 0, 0, 0
for i, buy in enumerate(li):
for j, sell in enumerate(li[i+1:]):
if sell-buy > max_profit:
max_profit, purchase_on, sell_on = sell-buy, i, i+j+1
return max_profit, purchase_on, sell_on
max_profit, purchase_on, sell_on = max_profit(df['total'].tolist())
购买/出售日期为...
buy_date, sell_date = df['Date'].iloc[purchase_on], df['Date'].iloc[sell_on ]
要权重不同,只需将股票乘以权重,然后求和即可。
答案 1 :(得分:0)
这看起来像是一个很老的帖子,但是我会为您提供的内容再介绍一下。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import scipy.optimize as sco
import datetime as dt
import math
from datetime import datetime, timedelta
from pandas_datareader import data as wb
from sklearn.cluster import KMeans
np.random.seed(777)
start = '2018-06-30'
end = '2020-06-30'
# N = 90
# start = datetime.now() - timedelta(days=N)
# end = dt.datetime.today()
tickers = ['AXP','AAPL','BA','CAT','CSCO','CVX','XOM','GS','HD','IBM','INTC','JNJ','KO','JPM','MCD','MMM','MRK','MSFT','NKE','PFE','PG','TRV','UNH','RTX','VZ','V','WBA','WMT','DIS','DOW']
thelen = len(tickers)
price_data = []
for ticker in tickers:
prices = wb.DataReader(ticker, start = start, end = end, data_source='yahoo')[['Adj Close']]
price_data.append(prices.assign(ticker=ticker)[['ticker', 'Adj Close']])
df = pd.concat(price_data)
df.dtypes
df.head()
df.shape
pd.set_option('display.max_columns', 500)
df = df.reset_index()
df = df.set_index('Date')
table = df.pivot(columns='ticker')
# By specifying col[1] in below list comprehension
# You can select the stock names under multi-level column
table.columns = [col[1] for col in table.columns]
table.head()
def portfolio_annualised_performance(weights, mean_returns, cov_matrix):
returns = np.sum(mean_returns*weights ) *252
std = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights))) * np.sqrt(252)
return std, returns
def random_portfolios(num_portfolios, mean_returns, cov_matrix, risk_free_rate):
results = np.zeros((3,num_portfolios))
weights_record = []
for i in range(num_portfolios):
weights = np.random.random(thelen)
weights /= np.sum(weights)
weights_record.append(weights)
portfolio_std_dev, portfolio_return = portfolio_annualised_performance(weights, mean_returns, cov_matrix)
results[0,i] = portfolio_std_dev
results[1,i] = portfolio_return
results[2,i] = (portfolio_return - risk_free_rate) / portfolio_std_dev
return results, weights_record
returns = table.pct_change()
mean_returns = returns.mean()
cov_matrix = returns.cov()
num_portfolios = 10000
risk_free_rate = 0.0178
def display_simulated_ef_with_random(mean_returns, cov_matrix, num_portfolios, risk_free_rate):
results, weights = random_portfolios(num_portfolios,mean_returns, cov_matrix, risk_free_rate)
max_sharpe_idx = np.argmax(results[2])
sdp, rp = results[0,max_sharpe_idx], results[1,max_sharpe_idx]
max_sharpe_allocation = pd.DataFrame(weights[max_sharpe_idx],index=table.columns,columns=['allocation'])
max_sharpe_allocation.allocation = [round(i*100,2)for i in max_sharpe_allocation.allocation]
max_sharpe_allocation = max_sharpe_allocation.T
min_vol_idx = np.argmin(results[0])
sdp_min, rp_min = results[0,min_vol_idx], results[1,min_vol_idx]
min_vol_allocation = pd.DataFrame(weights[min_vol_idx],index=table.columns,columns=['allocation'])
min_vol_allocation.allocation = [round(i*100,2)for i in min_vol_allocation.allocation]
min_vol_allocation = min_vol_allocation.T
print("-")
print("Maximum Sharpe Ratio Portfolio Allocation\n")
print("Annualised Return:", round(rp,2))
print("Annualised Volatility:", round(sdp,2))
print("\n")
print(max_sharpe_allocation)
print("-")
print("Minimum Volatility Portfolio Allocation\n")
print("Annualised Return:", round(rp_min,2))
print("Annualised Volatility:", round(sdp_min,2))
print("\n")
print(min_vol_allocation)
plt.figure(figsize=(10, 7))
plt.scatter(results[0,:],results[1,:],c=results[2,:],cmap='YlGnBu', marker='o', s=10, alpha=0.3)
plt.colorbar()
plt.scatter(sdp,rp,marker='*',color='r',s=500, label='Maximum Sharpe ratio')
plt.scatter(sdp_min,rp_min,marker='*',color='g',s=500, label='Minimum volatility')
plt.title('Simulated Portfolio Optimization based on Efficient Frontier')
plt.xlabel('annualised volatility')
plt.ylabel('annualised returns')
plt.legend(labelspacing=0.8)
display_simulated_ef_with_random(mean_returns, cov_matrix, num_portfolios, risk_free_rate)
结果:
Maximum Sharpe Ratio Portfolio Allocation
Annualised Return: 0.16
Annualised Volatility: 0.25
AAPL AXP BA CAT CSCO CVX DIS DOW GS HD IBM \
allocation 4.76 1.63 1.03 0.26 1.22 0.05 6.86 0.43 1.02 6.42 0.88
INTC JNJ JPM KO MCD MMM MRK MSFT NKE PFE PG \
allocation 2.56 0.64 4.92 0.27 6.64 4.13 6.99 5.49 4.52 2.35 6.36
RTX TRV UNH V VZ WBA WMT XOM
allocation 5.3 1.79 0.39 6.8 7.06 0.67 5.98 2.6
-
Minimum Volatility Portfolio Allocation
Annualised Return: 0.13
Annualised Volatility: 0.24
AAPL AXP BA CAT CSCO CVX DIS DOW GS HD IBM \
allocation 4.43 0.59 0.59 1.01 1.69 0.56 1.04 0.81 0.64 1.44 1.72
INTC JNJ JPM KO MCD MMM MRK MSFT NKE PFE PG \
allocation 3.43 3.47 2.9 5.43 7.61 4.99 7.78 4.72 2.2 7.13 6.72
RTX TRV UNH V VZ WBA WMT XOM
allocation 0.47 4.56 2.95 0.47 6.84 7.81 4.76 1.23
最后:
您还可以尝试其他操作。请查看下面的链接以获取所有详细信息。
https://github.com/ASH-WICUS/Notebooks/blob/master/Portfolio%20Optimization.ipynb