TensorFlow - добавить ограничение переменных (весов)

Просто игрушечный пример. Предположим, у нас есть 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)
  • вектор весов sum = 1 (портфель всегда инвестируется)

Как я могу реализовать весовые ограничения для оптимизатора?

1 ответ

Для первого вопроса вы можете закрепить значения в матрице:

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)

Другие вопросы по тегам