use of suite.trade.Trade in project suite by stupidsing.
the class DailyMain method alloc.
private Result alloc(String tag, float fund, BackAllocator backAllocator, Streamlet<Asset> assets) {
TimeRange period = TimeRange.daysBefore(64);
Simulate sim = BackAllocTester.of(cfg, period, assets, backAllocator, log).simulate(fund);
Account account0 = Account.ofPortfolio(cfg.queryHistory().filter(r -> String_.equals(r.strategy, tag)));
Account account1 = sim.account;
Map<String, Integer> assets0 = account0.assets();
Map<String, Integer> assets1 = account1.assets();
Set<String> symbols = Set_.union(assets0.keySet(), assets1.keySet());
Map<String, Float> priceBySymbol = cfg.quote(symbols);
List<Trade> trades = Trade_.diff(Trade.NA, assets0, assets1, priceBySymbol::get).toList();
sb.append("\nstrategy = " + tag + ", " + sim.conclusion());
return new Result(tag, trades);
}
use of suite.trade.Trade in project suite by stupidsing.
the class Summarize method summarize_.
private //
Summarize_ summarize_(//
Streamlet<Trade> trades_, //
Map<String, Float> priceBySymbol, Iterate<String> infoFun) {
Streamlet<Trade> trades0 = trades_;
Streamlet<Trade> trades1 = sellAll(trades0, priceBySymbol);
Streamlet<String> details = //
Read.from2(//
Trade_.portfolio(trades0)).map((symbol, nShares) -> {
Asset asset = cfg.queryCompany(symbol);
float price = priceBySymbol.get(symbol);
String info = infoFun.apply(symbol);
return //
asset + ": " + price + " * " + //
nShares + " = " + //
((long) (nShares * price)) + (info != null ? " \t(" + info + ")" : "");
}).sort(//
Object_::compare).collect(As::streamlet);
return new Summarize_(details, trades0, trades1);
}
use of suite.trade.Trade in project suite by stupidsing.
the class WalkForwardAllocTester method tick.
public String tick(Time time, Map<String, Float> priceBySymbol) {
int last = windowSize - 1;
System.arraycopy(times, 0, times, 1, last);
times[last] = time.epochSec();
for (Entry<String, DataSource> e : dsBySymbol.entrySet()) {
String symbol = e.getKey();
float[] prices = e.getValue().prices;
System.arraycopy(prices, 0, prices, 1, last);
prices[last] = priceBySymbol.get(symbol);
}
AlignKeyDataSource<String> akds = new AlignKeyDataSource<>(times, Read.from2(dsBySymbol));
List<Pair<String, Double>> ratioBySymbol = wfa.allocate(akds, windowSize);
UpdatePortfolio up = Trade_.updatePortfolio(time.ymdHms(), account, ratioBySymbol, assetBySymbol, Read.from2(priceBySymbol).mapValue(Eod::of).toMap());
float valuation_;
valuations.append(valuation_ = up.valuation0);
for (Pair<String, Float> e : up.val0.streamlet()) holdBySymbol.compute(e.t0, (s, h) -> e.t1 / valuation_ + (h != null ? h : 0d));
List<Trade> trades_ = up.trades;
String actions;
if (windowSize <= valuations.size())
actions = play(trades_);
else
actions = "wait";
return //
time.ymdHms() + ", valuation = " + //
valuation_ + ", portfolio = " + //
account + ", actions = " + actions;
}
use of suite.trade.Trade in project suite by stupidsing.
the class Summarize method summarize.
public <K> SummarizeByStrategy<K> summarize(Fun<Trade, K> fun) {
Streamlet2<K, Summarize_> summaryByKey = //
trades.groupBy(fun, //
trades_ -> summarize_(trades_, priceBySymbol, s -> null)).filterKey(//
key -> key != null).collect(As::streamlet2);
Map<String, Map<K, Integer>> nSharesByKeyBySymbol = //
summaryByKey.concatMap((key, summary) -> //
summary.account.portfolio().map(//
(symbol, n) -> Fixie.of(symbol, key, n))).groupBy(Fixie3::get0, fixies0 -> //
fixies0.groupBy(Fixie3::get1, fixies1 -> //
fixies1.map(Fixie3::get2).uniqueResult()).toMap()).toMap();
Map<String, Float> acquiredPrices = trades.collect(Trade_::collectBrokeredTrades).collect(Trade_::collectAcquiredPrices);
Time now = Time.now();
Summarize_ overall = summarize_(trades, priceBySymbol, symbol -> {
boolean isMarketOpen = //
false || //
HkexUtil.isMarketOpen(now) || HkexUtil.isMarketOpen(now.addHours(1));
DataSource ds = cfg.dataSource(symbol);
// acquisition price
float price0 = acquiredPrices.get(symbol);
// previous close
float price1 = ds.get(isMarketOpen ? -1 : -2).t1;
// now
float pricex = isMarketOpen ? priceBySymbol.get(symbol) : ds.get(-1).t1;
String keys = //
Read.from2(//
nSharesByKeyBySymbol.getOrDefault(symbol, Map.ofEntries())).keys().map(//
Object::toString).sort(//
String_::compare).collect(As.joinedBy("/"));
return //
percent(price1, pricex) + ", " + //
percent(price0, pricex) + (!keys.isEmpty() ? ", " + keys : "");
});
Map<K, String> outByKey = summaryByKey.mapValue(Summarize_::out0).toMap();
StringBuilder sb = new StringBuilder();
Sink<String> log = sb::append;
for (Entry<K, String> e : outByKey.entrySet()) log.sink("\nFor strategy " + e.getKey() + ":" + e.getValue());
log.sink(FormatUtil.tablize("\nOverall:\t" + Time.now().ymdHms() + overall.out1()));
// profit and loss
Map<K, Double> pnlByKey = //
sellAll(trades, priceBySymbol).groupBy(fun, //
t -> (double) Account.ofHistory(t).cash()).toMap();
return new SummarizeByStrategy<>(sb.toString(), overall.account, pnlByKey);
}
use of suite.trade.Trade in project suite by stupidsing.
the class DailyMain method mamr.
// moving average mean reversion
private Result mamr(float factor) {
String tag = "mamr";
int nHoldDays = 8;
Streamlet<Asset> assets = cfg.queryCompanies();
BuySellStrategy strategy = new Strategos().movingAvgMeanReverting(64, nHoldDays, .15f);
// pre-fetch quotes
cfg.quote(assets.map(asset -> asset.symbol).toSet());
// identify stocks that are mean-reverting
Map<String, Boolean> backTestBySymbol = //
SerializedStoreCache.of(//
serialize.mapOfString(serialize.boolean_)).get(getClass().getSimpleName() + ".backTestBySymbol", () -> //
assets.map2(stock -> stock.symbol, stock -> {
try {
TimeRange period = TimeRange.threeYears();
DataSource ds = cfg.dataSource(stock.symbol, period).range(period).validate();
SingleAllocBackTest backTest = SingleAllocBackTest.test(ds, strategy);
return MathUtil.isPositive(backTest.account.cash());
} catch (Exception ex) {
LogUtil.warn(ex + " for " + stock);
return false;
}
}).toMap());
TimeRange period = TimeRange.daysBefore(128);
List<Trade> trades = new ArrayList<>();
// capture signals
for (Asset asset : assets) {
String symbol = asset.symbol;
if (backTestBySymbol.get(symbol))
try {
DataSource ds = cfg.dataSource(symbol, period).validate();
float[] prices = ds.prices;
int last = prices.length - 1;
float latestPrice = prices[last];
int signal = strategy.analyze(prices).get(last);
int nShares = signal * asset.lotSize * Math.round(factor / nHoldDays / (asset.lotSize * latestPrice));
Trade trade = Trade.of(nShares, symbol, latestPrice);
if (signal != 0)
trades.add(trade);
} catch (Exception ex) {
LogUtil.warn(ex.getMessage() + " in " + asset);
}
}
return new Result(tag, trades);
}
Aggregations