Processing a Portfolio of Stocks
This project provides an easy to use functionality to implement and evaluate automatic stock trading strategies. It is implemented in java and therefore can be used in any environment which builds on the JVM.
It provides the following functionality:
– Simple access to stock data
– Declarative formulation of trading strategies
– Evaluation of trading strategies
– Optimization of trading strategies
– Support of portfolio of multiple stocks / trading strategies
In this document we demonstrate ‘Support of portfolio of multiple trading strategies’
using Scala. We are using JupyterLab (http://jupyter.org) with the BeakerX (http://beakerx.com/) Scala Kernel.
We can minimize the risk by investing in multiple stocks.
Setup
First you need to install the java libraries:
%classpath config resolver maven-public http://pschatzmann.ch:8081/repository/maven-public/
%classpath add mvn ch.pschatzmann:investor:0.9-SNAPSHOT
%classpath add mvn ch.pschatzmann:jupyter-jdk-extensions:0.0.1-SNAPSHOT
Imports
// our stock evaluation framwork
import ch.pschatzmann.dates._;
import ch.pschatzmann.stocks._;
import ch.pschatzmann.stocks.data.universe._;
import ch.pschatzmann.stocks.input._;
import ch.pschatzmann.stocks.accounting._;
import ch.pschatzmann.stocks.accounting.kpi._;
import ch.pschatzmann.stocks.execution._;
import ch.pschatzmann.stocks.execution.fees._;
import ch.pschatzmann.stocks.execution.price._;
import ch.pschatzmann.stocks.parameters._;
import ch.pschatzmann.stocks.strategy._;
import ch.pschatzmann.stocks.strategy.optimization._;
import ch.pschatzmann.stocks.strategy.allocation._;
import ch.pschatzmann.stocks.strategy.selection._;
import ch.pschatzmann.stocks.integration._;
import ch.pschatzmann.stocks.integration.ChartData.FieldName._;
import ch.pschatzmann.stocks.strategy.OptimizedStrategy.Schedule._;
// java
import java.util.stream.Collectors;
import java.util._;
import java.lang._;
import java.util.function.Consumer;
/// jupyter custom displayer
import ch.pschatzmann.display.Displayers
import ch.pschatzmann.dates._
import ch.pschatzmann.stocks._
import ch.pschatzmann.stocks.data.universe._
import ch.pschatzmann.stocks.input._
import ch.pschatzmann.stocks.accounting._
import ch.pschatzmann.stocks.accounting.kpi._
import ch.pschatzmann.stocks.execution._
import ch.pschatzmann.stocks.execution.fees._
import ch.pschatzmann.stocks.execution.price._
import ch.pschatzmann.stocks.parameters._
import ch.pschatzmann.stocks.strategy._
import ch.pschatzmann.stocks.strategy.optimization._
import ch.pschatzmann.stocks.strategy.allocation._
import ch.pschatzmann.stocks.strategy.selection._
import ch.pschatzmann.stocks.integration._
import ch.pschatzmann.stocks.integration.ChartData.FieldName._
import ch.pschatzmann.stocks.strategy.OptimizedStrategy.Schedule._
import java.util.stream...
Logging and Caching
We deactivate logging and caching
Displayers.setup()
Context.setCachingActive(false);
Context.isCachingActive();
false
Basic API
We first start with a simple example where we have only one Trading Strategy. So this means that all
Cash is invested in one single stock.
Here is the example with Apple
var account = new Account("Simulation","USD", 100000.00, Context.date("2016-01-01"), new PerTradeFees(10.0));
var trader = new PaperTrader(account);
var apple = new StockData(new StockID("AAPL", "NASDAQ"), new MarketArchiveHttpReader());
var executor = new StrategyExecutor(trader);
executor.addStrategy(new RSI2Strategy(apple));
executor.run(account.getDateRange());
println(account.getKPIValues())
Displayers.display(account.getTransactions.collect(Collectors.toList()));
[Absolute Return 45789.485122680664, Absolute Return Avarage per day 88.7393122532571, Absolute Return StdDev 1108.9644165334048, Return % 45.78948512268066, Return % per year 22.31905270970121, Return % StdDev 0.009838573963311588, Sharp Ratio 1.2573057139036334, Max Draw Down % 17.47134871673584, Max Draw Down Absolute 17471.34871673584, Max Draw Down - Number of days 272, Max Draw Down - High 100000.0, Max Draw Down - Low 82528.65128326416, Max Draw Down - Period 20160101-20160909, Number of Trades 3, Number of Buys 2, Number of Sells 1, Number of Cash Transfers 1, Number of Traded Stocks 1, Total Fees 30.0, Cash 28.512130737304688, Total Value (at actual rates) including cash 145789.48512268066, Total Value (at purchased rates) 86568.46670532227, Realized Gains -13401.533294677734, Unrealized Gains 59221.0184173584]
active |
stockID |
date |
quantity |
requestedPrice |
filledPrice |
fees |
comment |
id |
buyOrSell |
requestedPriceType |
impactOnCash |
true |
Key |
Value |
ticker |
Cash |
exchange |
Account |
|
2016-01-01 |
0 |
0 |
0 |
0 |
|
953513bf-0b3d-4b59-875d-bd14e784c309 |
NA |
CashTransfer |
100000 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2016-04-18 |
961 |
0 |
104.0382 |
10 |
|
d4af65f1-c47b-4e91-8bee-0f36477bd4db |
Buy |
Market |
-99990.6959 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2016-05-11 |
-961 |
0 |
90.0928 |
10 |
|
74e2828c-efaf-4fb7-861d-ac23f0414665 |
Sell |
Market |
86569.1626 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2016-08-12 |
817 |
0 |
105.9241 |
10 |
|
b984f005-4cfa-4a5c-ad40-3a4c443ee469 |
Buy |
Market |
-86549.9546 |
… and we do the same with Intel:
var account = new Account("Simulation","USD", 100000.00, Context.date("2016-01-01"), new PerTradeFees(10.0));
var trader = new PaperTrader(account);
var allocationStrategy = new SimpleAllocationStrategy(trader);
var intel = new StockData(new StockID("INTC", "NASDAQ"), new MarketArchiveHttpReader());
var executor = new StrategyExecutor(trader, allocationStrategy);
executor.addStrategy(new RSI2Strategy(intel));
executor.run(account.getDateRange());
println(account.getKPIValues())
Displayers.display(account.getTransactions.collect(Collectors.toList()));
[Absolute Return 32772.75686645508, Absolute Return Avarage per day 63.51309470243232, Absolute Return StdDev 1221.9343975523607, Return % 32.772756866455076, Return % per year 15.97434183819474, Return % StdDev 0.010577932826080098, Sharp Ratio 0.9085662460897985, Max Draw Down % 11.629011799586381, Max Draw Down Absolute 13625.774375915527, Max Draw Down - Number of days 174, Max Draw Down - High 117170.52670288086, Max Draw Down - Low 103544.75232696533, Max Draw Down - Period 20170127-20170822, Number of Trades 7, Number of Buys 4, Number of Sells 3, Number of Cash Transfers 1, Number of Traded Stocks 1, Total Fees 70.0, Cash 28.512775421142578, Total Value (at actual rates) including cash 132772.75686645508, Total Value (at purchased rates) 104241.93165588379, Realized Gains 4311.931655883789, Unrealized Gains 28530.82521057129]
active |
stockID |
date |
quantity |
requestedPrice |
filledPrice |
fees |
comment |
id |
buyOrSell |
requestedPriceType |
impactOnCash |
true |
Key |
Value |
ticker |
Cash |
exchange |
Account |
|
2016-01-01 |
0 |
0 |
0 |
0 |
|
6d69c5cb-a4b2-4a7d-9c19-0ea48904cb3f |
NA |
CashTransfer |
100000 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-04-05 |
3300 |
0 |
30.2955 |
10 |
|
ba0b45b1-62f0-4bdd-9b35-bd3edc33f7fa |
Buy |
Market |
-99985.0423 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-05-16 |
-3300 |
0 |
29.1107 |
10 |
|
c6580614-35a5-4fba-b27e-14da45962a9f |
Sell |
Market |
96055.3624 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-06-15 |
3172 |
0 |
30.2794 |
10 |
|
575f3358-d911-4612-b34f-451a48abb32b |
Buy |
Market |
-96056.1293 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-07-12 |
-3172 |
0 |
33.7945 |
10 |
|
89a503bd-6a78-49df-ac58-06ab4b308a55 |
Sell |
Market |
107186.2701 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-08-11 |
3006 |
0 |
35.6587 |
10 |
|
a356727e-b294-4358-9fee-8bf4884cf01a |
Buy |
Market |
-107199.992 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-08-30 |
-3006 |
0 |
34.6845 |
10 |
|
d839ff54-c50d-4197-97ce-8f2dbb5abcf0 |
Sell |
Market |
104251.4629 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-09-08 |
2979 |
0 |
34.9827 |
10 |
|
c7550724-6537-4705-8365-6cd0c2f52542 |
Buy |
Market |
-104223.4189 |
Allocation Strategies
Allocation strategies are used to manage the allocation across multiple stocks. If nothing is indicated the system is using the DistributedAllocationStrategy which is distributing the allocation evenly and reallocates the amounts whenever we get a new trade signal.
The system comes with an implementation of the following Strategies
– SimpleAllocationStrategy
– SimpleDistributedAllocationStrategy
– DistributedAllocationStrategy
– Even distributed
– Distributed by Sharpe Ratio of Stock
SimpleAllocationStrategy
With the SimpleAllocationStrategy we execute the trades as they come. If there is not enough cash when we get a buy signal then that is just bad luck…
var account = new Account("Simulation","USD", 100000.00, Context.date("2016-01-01"), new PerTradeFees(10.0));
var trader = new PaperTrader(account);
var apple = new StockData(new StockID("AAPL", "NASDAQ"), new MarketArchiveHttpReader());
var intel = new StockData(new StockID("INTC", "NASDAQ"), new MarketArchiveHttpReader());
var allocationStrategy = new SimpleAllocationStrategy(trader);
var executor = new StrategyExecutor(trader, allocationStrategy);
executor.addStrategy(new RSI2Strategy(apple));
executor.addStrategy(new RSI2Strategy(intel));
executor.run(account.getDateRange());
println(account.getKPIValues())
Displayers.display(account.getTransactions.collect(Collectors.toList()));
[Absolute Return 28849.856658935547, Absolute Return Avarage per day 55.91057492041773, Absolute Return StdDev 1126.7767107172494, Return % 28.849856658935547, Return % per year 14.06221253008077, Return % StdDev 0.010167557782280595, Sharp Ratio 0.8480999130137628, Max Draw Down % 11.115510448430202, Max Draw Down Absolute 12967.079467773438, Max Draw Down - Number of days 75, Max Draw Down - High 116657.52578735352, Max Draw Down - Low 103690.44631958008, Max Draw Down - Period 20161007-20161104, Number of Trades 7, Number of Buys 4, Number of Sells 3, Number of Cash Transfers 1, Number of Traded Stocks 2, Total Fees 70.0, Cash 37.834014892578125, Total Value (at actual rates) including cash 128849.85665893555, Total Value (at purchased rates) 107169.48651123047, Realized Gains 7239.486511230469, Unrealized Gains 21680.370147705078]
active |
stockID |
date |
quantity |
requestedPrice |
filledPrice |
fees |
comment |
id |
buyOrSell |
requestedPriceType |
impactOnCash |
true |
Key |
Value |
ticker |
Cash |
exchange |
Account |
|
2016-01-01 |
0 |
0 |
0 |
0 |
|
e541f8cb-abf5-4ede-bd02-bb30217ac89d |
NA |
CashTransfer |
100000 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-04-05 |
3300 |
0 |
30.2955 |
10 |
|
37be1d90-d67c-4b43-b1ca-ad211c9a8598 |
Buy |
Market |
-99985.0423 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-05-16 |
-3300 |
0 |
29.1107 |
10 |
|
f27ec25c-b8c6-4944-afc0-45d3583fefeb |
Sell |
Market |
96055.3624 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-06-15 |
3172 |
0 |
30.2794 |
10 |
|
9bcc00e9-3903-461c-9e9c-7e4f951f9873 |
Buy |
Market |
-96056.1293 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-07-12 |
-3172 |
0 |
33.7945 |
10 |
|
60af65f0-3cd9-47a5-9b80-ee02638aec58 |
Sell |
Market |
107186.2701 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2017-07-28 |
722 |
0 |
148.3818 |
10 |
|
809a982f-515f-4082-901e-e70b43798150 |
Buy |
Market |
-107141.6525 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-08-11 |
1 |
0 |
35.6587 |
10 |
|
eaacec8b-25ba-40ea-a729-dd8b529e4403 |
Buy |
Market |
-45.6587 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-08-30 |
-1 |
0 |
34.6845 |
10 |
|
99ea4024-c765-43a5-bf1e-83063a4f05f3 |
Sell |
Market |
24.6845 |
As we can see, the result is pretty bad: We get an Absolute Return which is even below the one of the worst investment (Intel).
SimpleDistributedAllocationStrategy
Each stock is given an equal potential cash amount. If there is no buy signal, then the amount is hold as cash.
This strategy has the disadvantage of keeping too much in cash and we are therfore loosing on oportunities. Therfore the result is – as expected -not very good:
var account = new Account("Simulation","USD", 100000.00, Context.date("2016-01-01"), new PerTradeFees(10.0));
var trader = new PaperTrader(account);
var allocationStrategy = new SimpleDistributedAllocationStrategy(trader);
var apple = new StockData(new StockID("AAPL", "NASDAQ"), new MarketArchiveHttpReader());
var intel = new StockData(new StockID("INTC", "NASDAQ"), new MarketArchiveHttpReader());
var executor = new StrategyExecutor(trader, allocationStrategy);
executor.addStrategy(new RSI2Strategy(apple));
executor.addStrategy(new RSI2Strategy(intel));
executor.run(account.getDateRange());
println(account.getKPIValues())
Displayers.display(account.getTransactions.collect(Collectors.toList()));
[Absolute Return 21628.06470298767, Absolute Return Avarage per day 41.9148540755575, Absolute Return StdDev 501.5600160100478, Return % 21.628064702987672, Return % per year 10.542112775924359, Return % StdDev 0.0046252961222568965, Sharp Ratio 1.3392276821474227, Max Draw Down % 5.450575373063731, Max Draw Down Absolute 5459.840757369995, Max Draw Down - Number of days 107, Max Draw Down - High 100169.98910522461, Max Draw Down - Low 94710.14834785461, Max Draw Down - Period 20160413-20160627, Number of Trades 10, Number of Buys 6, Number of Sells 4, Number of Cash Transfers 1, Number of Traded Stocks 2, Total Fees 100.0, Cash 45613.99278450012, Total Value (at actual rates) including cash 121628.06470298767, Total Value (at purchased rates) 97347.38072013855, Realized Gains -2552.61927986145, Unrealized Gains 24280.68398284912]
active |
stockID |
date |
quantity |
requestedPrice |
filledPrice |
fees |
comment |
id |
buyOrSell |
requestedPriceType |
impactOnCash |
true |
Key |
Value |
ticker |
Cash |
exchange |
Account |
|
2016-01-01 |
0 |
0 |
0 |
0 |
|
ed3f8b99-f2a0-4e77-a756-ef9652116bf3 |
NA |
CashTransfer |
100000 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-04-05 |
824 |
0 |
30.2955 |
10 |
|
229bf332-ea58-4533-b2f9-7555c2b10c8b |
Buy |
Market |
-24973.4651 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2016-04-15 |
234 |
0 |
106.3323 |
10 |
|
c5731f39-90c5-4148-9d45-640d1a3c4a43 |
Buy |
Market |
-24891.7578 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2016-05-10 |
-234 |
0 |
90.979 |
10 |
|
6007723f-7b10-4636-b4cb-af123f516f8d |
Sell |
Market |
21279.0851 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-05-16 |
-824 |
0 |
29.1107 |
10 |
|
e3e0c8cc-9699-4e6b-b8b6-33288e93d0a6 |
Sell |
Market |
23977.2299 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-06-15 |
787 |
0 |
30.2794 |
10 |
|
9b3d3354-6c0e-4302-a7e1-b241854c8f83 |
Buy |
Market |
-23839.8562 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2016-08-11 |
231 |
0 |
105.6793 |
10 |
|
f7fab246-c1d1-4189-ba45-19cf3367f446 |
Buy |
Market |
-24421.9109 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-07-12 |
-787 |
0 |
33.7945 |
10 |
|
bf73d97d-e440-4e47-a78b-210f443ba2b3 |
Sell |
Market |
26586.3003 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-08-11 |
770 |
0 |
35.6587 |
10 |
|
ecc99edd-71af-4f04-badb-646c0279bd73 |
Buy |
Market |
-27467.1836 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-08-30 |
-770 |
0 |
34.6845 |
10 |
|
d7fbf015-8f4c-4ff2-8669-47c32ae8373a |
Sell |
Market |
26697.0281 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-09-08 |
781 |
0 |
34.9827 |
10 |
|
c61b35bc-d1a5-48ce-b0fe-48ec2b7c4e1f |
Buy |
Market |
-27331.4771 |
DistributedAllocationStrategy
At each trade signal we reallocate the stock amouts so that we are always fully invested in stocks that have
a buy signal.
The distribution logic can be defined by defining a IDistributor. Per default we use the
EvenDistributor where all stocks are weighted the same.
The result is pretty good: it is just slightly below the return of the single Apple investment!
var account = new Account("Simulation","USD", 100000.00, Context.date("2016-01-01"), new PerTradeFees(10.0));
var trader = new PaperTrader(account);
var apple = new StockData(new StockID("AAPL", "NASDAQ"), new MarketArchiveHttpReader());
var intel = new StockData(new StockID("INTC", "NASDAQ"), new MarketArchiveHttpReader());
var allocationStrategy = new DistributedAllocationStrategy(trader);
var executor = new StrategyExecutor(trader, allocationStrategy);
executor.addStrategy(new RSI2Strategy(apple));
executor.addStrategy(new RSI2Strategy(intel));
executor.run(account.getDateRange());
println(account.getKPIValues())
Displayers.display(account.getTransactions.collect(Collectors.toList()));
[Absolute Return 60187.0680809021, Absolute Return Avarage per day 116.6416048079498, Absolute Return StdDev 1126.6268082141642, Return % 60.187068080902094, Return % per year 29.336830089724035, Return % StdDev 0.008859144244896934, Sharp Ratio 1.7072268942677449, Max Draw Down % 8.72040749597196, Max Draw Down Absolute 10356.939044952393, Max Draw Down - Number of days 57, Max Draw Down - High 118766.68664550781, Max Draw Down - Low 108409.74760055542, Max Draw Down - Period 20161018-20161114, Number of Trades 19, Number of Buys 7, Number of Sells 9, Number of Cash Transfers 1, Number of Traded Stocks 2, Total Fees 160.0, Cash 11.073921203613281, Total Value (at actual rates) including cash 160187.0680809021, Total Value (at purchased rates) 112037.7908620633, Realized Gains 12197.790862063299, Unrealized Gains 48149.2772188388]
active |
stockID |
date |
quantity |
requestedPrice |
filledPrice |
fees |
comment |
id |
buyOrSell |
requestedPriceType |
impactOnCash |
true |
Key |
Value |
ticker |
Cash |
exchange |
Account |
|
2016-01-01 |
0 |
0 |
0 |
0 |
|
215a09ea-2f02-47cf-841f-e705367d4f80 |
NA |
CashTransfer |
100000 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-04-06 |
3281 |
0 |
30.4664 |
10 |
|
8c859fcf-6d9d-4514-9df9-18122a843107 |
Buy |
Market |
-99970.3027 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2016-05-17 |
541 |
0 |
91.0472 |
10 |
rebalance of stocks |
d7fb7daa-ff22-441f-baa9-d0d75d9d65f3 |
Buy |
Market |
-49266.5203 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-05-17 |
-1642 |
0 |
28.718 |
10 |
|
e033dd3d-00e8-4d86-ba41-a168d5834554 |
Sell |
Market |
47144.9191 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2016-05-24 |
-541 |
0 |
95.3419 |
10 |
|
1cc11249-8613-41cf-b2a6-08969e3c2e36 |
Sell |
Market |
51569.9947 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-06-16 |
3252 |
0 |
30.356 |
10 |
|
6ee6bfa9-c0eb-424e-b115-b4d2cb4b6e70 |
Buy |
Market |
-98727.6963 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2016-08-26 |
517 |
0 |
104.7099 |
10 |
|
8d835c4f-2bda-471f-a3a5-182b2b557402 |
Buy |
Market |
-54145.0261 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-08-26 |
-16 |
0 |
34.0317 |
10 |
rebalance of stocks |
d1560afb-05eb-40f7-a9c8-b8d9d5f4bcf6 |
Sell |
Market |
534.5078 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2017-07-13 |
4 |
0 |
146.6647 |
10 |
rebalance of stocks |
c8ec6c67-d5f4-4625-b288-bf6fa05a49e1 |
Buy |
Market |
-596.659 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-07-13 |
-1611 |
0 |
33.7847 |
10 |
|
5e37a9c9-2f8b-4deb-af70-76fc2e171387 |
Sell |
Market |
54417.1001 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2017-08-14 |
-88 |
0 |
159.2774 |
10 |
rebalance of stocks |
8572b6c1-ad58-4a48-ba71-330834eaa046 |
Sell |
Market |
14006.413 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-08-14 |
1894 |
0 |
36.1259 |
10 |
|
343218c7-ecc4-4358-92eb-a73b282ce012 |
Buy |
Market |
-68432.4768 |
false |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2018-01-19 |
0 |
0 |
0 |
0 |
rebalance of stocks |
d3d9e16e-860a-4887-af7c-8d98eaa00595 |
NA |
Market |
0 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-08-31 |
-1894 |
0 |
34.8634 |
10 |
|
c2ce6f44-6934-4d8d-b64d-3e4fe94aab97 |
Sell |
Market |
66021.2642 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2017-09-11 |
-10 |
0 |
160.9215 |
10 |
rebalance of stocks |
4356ddd1-abf0-4e0f-90a8-904597b90309 |
Sell |
Market |
1599.2151 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-09-11 |
1901 |
0 |
35.5593 |
10 |
|
16927edc-1232-462f-b793-55e4cf6ca673 |
Buy |
Market |
-67608.1703 |
false |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2018-01-19 |
0 |
0 |
0 |
0 |
|
be40ec30-9536-4590-8950-768fe1c68397 |
NA |
Market |
0 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-08-12 |
-1625 |
0 |
33.3658 |
10 |
rebalance of stocks |
ba6dbd3c-bca4-4e1c-8c71-652d0f8ede74 |
Sell |
Market |
54209.3799 |
false |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2018-01-19 |
0 |
0 |
0 |
0 |
|
042bbcbc-8a2d-4c70-b960-72f1b6c1032b |
NA |
Market |
0 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-04-18 |
-1639 |
0 |
30.058 |
10 |
rebalance of stocks |
bd193358-175f-46c0-bdca-63867e35d97a |
Sell |
Market |
49255.1317 |
// create chart for total values
var chart = new TimeSeriesChart();
chart.add(account.getTotalValueHistory(), "Total Value");
chart.add(account.getCashHistoryForAllDates(), "Cash");
chart.add(account.getActualValueHistory(), "ActualValue");
chart.addLabels(account.getTransactions())
chart
import scala.collection.JavaConversions._
var chart1 = new TimeSeriesChart()
chart1.add(account.getCashHistoryForAllDates(), "Cash");
chart1.add(account.getTotalValueHistory(), "Total Value");
chart1.add(account.getActualValueHistory(), "ActualValue");
for (id <- account.getStockIDs()) {
var data = account.getActualValueHistory(id);
chart1.add(data,id.toString())
}
//chart1.addLabels(account.getTransactions())
chart1
The distributed allocation strategy can be configured by defining a Distributor which is
implementing the distributin logic. The default setting is using the EvenDistributor.
Here is the list of the currently implemented alternatives:
– EvenDistributor
– SharpeRatioDistributor
– SharpeRatioOfStockDistributor
SharpeRatioDistributor
import ch.pschatzmann.stocks.strategy.allocation._;
var periods = Context.getDateRanges("2015-01-01","2016-01-01");
var account = new Account("Simulation","USD", 100000.00, periods.get(0).getStart(), new PerTradeFees(10.0));
var trader = new PaperTrader(account);
var apple = new StockData(new StockID("AAPL", "NASDAQ"), new MarketArchiveHttpReader());
var intel = new StockData(new StockID("INTC", "NASDAQ"), new MarketArchiveHttpReader());
var appleStrategy = new RSI2Strategy(apple);
var intelStrategy = new RSI2Strategy(intel);
var distributor = new SharpeRatioDistributor(account);
var allocationStrategy = new DistributedAllocationStrategy(trader, distributor);
var executor = new StrategyExecutor(trader, allocationStrategy);
executor.addStrategy(appleStrategy);
executor.addStrategy(intelStrategy);
executor.run(periods.get(1));
println(account.getKPIValues())
Displayers.display(account.getTransactions.collect(Collectors.toList()))
[Absolute Return 60187.0680809021, Absolute Return Avarage per day 78.36857823034127, Absolute Return StdDev 925.0958080939445, Return % 60.187068080902094, Return % per year 19.72320046344256, Return % StdDev 0.007275427975944391, Sharp Ratio 1.3967315795266206, Max Draw Down % 8.72040749597196, Max Draw Down Absolute 10356.939044952393, Max Draw Down - Number of days 57, Max Draw Down - High 118766.68664550781, Max Draw Down - Low 108409.74760055542, Max Draw Down - Period 20161018-20161114, Number of Trades 19, Number of Buys 7, Number of Sells 9, Number of Cash Transfers 1, Number of Traded Stocks 2, Total Fees 160.0, Cash 11.073921203613281, Total Value (at actual rates) including cash 160187.0680809021, Total Value (at purchased rates) 112037.7908620633, Realized Gains 12197.790862063299, Unrealized Gains 48149.2772188388]
active |
stockID |
date |
quantity |
requestedPrice |
filledPrice |
fees |
comment |
id |
buyOrSell |
requestedPriceType |
impactOnCash |
true |
Key |
Value |
ticker |
Cash |
exchange |
Account |
|
2015-01-01 |
0 |
0 |
0 |
0 |
|
ac2ed050-f031-41f0-9d4f-56f944e06ac2 |
NA |
CashTransfer |
100000 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-04-06 |
3281 |
0 |
30.4664 |
10 |
|
9c2c0c3c-8d11-4def-8956-f56e1306e867 |
Buy |
Market |
-99970.3027 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2016-05-17 |
541 |
0 |
91.0472 |
10 |
rebalance of stocks |
47c07691-3c01-4e42-a9e3-afc3ec15256d |
Buy |
Market |
-49266.5203 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-05-17 |
-1642 |
0 |
28.718 |
10 |
|
6283a260-e7dc-40ad-9459-da82f72acfe4 |
Sell |
Market |
47144.9191 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2016-05-24 |
-541 |
0 |
95.3419 |
10 |
|
d6d2d883-7dfe-4f54-8c4f-ae80c96e5121 |
Sell |
Market |
51569.9947 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-06-16 |
3252 |
0 |
30.356 |
10 |
|
3027273f-b458-4f4a-994c-f52743772c95 |
Buy |
Market |
-98727.6963 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2016-08-26 |
517 |
0 |
104.7099 |
10 |
|
44a0e16a-df90-4e8b-bc49-51137bef8440 |
Buy |
Market |
-54145.0261 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-08-26 |
-16 |
0 |
34.0317 |
10 |
rebalance of stocks |
f3660618-18a9-41a2-89b7-85049594723b |
Sell |
Market |
534.5078 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2017-07-13 |
4 |
0 |
146.6647 |
10 |
rebalance of stocks |
ece54b7c-67d0-41dd-a8e4-806bac64995b |
Buy |
Market |
-596.659 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-07-13 |
-1611 |
0 |
33.7847 |
10 |
|
ab868ef3-d37b-4789-a848-2df736039da3 |
Sell |
Market |
54417.1001 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2017-08-14 |
-88 |
0 |
159.2774 |
10 |
rebalance of stocks |
df3feb09-0faf-40b9-b3bd-d87ace3499a8 |
Sell |
Market |
14006.413 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-08-14 |
1894 |
0 |
36.1259 |
10 |
|
f34e52e5-e671-4f63-871c-5766b6563f49 |
Buy |
Market |
-68432.4768 |
false |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2018-01-19 |
0 |
0 |
0 |
0 |
rebalance of stocks |
a9d030e0-bd10-48b5-908c-02d99443e980 |
NA |
Market |
0 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-08-31 |
-1894 |
0 |
34.8634 |
10 |
|
b91116de-e402-41b9-bcab-b7cce4de72cb |
Sell |
Market |
66021.2642 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2017-09-11 |
-10 |
0 |
160.9215 |
10 |
rebalance of stocks |
c8ce8f41-fe92-40d2-a1ac-ccaed12a6ee4 |
Sell |
Market |
1599.2151 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-09-11 |
1901 |
0 |
35.5593 |
10 |
|
e14a7e8f-a655-475b-b679-0d48e60934be |
Buy |
Market |
-67608.1703 |
false |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2018-01-19 |
0 |
0 |
0 |
0 |
|
e9a81e7c-7e11-4f00-bff4-1a88cb312f88 |
NA |
Market |
0 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-08-12 |
-1625 |
0 |
33.3658 |
10 |
rebalance of stocks |
f6c4e06c-2ac6-42a1-8f8c-11aae30a3c6d |
Sell |
Market |
54209.3799 |
false |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2018-01-19 |
0 |
0 |
0 |
0 |
|
785a31fd-6c5a-4a40-b9e3-b2e41d2cc2b9 |
NA |
Market |
0 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-04-18 |
-1639 |
0 |
30.058 |
10 |
rebalance of stocks |
d51b1fb8-278e-4027-94db-fefedcbce03e |
Sell |
Market |
49255.1317 |
SharpeRatioOfStockDistributor
The sharpe ratio is measuring the risk adusted return. So in the long run it might be of advantate if we prefer stocks with a high sharpe ratio to stocks with a lower one.
The stocks are distributed by the SharpeRatio which is calculated with the stock closing prices
import ch.pschatzmann.stocks.strategy.allocation._;
var periods = Context.getDateRanges("2015-01-01","2016-01-01");
var account = new Account("Simulation","USD", 100000.00, Context.date("2016-01-01"), new PerTradeFees(10.0));
var trader = new PaperTrader(account);
var apple = new StockData(new StockID("AAPL", "NASDAQ"), new MarketArchiveHttpReader());
var intel = new StockData(new StockID("INTC", "NASDAQ"), new MarketArchiveHttpReader());
var appleStrategy = new RSI2Strategy(apple);
var intelStrategy = new RSI2Strategy(intel);
var distributor = new SharpeRatioOfStockDistributor(account, 0.0);
var allocationStrategy = new DistributedAllocationStrategy(trader, distributor);
var executor = new StrategyExecutor(trader, allocationStrategy);
executor.addStrategy(appleStrategy);
executor.addStrategy(intelStrategy);
executor.run(periods.get(1));
println(account.getKPIValues())
Displayers.display(account.getTransactions.collect(Collectors.toList()))
[Absolute Return 60827.445598602295, Absolute Return Avarage per day 117.88264650891918, Absolute Return StdDev 1127.2149815722971, Return % 60.827445598602296, Return % per year 29.64896768055663, Return % StdDev 0.008846034799164536, Sharp Ratio 1.7234413711155498, Max Draw Down % 8.740579066053773, Max Draw Down Absolute 10395.807270050049, Max Draw Down - Number of days 57, Max Draw Down - High 118937.28311920166, Max Draw Down - Low 108541.47584915161, Max Draw Down - Period 20161018-20161114, Number of Trades 19, Number of Buys 7, Number of Sells 9, Number of Cash Transfers 1, Number of Traded Stocks 2, Total Fees 160.0, Cash 24.211456298828125, Total Value (at actual rates) including cash 160827.4455986023, Total Value (at purchased rates) 111766.7706210201, Realized Gains 11926.770621020096, Unrealized Gains 49060.674977582195]
active |
stockID |
date |
quantity |
requestedPrice |
filledPrice |
fees |
comment |
id |
buyOrSell |
requestedPriceType |
impactOnCash |
true |
Key |
Value |
ticker |
Cash |
exchange |
Account |
|
2016-01-01 |
0 |
0 |
0 |
0 |
|
5d7f112a-fe54-435a-be8f-079ba19ad185 |
NA |
CashTransfer |
100000 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-04-06 |
3281 |
0 |
30.4664 |
10 |
|
cf01b092-0b3d-4e58-8139-70a4d3869c9d |
Buy |
Market |
-99970.3027 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2016-05-17 |
557 |
0 |
91.0472 |
10 |
rebalance of stocks |
87e6c862-369f-4ce7-a4e7-7cddfd20b01b |
Buy |
Market |
-50723.2751 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-05-17 |
-1593 |
0 |
28.718 |
10 |
|
f3eb6449-4c40-49da-b96f-bc730e9173b1 |
Sell |
Market |
45737.7382 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2016-05-24 |
-557 |
0 |
95.3419 |
10 |
|
a0168d31-c8d3-4539-8fb7-f72eda34e7ec |
Sell |
Market |
53095.4659 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-06-16 |
3256 |
0 |
30.356 |
10 |
|
030adee1-33c4-4fa2-9a0f-45f87e72bef5 |
Buy |
Market |
-98849.1203 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2016-08-26 |
529 |
0 |
104.7099 |
10 |
|
11f4e86d-5cf2-4fa1-8a2b-78d6b98027dc |
Buy |
Market |
-55401.5451 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-08-26 |
-14 |
0 |
34.0317 |
10 |
rebalance of stocks |
20b1f6df-8e89-45f1-925a-32b7ac3c03de |
Sell |
Market |
466.4443 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2017-07-13 |
3 |
0 |
146.6647 |
10 |
rebalance of stocks |
33f83976-b049-4af2-bba0-e9421a52a644 |
Buy |
Market |
-449.9942 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-07-13 |
-1579 |
0 |
33.7847 |
10 |
|
d2a7eb26-3977-41ff-a92e-b171f1d036be |
Sell |
Market |
53335.9907 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2017-08-14 |
-80 |
0 |
159.2774 |
10 |
rebalance of stocks |
3251e709-34d2-40cb-88d7-755008cc470e |
Sell |
Market |
12732.1936 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-08-14 |
1831 |
0 |
36.1259 |
10 |
|
9d8604ae-35ec-48fb-b26d-c91d19bb6fc5 |
Buy |
Market |
-66156.5443 |
false |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2018-01-19 |
0 |
0 |
0 |
0 |
rebalance of stocks |
f6f2c5c9-1519-40a5-a48b-d14959635b52 |
NA |
Market |
0 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-08-31 |
-1831 |
0 |
34.8634 |
10 |
|
e32cd4a6-60c8-40ee-965c-9d526614bca7 |
Sell |
Market |
63824.8705 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2017-09-11 |
-9 |
0 |
160.9215 |
10 |
rebalance of stocks |
27a5929e-7c00-4555-a560-bd1a4bd14611 |
Sell |
Market |
1438.2936 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-09-11 |
1835 |
0 |
35.5593 |
10 |
|
e84fd28b-fef8-4e51-88f1-b0aac7fc97b7 |
Buy |
Market |
-65261.2585 |
false |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2018-01-19 |
0 |
0 |
0 |
0 |
|
196a5c65-b843-4100-99df-79cecb1275d3 |
NA |
Market |
0 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-08-12 |
-1663 |
0 |
33.3658 |
10 |
rebalance of stocks |
20ce4f46-b7b5-4209-b926-a497fdbdf4bf |
Sell |
Market |
55477.2792 |
false |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2018-01-19 |
0 |
0 |
0 |
0 |
|
cb87017b-4e4d-47cb-887d-82112a5c7319 |
NA |
Market |
0 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-04-18 |
-1688 |
0 |
30.058 |
10 |
rebalance of stocks |
ea220be5-1960-4ad2-8a83-b734cc695176 |
Sell |
Market |
50727.9758 |
Optimizations
Optimized DistributedAllocationStrategy – BinarySearchOptimizer
We also have the possibility to define an optimizer.
We just wrap our trading strategy into a OptimizedStrategy to which we pass the selected optimizer.
var periods = Context.getDateRanges("2015-01-01","2016-01-01");
var account = new Account("Simulation","USD", 100000.00, Context.date("2016-01-01"), new PerTradeFees(10.0));
var trader = new PaperTrader(account);
var apple = new StockData(new StockID("AAPL", "NASDAQ"), new MarketArchiveHttpReader());
var intel = new StockData(new StockID("INTC", "NASDAQ"), new MarketArchiveHttpReader());
var appleStrategy = new RSI2Strategy(apple);
var intelStrategy = new RSI2Strategy(intel);
var allocationStrategy = new DistributedAllocationStrategy(trader);
var executor = new StrategyExecutor(trader, allocationStrategy);
var optimizer = new BinarySearchOptimizer(new SimulatedFitness(account), KPI.AbsoluteReturn);
executor.addStrategy(new OptimizedStrategy(appleStrategy, optimizer, MONTH));
executor.addStrategy(new OptimizedStrategy(intelStrategy, optimizer, MONTH));
executor.run(periods.get(1));
println(account.getKPIValues())
Displayers.display(account.getTransactions.collect(Collectors.toList()))
[Absolute Return 41296.35997772217, Absolute Return Avarage per day 80.0317053831825, Absolute Return StdDev 1107.7395204912796, Return % 41.29635997772217, Return % per year 20.128980105195332, Return % StdDev 0.010370537899183269, Sharp Ratio 1.1089779883625646, Max Draw Down % 17.209354858398438, Max Draw Down Absolute 17209.354858398438, Max Draw Down - Number of days 191, Max Draw Down - High 100000.0, Max Draw Down - Low 82790.64514160156, Max Draw Down - Period 20160101-20160627, Number of Trades 12, Number of Buys 6, Number of Sells 5, Number of Cash Transfers 1, Number of Traded Stocks 2, Total Fees 110.0, Cash 22.136310577392578, Total Value (at actual rates) including cash 141296.35997772217, Total Value (at purchased rates) 99085.8531524589, Realized Gains -804.1468475411002, Unrealized Gains 42210.50682526327]
active |
stockID |
date |
quantity |
requestedPrice |
filledPrice |
fees |
comment |
id |
buyOrSell |
requestedPriceType |
impactOnCash |
true |
Key |
Value |
ticker |
Cash |
exchange |
Account |
|
2016-01-01 |
0 |
0 |
0 |
0 |
|
9dcf1bee-acd4-4204-8b38-925412246b1f |
NA |
CashTransfer |
100000 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-01-06 |
3210 |
0 |
31.142 |
10 |
|
4b1da666-cd71-4cf0-9d4a-7d9d42e68332 |
Buy |
Market |
-99975.8757 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-02-18 |
-3210 |
0 |
27.9402 |
10 |
|
7d724a28-35c4-46c5-9261-827287f386b5 |
Sell |
Market |
89678.063 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-04-27 |
2974 |
0 |
30.153 |
10 |
|
2c3f476f-94e3-4192-8c7d-a94e042a2a4a |
Buy |
Market |
-89685.0557 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-05-17 |
-2974 |
0 |
28.718 |
10 |
|
93847c9d-3e2d-4339-bf0b-7d50286fec80 |
Sell |
Market |
85397.2652 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-06-16 |
2813 |
0 |
30.356 |
10 |
|
ad1a1ef4-3b59-42db-b8c4-e3b49d2c1dc7 |
Buy |
Market |
-85401.4144 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2016-11-01 |
436 |
0 |
109.165 |
10 |
|
73ce356c-f882-4aa8-aae3-c44c3e73ee93 |
Buy |
Market |
-47605.9537 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2017-07-13 |
5 |
0 |
146.6647 |
10 |
rebalance of stocks |
3c20f1fd-d067-44fc-b68d-c309d6e74093 |
Buy |
Market |
-743.3237 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-07-13 |
-1408 |
0 |
33.7847 |
10 |
|
43603153-a985-4942-8e14-f264cee2264d |
Sell |
Market |
47558.8125 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2017-08-21 |
-67 |
0 |
156.6469 |
10 |
rebalance of stocks |
32219e3d-089e-4a82-bbf1-5793514c30c9 |
Sell |
Market |
10485.341 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-08-21 |
1673 |
0 |
34.7143 |
10 |
|
86f1e507-6c04-4559-986f-8bf48ef2ae78 |
Buy |
Market |
-58086.9827 |
false |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2018-01-19 |
0 |
0 |
0 |
0 |
|
e18b74c5-f030-4f34-be16-226c03bb2027 |
NA |
Market |
0 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-08-30 |
-1405 |
0 |
34.4564 |
10 |
rebalance of stocks |
a716e657-fc20-4ae1-849b-bce4d82963ec |
Sell |
Market |
48401.2606 |
var periods = Context.getDateRanges("2015-01-01","2016-01-01");
var account = new Account("Simulation","USD", 100000.00, Context.date("2016-01-01"), new PerTradeFees(10.0));
var trader = new PaperTrader(account);
var apple = new StockData(new StockID("AAPL", "NASDAQ"), new MarketArchiveHttpReader());
var intel = new StockData(new StockID("INTC", "NASDAQ"), new MarketArchiveHttpReader());
var appleStrategy = new RSI2Strategy(apple);
var intelStrategy = new RSI2Strategy(intel);
var allocationStrategy = new DistributedAllocationStrategy(trader);
var executor = new StrategyExecutor(trader, allocationStrategy);
var optimizer = new BinarySearchOptimizer(new SimulatedFitness(account), KPI.AbsoluteReturn);
executor.addStrategy(new OptimizedStrategy(appleStrategy, optimizer, YEAR));
executor.addStrategy(new OptimizedStrategy(intelStrategy, optimizer, YEAR));
executor.run(periods.get(1));
println(account.getKPIValues())
Displayers.display(account.getTransactions.collect(Collectors.toList()))
[Absolute Return 28061.674724578857, Absolute Return Avarage per day 54.38309055150941, Absolute Return StdDev 1057.9731814347635, Return % 28.061674724578857, Return % per year 13.678031006951397, Return % StdDev 0.010276380270101453, Sharp Ratio 0.8228758081097507, Max Draw Down % 15.96958173751831, Max Draw Down Absolute 15969.58173751831, Max Draw Down - Number of days 258, Max Draw Down - High 100000.0, Max Draw Down - Low 84030.41826248169, Max Draw Down - Period 20160101-20160519, Number of Trades 13, Number of Buys 6, Number of Sells 7, Number of Cash Transfers 1, Number of Traded Stocks 2, Total Fees 130.0, Cash 23.981441497802734, Total Value (at actual rates) including cash 128061.67472457886, Total Value (at purchased rates) 93125.62129592896, Realized Gains -6744.378704071045, Unrealized Gains 34936.0534286499]
active |
stockID |
date |
quantity |
requestedPrice |
filledPrice |
fees |
comment |
id |
buyOrSell |
requestedPriceType |
impactOnCash |
true |
Key |
Value |
ticker |
Cash |
exchange |
Account |
|
2016-01-01 |
0 |
0 |
0 |
0 |
|
e99e0bdf-1955-4df2-8035-9d74151d19e8 |
NA |
CashTransfer |
100000 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-01-06 |
3210 |
0 |
31.142 |
10 |
|
6933a14d-5bd3-470f-9c93-da3ac763551a |
Buy |
Market |
-99975.8757 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-02-18 |
-3210 |
0 |
27.9402 |
10 |
|
cfe210e4-6032-4716-871b-7b40fd957ed5 |
Sell |
Market |
89678.063 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-03-28 |
2960 |
0 |
30.2955 |
10 |
|
1181f197-4b8a-4a98-bde5-993ac854c1f5 |
Buy |
Market |
-89684.5834 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-05-26 |
-2960 |
0 |
30.1644 |
10 |
|
3c1babc2-de87-4250-869d-4807ed81db81 |
Sell |
Market |
89276.6582 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2016-08-30 |
860 |
0 |
103.7895 |
10 |
|
f14bfc3d-d7d8-4a56-8563-087db40a06d4 |
Buy |
Market |
-89268.9809 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2016-10-13 |
-428 |
0 |
114.5405 |
10 |
rebalance of stocks |
82edf994-d635-4fe9-b5e1-7a3c18c43e77 |
Sell |
Market |
49013.3522 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2016-10-13 |
1374 |
0 |
35.6822 |
10 |
|
a05ec3f8-b49d-40d0-a1d4-32585e6ec437 |
Buy |
Market |
-49037.3028 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-07-13 |
-1374 |
0 |
33.7847 |
10 |
|
e7565ec9-b5f3-4d5d-88f8-1e2b9b1866ff |
Sell |
Market |
46410.1338 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2017-08-14 |
-69 |
0 |
159.2774 |
10 |
rebalance of stocks |
f77ac3df-847e-41a8-a904-037026442e14 |
Sell |
Market |
10980.142 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-08-14 |
1588 |
0 |
36.1259 |
10 |
|
67006337-1b0a-4275-9252-5e4e26638da2 |
Buy |
Market |
-57377.9478 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-08-31 |
-1588 |
0 |
34.8634 |
10 |
|
a4c4a738-bf9b-4779-94b6-048086f4d08f |
Sell |
Market |
55353.0663 |
true |
Key |
Value |
ticker |
AAPL |
exchange |
NASDAQ |
|
2017-10-12 |
-2 |
0 |
155.4412 |
10 |
rebalance of stocks |
2553e977-e3e9-4565-b73c-1eb334c9fb33 |
Sell |
Market |
300.8824 |
true |
Key |
Value |
ticker |
INTC |
exchange |
NASDAQ |
|
2017-10-12 |
1428 |
0 |
38.9591 |
10 |
|
9fd5d67b-5a3c-4f8f-9e2e-a428ab311667 |
Buy |
Market |
-55643.6258 |
2 Comments
Kristi Murtaugh · 24. July 2018 at 14:30
I have been exploring for a little bit for any high quality articles or weblog posts on this sort of house . Exploring in Yahoo I finally stumbled upon this website. Reading this info So i’m happy to show that I’ve a very just right uncanny feeling I found out just what I needed. I most indisputably will make sure to don’t fail to remember this site and provides it a glance regularly.
Monroe Sobeck · 24. June 2018 at 2:54
Hello. fantastic job. I did not expect this. This is a impressive story. Thanks!