use of suite.trade.data.DataSource 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.data.DataSource in project suite by stupidsing.
the class BackAllocatorUtil method byRiskOfReturn.
public default BackAllocator byRiskOfReturn() {
Statistic stat = new Statistic();
int nDays = 32;
return (akds, indices) -> {
Map<String, float[]> returnsByKey = akds.dsByKey.mapValue(DataSource::returns).toMap();
OnDateTime ba0 = allocate(akds, indices);
return index -> //
Read.from2(//
ba0.onDateTime(index)).map2((symbol, potential) -> {
float[] returns = Arrays.copyOfRange(returnsByKey.get(symbol), index - nDays, index);
return potential / stat.variance(returns);
}).toList();
};
}
use of suite.trade.data.DataSource in project suite by stupidsing.
the class BackAllocatorUtil method filterByIndexReturn.
public default BackAllocator filterByIndexReturn(Configuration cfg, String indexSymbol) {
DataSource indexDataSource = cfg.dataSource(indexSymbol);
return (akds, indices) -> {
OnDateTime onDateTime = allocate(akds, indices);
return index -> {
Time date = Time.ofEpochSec(akds.ts[index - 1]).date();
long t0 = date.addDays(-7).epochSec();
long tx = date.epochSec();
DataSource ids = indexDataSource.range(t0, tx);
double indexPrice0 = ids.get(-1).t1;
double indexPricex = ids.get(-2).t1;
double indexReturn = Quant.return_(indexPrice0, indexPricex);
return //
-.03f < indexReturn ? //
onDateTime.onDateTime(index) : List.of();
};
};
}
use of suite.trade.data.DataSource in project suite by stupidsing.
the class TimeSeriesTest method testSharpeRatio.
@Test
public void testSharpeRatio() {
TimeRange period = TimeRange.of(Time.of(2016, 1, 1), Time.of(2017, 5, 1));
DataSource ds = cfg.dataSource("0002.HK").range(period);
double sharpe = ts.returnsStatDailyAnnualized(ds.prices).sharpeRatio();
System.out.println("sharpe = " + sharpe);
assertTrue(.04d < sharpe);
}
use of suite.trade.data.DataSource in project suite by stupidsing.
the class StatisticalArbitrageTest method testAutoRegressivePowersOfTwo.
@Test
public void testAutoRegressivePowersOfTwo() {
int power = 6;
DataSource ds = cfg.dataSource(Asset.hsiSymbol).cleanse();
float[] prices = ds.prices;
float[][] mas = To.array(power, float[].class, p -> ma.movingAvg(prices, 1 << p));
float[] returns = ts.returns(prices);
LinearRegression lr = stat.linearRegression(//
Ints_.range(1 << power, //
prices.length).map(i -> FltObjPair.of(returns[i], Floats_.toArray(power, p -> mas[p][i - (1 << p)]))));
System.out.println(lr);
}
Aggregations