| Overall Statistics |
|
Total Trades 435 Average Win 1.43% Average Loss -1.63% Compounding Annual Return -2.747% Drawdown 35.500% Expectancy -0.034 Net Profit -15.044% Sharpe Ratio -0.128 Probabilistic Sharpe Ratio 0.130% Loss Rate 48% Win Rate 52% Profit-Loss Ratio 0.87 Alpha -0.006 Beta -0.083 Annual Standard Deviation 0.121 Annual Variance 0.015 Information Ratio -0.58 Tracking Error 0.218 Treynor Ratio 0.187 Total Fees $18241.86 |
from fbprophet import Prophet
class ARIMADailyAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2015, 1, 1)
self.SetEndDate(datetime.today())
self.SetCash(1000000)
self.AddEquity("TLT", Resolution.Daily)
# self.SetBenchmark("SPY")
self.SetBrokerageModel(AlphaStreamsBrokerageModel())
self.AddAlpha(ProphetModel())
self.SetExecution(ImmediateExecutionModel())
self.SetPortfolioConstruction(InsightWeightingPortfolioConstructionModel(lambda time: None))
class ProphetModel(AlphaModel):
"""
Facebook Prophet time series prediction trial algorithm.
"""
def __init__(self):
# Prophet training past:
N_YEARS = 5
self.training_period = 365*N_YEARS
RETRAIN = 6
# Prediction Period:
self.prediction_period = 5
self.holding_period = timedelta(days = self.prediction_period)
self.retrain_period = RETRAIN*self.prediction_period
self.operation_count = False
# Alpha Model:
self.price_model = False
self.Name = 'Old Man Prophet'
def Update(self, algorithm, data):
insights = []
if data.HasData == False: return []
if not self.operation_count or self.operation_count%self.retrain_period == 0:
history = algorithm.History(algorithm.Securities.Keys,
self.training_period,
Resolution.Daily)
time_series = self.create_time_series(history)
self.price_model = Prophet()
time_series.reset_index(inplace=True)
time_series.columns = ['ds', 'y']
self.price_model.fit(time_series)
algorithm.Debug('Training on:' + str(algorithm.Time))
for security in algorithm.ActiveSecurities.Values:
if not security.Invested:
price_forecast = self.price_model.make_future_dataframe(periods=self.prediction_period, freq='d')
price_forecast = self.price_model.predict(price_forecast)
target_price = price_forecast.iloc[-1]['yhat']
if data[security.Symbol] is None: return []
current_price = data[security.Symbol].Close
if target_price > current_price: direction = InsightDirection.Up
elif target_price < current_price: direction = InsightDirection.Down
else: direction = InsightDirection.Flat
price_difference = target_price - current_price
insight = Insight(security.Symbol,
self.holding_period,
InsightType.Price,
direction,
price_difference, int(True),
self.Name, int(True))
pred_dict = {InsightDirection.Up: 'Up', InsightDirection.Down: 'Down', InsightDirection.Flat: 'Flat'}
algorithm.Debug('Predicting: ' + str(pred_dict[direction]))
insights.append(insight)
self.operation_count += 1
return insights
def create_time_series(self, df, column='close', freq='d'):
df = df.reset_index()
time_series = df[[column]].set_index(df['time']).asfreq(freq).ffill()
return time_series