2016-04-24 44 views
0

总共有100种不同的股票可供选择。每只股票都有一个价格p_i,我想为模拟目的创建随机投资组合。投资组合的总价值需要为1,000,000美元(100美元或100美元),投资组合中不同份额的数量也可以是随机的(例如,投资组合可能长于20只股票)。我正在努力创造一个“好”的算法来做到这一点。随机创建给定大小的投资组合

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

回答

2
  • 从股票的总宇宙选择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 * Wi美元日股票
  • 的买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 
+0

道歉,如果我误解这里的算法 - 但由此产生的投资组合并不是真正的随机。假设T = 3。然后我们在3只股票上投入了等量的现金。这种方法将排除投资于不同股票的不同金额的投资组合。 – mark

+0

'T = 3'并不意味着'X1,X2,...,X_N'是相等的。例如,它们可以是'X1 = 1,X2 = 2,X3 = 0'。在这种情况下,你会投资1/3的财富,'W',1#股票,2/3的财富#2股票,以及0/3的财富#3股票。我使用'X1,X2,X3'的整数值来简化示例,但通常情况下,'X'值可以是浮点数。 – unutbu

+0

你是什么意思“生成N个随机数,X_1,...,X_N,从0到1(含)”?我明白了x_i是二进制的 – mark

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()方法。两者都应该很容易实现,我不会在这里详细介绍它们,因为你的问题是关于算法的。

+0

谢谢 - 这与我炮制的东西类似。我对表演不满意(也许我在这里被不必要地审查)。也许我应该在这个问题上更清楚一点。 – mark

+0

@mark Hm ...我不确定如果您希望这些值是随机的,您可以获得更好的性能。我的意思是你需要一个循环,直到投资组合满了。你可以做的一件事是确保随机生成至少购买一个股票的x - 这将减少循环迭代,但不是最大的O时间复杂度。 – nhouser9

+0

是的,你可能是对的。我正在使用Python,因此正在寻找像矢量化解决方案。但正如你可能从其他解决方案的评论中看到的那样 - 这很棘手(至少对我来说)。真正想出一个随机组合。 – mark