| Overall Statistics |
|
Total Trades 1 Average Win 0% Average Loss 0% Compounding Annual Return -1.027% Drawdown 1.500% Expectancy 0 Net Profit 0% Sharpe Ratio -0.075 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.042 Beta 0.463 Annual Standard Deviation 0.068 Annual Variance 0.005 Information Ratio 1.363 Tracking Error 0.071 Treynor Ratio -0.011 Total Fees $11.13 |
from QuantConnect.Data.UniverseSelection import *
import pandas as pd
class BasicTemplateAlgorithm(QCAlgorithm):
def Initialize(context):
context.my_universe = []
# Set the initial cash, start, and end dates for backtesting
context.SetCash(100000)
context.SetStartDate(2011,5,1)
context.SetEndDate(2011,5,10)
# Subscribe to data for securities returned in my universe
context.UniverseSettings.Resolution = Resolution.Daily
context.UniverseSettings.MinimumTimeInUniverse = 0
context.AddUniverse(context.universe_filter_course, context.universe_filter_fine)
# Schedule the 'trade' method to run
# Add SPY to our data subscription so we can schedule from it (use defaults)
context.AddEquity('SPY')
context.AddEquity('AAPL')
context.Schedule.On(
context.DateRules.EveryDay('SPY'),
context.TimeRules.AfterMarketOpen('SPY', 10),
Action(context.my_trade))
def universe_filter_course(context, coarse_data):
# First convert the 'course' data to a pandas dataframe.
# Select 20 largest dollar_volume stocks with prices higher than 'price_above'.
# Use 'has_fundamentals' to filter out ETFs and the like.
# This function expects to return a list of symbols so use the 'tolist' method.
columns = ['Price', 'DollarVolume', 'HasFundamentalData', 'Volume']
column_names = ['price', 'dollar_volume', 'has_fundamentals', 'volume']
data_df = to_dataframe(coarse_data, columns, column_names)
my_universe = (data_df.
query("(price > 5) and has_fundamentals").
nlargest(1, 'dollar_volume'))
# See how many securities are found in our universe
#context.Log("course size is: {}".format(my_universe.volume))
return my_universe.index.tolist()
def universe_filter_fine(context, fine_data):
# First convert the 'fine' data to a pandas dataframe.
symbols = [stock.Symbol for stock in fine_data]
data = [(float(stock.Price),)
for stock in fine_data]
labels = ['ev_to_ebitda']
data_df = pd.DataFrame.from_records(
data,
index=symbols,
columns=labels,)
context.Log("data is: {}".format((data_df.ev_to_ebitda.values)))
context.my_universe = (data_df.
nlargest(1, 'ev_to_ebitda').
index.tolist())
context.Log("fine size is: {}".format(len(context.my_universe)))
return context.my_universe
def my_trade(context):
# See how many securities we have in our Securities list
'''
for universe in context.UniverseManager.Keys:
context.Log("universe name: {}".
format(universe))
'''
for universe in context.UniverseManager.Values:
context.Log("universe count: {}".
format(universe.Members.Count))
if context.my_universe:
data_df = context.History(['AAPL'], 3)
context.Log("universe is: {}".format((context.my_universe)))
context.Log("history is: {}".format((data_df.close)))
if len(context.my_universe) > 0:
weight = 1.0 / len(context.my_universe)
else:
weight = 0.0
for security in context.my_universe:
context.SetHoldings(security, weight)
def to_dataframe(data_c, properties, labels):
# Helper function to make a dataframe from the coarse object.
# Then we can use all the handy dataframe methods.
# Set the 'coerce_float' parameter to get meaningful datatypes
# otherwise all the fields will be un-useful generic objects.
data = [[getattr(stock, name) for name in properties] for stock in data_c]
symbols = [stock.Symbol for stock in data_c ]
data_df = pd.DataFrame.from_records(
data,
index=symbols,
columns=labels,
coerce_float=True)
return data_df