共有100种不同的股票可供选择。每个股票都有一个价格,p_i,我想为模拟目的创建随机投资组合。投资组合的总价值需要为1,000,000美元(给予或采取100美元),投资组合中不同股票的数量也可以是随机的(例如投资组合可能在20只股票中很长)。我努力创造一个好的"算法做到这一点。
这不是一个背包问题,因为没有什么需要优化。它有点像随机样本,但并不完全。所以我想知道我可以用什么算法来解决这个问题。有什么想法吗?
答案 0 :(得分:2)
N
个数量N
个随机花车,X_1
,...,X_N
,介于0和1之间X_1 + ... + X_N
。如果T
等于0,请重复步骤1. X_1 = X_1 / T
,... X_N = X_N / T
。注意总和X_1 + ... + X_N
现在等于1 。W
=总投资组合的价值(例如W = 1000000
)X_i * W
股票i
美元
i
股票的购买股数为S_i = X_i * W / p_i
在Python中,
import numpy as np
import pandas as pd
pd.options.display.float_format = '{:.2f}'.format
N = 100
W = 10**6
portfolio_size = np.random.randint(1, N+1)
df = pd.DataFrame({'price': np.random.uniform(1, 100, size=(N,))})
df = df.iloc[np.random.choice(N, portfolio_size, replace=False)]
while True:
df['value'] = np.random.random(portfolio_size)
T = df['value'].sum()
if T != 0: break
df['value'] *= W/T
df['shares'] = df['value']/df['price']
df.index.name='stock num'
print(df)
print('Total value of portfolio: {}'.format(df['value'].sum()))
产生类似
的东西 price value shares
stock num
0 34.52 65296.14 1891.72
24 6.82 13008.12 1906.35
83 15.56 100550.05 6463.14
12 60.35 30366.58 503.17
77 76.75 100814.58 1313.49
36 96.50 85649.01 887.53
51 26.28 96860.06 3685.21
9 43.22 31757.96 734.87
56 67.33 19889.57 295.40
66 79.99 30343.49 379.34
21 1.45 1718.19 1187.56
30 34.48 33604.31 974.65
52 80.15 64579.28 805.71
55 41.02 10226.60 249.29
40 8.49 25755.19 3032.82
20 89.46 102164.38 1142.06
5 45.94 42620.16 927.71
73 96.17 6021.88 62.62
58 60.00 24133.96 402.21
45 40.59 114640.49 2824.31
Total value of portfolio: 1000000.0
答案 1 :(得分:1)
这看起来相当简单 - 我将给出一个java示例,但当然您可以使用任何语言:
int MAX_PORTFOLIO = 1000000; //the cap on your portfolio value
Stock[] stocks = new Stock[100]; //fill this with your stocks
Portfolio p = new Portfolio(); //make a new portfolio object
while(p.getValue() < MAX_PORTFOLIO ) {
//randomly pick a stock to buy
int stockIndex = rand.nextInt(stocks.length());
//find out the max # of this stock that can be bought without exceeding max portfolio value
int remainingSpaceInPortfolo = MAX_PORTFOLIO - p.getValue();
int stocksToFillRemaining = Math.floorDiv(remainingSpaceInPortfolio, stocks[stockIndex].getPrice());
//randomly choose a number of stock to buy
int numStockToBuy = rand.nextInt(stocksToFillRemaining) + 1;
p.buy(stocks[stockIndex], numStockToBuy);
}
请注意,这假设您有一个对象Portfolio
,其中包含getValue()
和buy(Stock toBuy, int numToBuy)
方法,而某个对象Stock
具有getPrice()
方法。两者都应该很容易实现,我不会在这里详述它们,因为你的问题是关于算法。