随机创建给定大小的投资组合

randomly create a portfolio of a given size

共有 100 种不同的股票可供选择。每只股票都有一个价格,p_i,我想创建随机投资组合以进行模拟。投资组合的总价值需要为 1,000,000 美元(给予或接受 100 美元),并且投资组合中不同股票的数量也可以是随机的(例如,投资组合可以做多 20 只股票)。我正在努力创建 "a good" 算法来执行此操作。

这不是真正的背包问题,因为没有什么需要优化的。它有点像随机样本,但又不完全是。所以我想知道我可以使用什么算法来解决这个问题。有什么想法吗?

  • 从全部股票中选择 N 只股票
  • 生成 N 个随机浮点数,X_1,...,X_N,介于 0 和 1 之间
  • 令 T = 数字之和 = 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

这看起来相当琐碎 - 我将举一个 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() 方法.两者都应该很容易实现,我不会在这里详细介绍它们,因为你的问题是关于算法的。