| Overall Statistics |
|
Total Trades 63 Average Win 0.03% Average Loss -0.05% Compounding Annual Return 19.765% Drawdown 6.500% Expectancy 0.337 Net Profit 1.596% Sharpe Ratio 0.838 Loss Rate 23% Win Rate 77% Profit-Loss Ratio 0.73 Alpha 0.261 Beta -0.349 Annual Standard Deviation 0.184 Annual Variance 0.034 Information Ratio -0.684 Tracking Error 0.226 Treynor Ratio -0.441 Total Fees $114.38 |
'''
Sample simple algorithm
'''
# The imports below aren't always required but are handy if needed
# Import some datetime functions to use in scheduling
from datetime import datetime, timedelta
# Import numpy and pandas for all the powerful methods
import numpy as np
import pandas as pd
# The following class and associated Initialize method is always required
class BasicTemplateAlgorithm(QCAlgorithm):
def Initialize(context):
# Set the initial cash, start, and end dates for backtesting
context.SetCash(100000)
context.SetStartDate(2015,10,10)
context.SetEndDate(2015,11,10)
# Let's make a place to store the equities we wish to trade
# In this sample two leveraged ETFs
# Also store any info about each of them (in this case weight)
# Put it all into a dataframe called 'context.stocks' for easy access
stocks = ['SPXL', 'TMF']
weights = [.6, .4]
column_name = ['weight']
context.stocks = pd.DataFrame(
index = stocks,
data = weights,
columns = column_name)
# Subscribe to data for the equities we want to trade
# Remember the index of the dataframe holds the stock symbols
# Defaults to minute and fill-forward
for stock in context.stocks.index:
context.AddEquity(stock)
# Schedule trading at 10:00 am ET every day
context.Schedule.On(
context.DateRules.EveryDay(),
context.TimeRules.At(10, 0),
Action(context.enter_trades))
# Schedule logging at 4:01 pm ET every day
context.Schedule.On(
context.DateRules.EveryDay(),
context.TimeRules.At(16, 1),
Action(context.log_info))
def enter_trades(context):
'''
This is a custom method added to do our trading
In this case we simply want to keep a fixed ratio
determned by our stored weight
'''
# The 'SetHoldings' method is a convenient way to easily
# submit trades when the portfolio weight is known
# maybe not robust enough for live trading but great for backtests
for stock in context.stocks.index:
weight = context.stocks.get_value(stock, 'weight')
context.SetHoldings(stock, weight)
def log_info(context):
'''
Log some info about algorithm
Also an example of some of the ways to get data
'''
cash = context.Portfolio.Cash
portfolio_value = context.Portfolio.TotalPortfolioValue
context.Log('cash: {:.2f} portfolio value: {:.2f} '.
format(cash, portfolio_value))
for stock in context.stocks.index:
last_price = context.Securities[stock].Price
shares_held = context.Portfolio[stock].Quantity
value = last_price * shares_held
context.Log('holding {} shares of {} with total value of: {:.2f}'.
format(shares_held, stock, value))