Apr-02-2020, 10:44 PM
Hi All! I got the solution to my problem, it amounted to directly passing values obtained in positions['GOOG'], portfolio['positions'], portfolio['cash'] and portfolio['total']directly to the data frame as follows (with a renaming of the columns):
backtest_result = pd.DataFrame({"Signal": positions['GOOG'], "Price Paid": portfolio['positions'], "Position Value": portfolio['cash'], "PnL": portfolio['total']})Reworked -and working- version of code:
from pandas_datareader import data import numpy as np import pandas as pd start_date = '2014-01-01' end_date = '2018-01-01' data_values = data.DataReader('GOOG', 'yahoo', start_date, end_date) data_signal = pd.DataFrame(index=data_values.index) data_signal['price'] = data_values['Adj Close'] data_signal['daily_difference'] = data_signal['price'].diff() data_signal['signal'] = 0.0 data_signal['signal'][:] = np.where(data_signal['daily_difference'][:] > 0, 1.0, 0.0) data_signal['positions'] = data_signal['signal'].diff() # Set the initial capital initial_capital= float(10000.0) positions = pd.DataFrame(index=data_signal.index).fillna(0.0) portfolio = pd.DataFrame(index=data_signal.index).fillna(0.0) positions['GOOG'] = data_signal['signal'] portfolio['positions'] = (positions.multiply(data_signal['price'], axis=0)) portfolio['cash'] = initial_capital - (positions.diff().multiply(data_signal['price'], axis=0)).cumsum() portfolio['total'] = portfolio['positions'] + portfolio['cash'] pd.set_option("display.max_rows", None, "display.max_columns", None) backtest_result = pd.DataFrame({"Signal": positions['GOOG'], "Price Paid": portfolio['positions'], "Position Value": portfolio['cash'], "PnL": portfolio['total']}) print(backtest_result)