Smart Investment
In the smart investment challenge, taken from the DMCommunity, we should pick out a set of stocks to buy to maximize their predicted gain within one year. The full problem is as follows:
Smart Investment
A client of an investment firm has $10000 available for investment. He has instructed that his money be invested in particular stocks, so that no more than $5000 is invested in any one stock but at least $1000 be invested in each stock. He has further instructed the firm to use its current data and invest in the manner that maximizes his overall gain during a one-year period. The stocks, the current price per share and the firm’s predicted stock price a year from now are summarized below:
Stock Current Price Projected Price 1 year ABC 25 35 XYZ 50 60 TTT 100 125 LMN 25 40
As always, we start by creating our glossary. In this case, we will firstly want a way to talk about the four kinds of stocks: for this, we introduce a type. Recall that a type represents a domain of values, which we can use to express more complex variables.
Type | ||
---|---|---|
Name | Type | Values |
Stock | String | ABC, XYZ, TTT, LMN |
Looking closer at the problem text, we can see that we need to represent five pieces of information for each stock:
Their current price
Their projected price
Their predicted gain
How many we buy
How much they are worth in total
All five of these can be excellently represented using functions. A function represents a mapping from one or more types on another type, which in this case is useful to map each Stock element on a different type as follows.
Function | |
---|---|
Name | Type |
current price of Stock | Int |
projected price of Stock | Int |
Stock gain | Int |
nb Stock bought | Int |
dollars of Stock bought | Int |
Nearly done! All that’s left to express are a variable to represent how much money we start with, and a variable to represent the total worth after a year. For this, we will rely on constants: these are functions, but without an input type. As such, they represent exactly one value.
Constant | |
---|---|
Name | Type |
total invested | Int |
projected total | Int |
That’s it! Now, we can start modelling the problem logic. Luckily, these tables are fairly simple. We start with two decision tables, to define the total value of the stock we bought and to define the predicted stock gain after one year. As a reminder, the column “Stock = -” should be read as “For every stock”.
Define total value | ||
---|---|---|
U | Stock | dollars of Stock bought |
1 | - | nb Stock bought * current price of Stock |
Define stock gain | ||
---|---|---|
U | Stock | Stock gain |
1 | - | projected price of Stock - current price of Stock |
Next, we want to express that the total value of each stock should be between 1000 and 5000 dollars. This is easy to do using a constraint table (denoted by hit policy E*):
Min and max stock value | ||
---|---|---|
E* | Stock | dollars of Stock bought |
1 | - | [1000, 5000] |
Here, the constraint table allows us to specify that the value should be in a specific range, without having to specify a concrete value. In contrast, decision tables always need to define a single value.
For the last part of logic, we still need to express how to define how to calculate the total invested and the projected total. For this, we use decision tables using the sum hit policy C+.
Count invested | ||
---|---|---|
C+ | Stock | total invested |
1 | - | dollars of Stock bought |
Projected gain | ||
---|---|---|
C+ | Stock | projected total |
1 | - | nb Stock bought * Stock gain |
Basically, these first table sums the value of each stock, while the second table sums the number of each stock multiplied by its predicted gain.
Now we’re nearly done: all that’s left is representing the input data (our budget and the stock info), and what we want the cDMN solver to calculate. For the former, we use cDMN data tables (denoted by D hit policy) as follows.
Stock Data | |||
---|---|---|---|
D | Stock | current price of Stock | projected price of Stock |
1 | ABC | 25 | 35 |
2 | XYZ | 50 | 60 |
3 | TTT | 100 | 125 |
4 | LMN | 25 | 40 |
Budget | |
---|---|
D | total invested |
1 | 1000 |
For the latter, we add a goal table to indicate to the cDMN solver that we want to find the maximum value for the projected total.
Goal |
---|
Maximize projected total |
Done! We can now run our model using the cDMN solver, which will tell us that 120 BAC, 20 XYZ, 10 TTT and 200 LMN will lead to an optimal projected total of 4650. :-) Not bad for one year!
Model 1
==========
current_price_of_Stock := {ABC -> 25, XYZ -> 50, TTT -> 100, LMN -> 25}.
projected_price_of_Stock := {ABC -> 35, XYZ -> 60, TTT -> 125, LMN -> 40}.
nb_Stock_bought := {ABC -> 120, XYZ -> 20, TTT -> 10, LMN -> 200}.
total_invested := 10000.
projected_total := 4650.
dollars_of_Stock_bought := {ABC -> 3000, XYZ -> 1000, TTT -> 1000, LMN -> 5000}.
Stock_gain := {ABC -> 10, XYZ -> 10, TTT -> 25, LMN -> 15}.
Elapsed Time:
0.574s