| Overall Statistics |
|
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 |
import numpy as np
from datetime import datetime, timedelta
from collections import deque
from decimal import Decimal
from itertools import groupby
from pytz import utc
UTCMIN = datetime.min.replace(tzinfo=utc)
from Risk.NullRiskManagementModel import NullRiskManagementModel
class BasicTemplateFrameworkAlgorithm(QCAlgorithmFramework):
def Initialize(self):
self.SetStartDate(2017, 1, 1) #Set Start Date
self.SetEndDate(2017, 1, 25) #Set End Date
self.SetCash(1000) #Set Strategy Cash
self.SetBrokerageModel(BrokerageName.OandaBrokerage,AccountType.Margin)
self.resolution = Resolution.Daily
self.UniverseSettings.Resolution = Resolution.Daily
symbols = [Symbol.Create("EURUSD", SecurityType.Forex, Market.Oanda)
#,Symbol.Create("GBPUSD", SecurityType.Forex, Market.Oanda)
]
self.SetUniverseSelection( ManualUniverseSelectionModel(symbols) )
self.SetAlpha(My_Alpha())
self.SetPortfolioConstruction(MyPortfolio())
self.SetExecution(NullExecutionModel())
self.SetRiskManagement(NullRiskManagementModel())
def OnOrderEvent(self, orderEvent):
if orderEvent.Status == OrderStatus.Filled:
# self.Debug("Purchased Stock: {0}".format(orderEvent.Symbol))
pass
class My_Alpha(AlphaModel):
def __init__(self):
self.resolution = Resolution.Daily
self.resolutionPrediction = Resolution.Hour
self.expiryPeriod = 16
self.predictionInterval = Time.Multiply(Extensions.ToTimeSpan(self.resolutionPrediction), self.expiryPeriod)
self.Symbols = []
def Update(self, algorithm, data):
insights = []
if algorithm.Time.strftime('%A') == "Thursday":
for symbol in self.Symbols:
insights.append(Insight.Price(symbol, self.predictionInterval, InsightDirection.Up, None, None))
algorithm.Log( "Thursday Insight added "+ str(InsightDirection.Up))
algorithm.Log( "predictionInterval: "+ str(self.predictionInterval))
if algorithm.Time.strftime('%A') == "Friday":
for symbol in self.Symbols:
insights.append(Insight.Price(symbol, self.predictionInterval, InsightDirection.Up, None, None))
algorithm.Log( "Friday Insight added "+ str(InsightDirection.Down))
algorithm.Log( "predictionInterval: "+ str(self.predictionInterval))
if algorithm.Time.strftime('%A') == "Monday":
algorithm.Log( "Monday ")
return insights
def OnSecuritiesChanged(self, algorithm, changes):
for removed in changes.RemovedSecurities:
if removed in self.Symbols:
self.Symbols.remove(removed)
if removed.Symbol in self.insightsTimeBySymbol:
self.insightsTimeBySymbol.pop(removed.Symbol)
for symbol in changes.AddedSecurities:
self.Symbols.append(symbol.Symbol)
class MyPortfolio(PortfolioConstructionModel):
def __init__(self, resolution = Resolution.Daily):
self.insightCollection = InsightCollection()
self.removedSymbols = []
self.nextExpiryTime = UTCMIN
self.rebalancingTime = UTCMIN
self.rebalancingPeriod = Extensions.ToTimeSpan(resolution)
def CreateTargets(self, algorithm, insights):
targets = []
self.insightCollection.AddRange(insights)
# Create flatten target for each security that was removed from the universe
if self.removedSymbols is not None:
universeDeselectionTargets = [ PortfolioTarget(symbol, 0) for symbol in self.removedSymbols ]
targets.extend(universeDeselectionTargets)
self.removedSymbols = None
# Get insight that haven't expired of each symbol that is still in the universe
activeInsights = self.insightCollection.GetActiveInsights(algorithm.UtcTime)
# Get the last generated active insight for each symbol
lastActiveInsights = []
for symbol, g in groupby(activeInsights, lambda x: x.Symbol):
lastActiveInsights.append(sorted(g, key = lambda x: x.GeneratedTimeUtc)[-1])
percent = 0.2
errorSymbols = {}
for insight in lastActiveInsights:
target = PortfolioTarget.Percent(algorithm, insight.Symbol, insight.Direction * percent)
if not target is None:
targets.append(target)
else:
errorSymbols[insight.Symbol] = insight.Symbol
# Get expired insights and create flatten targets for each symbol
expiredInsights = self.insightCollection.RemoveExpiredInsights(algorithm.UtcTime)
expiredTargets = []
for symbol, f in groupby(expiredInsights, lambda x: x.Symbol):
if not self.insightCollection.HasActiveInsights(symbol, algorithm.UtcTime) and not symbol in errorSymbols:
expiredTargets.append(PortfolioTarget(symbol, 0))
continue
targets.extend(expiredTargets)
self.nextExpiryTime = self.insightCollection.GetNextExpiryTime()
if self.nextExpiryTime is None:
self.nextExpiryTime = UTCMIN
if self.nextExpiryTime > UTCMIN:
algorithm.Log("Portfolio Targets: "+str([( str(x.Symbol) ,x.Quantity) for x in targets]))
algorithm.Log("nextExpiryTime: "+str(self.nextExpiryTime))
return targets
def OnSecuritiesChanged(self, algorithm, changes):
# Get removed symbol and invalidate them in the insight collection
self.removedSymbols = [x.Symbol for x in changes.RemovedSecurities]
self.insightCollection.Clear(self.removedSymbols)