Share Brilliantly
trade backtesting
let trade = function(price, portfolio){
//calculate trades
//return an object that has keys representing the asset ids
//with values that represent the number of units invested
}
let calculateTrades = async function(data, trade){
let nav = 1;
let portfolio = {cash:1};
let stats = {};
let results = [];
for(let i=0;i<prices.length;i++){
nav = 0;
let price = prices[i];
if('cash' in portfolio) nav+=portfolio.cash;
for(let key in portfolio){
if(key!=='cash') nav += price.close*portfolio[key];
}
portfolio = await trade(price, portfolio, nav, stats);
results.push({
nav:nav,
portfolio:{...portfolio}
});
}
return results;
}
let td = await import('/lib/finance/backtest/v1.0.0/trade.mjs');
let trades = td.calculateTrades(price, trade);
let td = await import("/lib/finance/backtest/v1.0.0/trade.mjs");
let prices = [
{date:'2000-01-01', close:100, id:'IBM'},
{date:'2000-01-02', close:101, id:'IBM'},
{date:'2000-01-03', close:100, id:'IBM'},
{date:'2000-01-04', close:99, id:'IBM'},
{date:'2000-01-05', close:102, id:'IBM'},
];
//calculate the necessary indicators needed by the trade algorithm
//in this case, we need to calculate the returns
prices = prices.map((p,i,data)=>{
let result = {
date:p.date,
IBM:p.close,
"return":null
};
if(i>0) result.return = p.close/data[i-1].close
return result;
});
let results = await td.calculateTrades(prices, (price, nav, portfolio)=>{
if(price.return !== null && price.return < 1) return {IBM:nav/price.IBM};
else return {cash:nav}
});
Try it!
let nav = prices.map(p=>p.nav)