use of suite.trade.Asset in project suite by stupidsing.
the class WalkForwardRecorderMain method run.
@Override
protected boolean run(String[] args) {
Streamlet<Asset> assets = cfg.queryCompaniesByMarketCap(Time.now());
float fund0 = 1000000f;
Trade_.isCacheQuotes = false;
Trade_.isShortSell = true;
Trade_.leverageAmount = fund0;
if (Boolean.FALSE) {
// record
String ts = Time.now().ymdHms().replace("-", "").replace(" ", "-").replace(":", "");
String filename = "wfa." + ts + ".csv";
Schedule schedule = //
Schedule.ofRepeat(5, () -> {
String ymdHms = Time.now().ymdHms();
Map<String, Float> priceBySymbol = cfg.quote(assets.map(asset -> asset.symbol).toSet());
try (OutputStream os = //
Files.newOutputStream(//
HomeDir.resolve(filename), //
StandardOpenOption.APPEND, //
StandardOpenOption.CREATE, //
StandardOpenOption.WRITE);
PrintWriter bw = new PrintWriter(os)) {
for (Entry<String, Float> e : priceBySymbol.entrySet()) bw.println(ymdHms + ", " + e.getKey() + ", " + e.getValue());
} catch (IOException ex) {
Fail.t(ex);
}
});
Scheduler.of(schedule.filterTime(dt -> HkexUtil.isMarketOpen(Time.of(dt)))).run();
} else {
// replay
String ts = "20170612-092616";
String filename = "wfa." + ts + ".csv";
Map<Time, Map<String, Float>> data = new TreeMap<>();
try (//
InputStream is = Files.newInputStream(HomeDir.resolve(filename));
//
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr)) {
while (br.ready()) {
String[] array = br.readLine().split(",");
Time time = Time.of(array[0].trim());
String symbol = array[1].trim();
float price = Float.parseFloat(array[2].trim());
data.computeIfAbsent(time, s -> new HashMap<>()).put(symbol, price);
}
} catch (IOException ex) {
Fail.t(ex);
}
WalkForwardAllocConfiguration wfac = new //
WalkForwardAllocConfiguration(//
cfg.queryCompaniesByMarketCap(Time.now()), bag.rsi.unleverage().walkForwardAllocator());
WalkForwardAllocTester tester = new WalkForwardAllocTester(cfg, wfac.assets, fund0, wfac.walkForwardAllocator);
for (Entry<Time, Map<String, Float>> e : data.entrySet()) System.out.println(tester.tick(e.getKey(), e.getValue()));
System.out.println(tester.conclusion());
}
return true;
}
use of suite.trade.Asset in project suite by stupidsing.
the class BackAllocBackTestTest method testBackTestSingle.
@Test
public void testBackTestSingle() {
Asset asset = cfg.queryCompany("0945.HK");
BackAllocator backAllocator = new MovingAvgMeanReversionBackAllocator().backAllocator();
assertGrowth(out(runner.backTest(backAllocator, period, Read.each(asset))));
}
use of suite.trade.Asset in project suite by stupidsing.
the class HkexTest method testList.
@Test
public void testList() {
List<Asset> companies = hkex.queryCompanies().toList();
System.out.println(companies);
for (Asset company : companies) System.out.println(//
"+ \"\\n" + company.symbol + "|" + //
company.name + "|" + //
company.lotSize + "|" + //
company.marketCap + "\" //");
String name = //
Read.from(//
companies).filter(//
fixie -> String_.equals(fixie.symbol, "0005.HK")).uniqueResult().name;
assertTrue(name.equals("HSBC Holdings plc"));
}
use of suite.trade.Asset 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);
}
use of suite.trade.Asset in project suite by stupidsing.
the class DailyMain method pairs.
public BackAllocConfiguration pairs(String symbol0, String symbol1) {
Streamlet<Asset> assets = Read.each(symbol0, symbol1).map(cfg::queryCompany).collect(As::streamlet);
BackAllocator backAllocator = BackAllocatorOld.me.pairs(cfg, symbol0, symbol1).unleverage();
return new BackAllocConfiguration(time -> assets, backAllocator);
}
Aggregations