Sure you can do this in bt. Depending on how your external analysis data is structured you may need to write an indicator to read that data, or read that data during strategy __init()__ and then process it in next(). Having only monthly bars can probably simplify your strategy. Using Returns analyzer with the monthly period you will get your monthly returns. One caveat - prices for all stocks used in your portfolios need to be loaded into bt at the beginning of the backtest. Which is logical approach, but somehow missed.