TensorFlow - 添加变量(权重)约束

时间:2018-01-16 20:25:16

标签: python optimization tensorflow portfolio stocks

只是一个玩具的例子。假设我们有5只股票,我们希望找到最佳的投资组合结构(线性权重),从而最大化我们的历史PnL。权重用于构建投资于股票的投资组合。

weights = tf.Variable(np.random.random((5, 1)), dtype=tf.double)
returns = tf.placeholder(dtype=tf.double)
portfolio = tf.matmul(returns, weights)
pnl = portfolio[-1]

optimizer = tf.train.AdamOptimizer().minimize(-1*pnl)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    train_data = {returns: returns_data}  
    for i in range(100):
        sess.run(optimizer, feed_dict=train_data)

我希望通过以下限制找到关于历史的最佳决策:

  • 每个库存单个重量(最小值:0.05,最大值:0.5)
  • 权重向量和= 1(投资组合总是投资)

如何为优化器实现权重约束?

1 个答案:

答案 0 :(得分:0)

对于第一个问题,您可以将值剪辑到您的矩阵中:

weights = tf.Variable(np.random.random((5, 1)), dtype=tf.double)
weights = tf.clip_by_value(weights, 0.05, 0.5)

softmax函数可以回答您的第二个问题(https://en.wikipedia.org/wiki/Softmax_function

顺便说一下,optimizer = tf.train.AdamOptimizer().minimize(-1*pnl)不会工作。优化器需要知道变量列表,从中最小化损失。因此它是:optimizer = tf.train.AdamOptimizer().minimize(-1*pnl, weights)