本教程将:
给一个概述的quant竞赛和它是如何工作的(第一课)。
本教程不会:
教你如何研究和实现一种quant策略(为此,你应该参考入门教程)。
1.正回报。
2.利用0.8倍- 1.1倍之间的杠杆。
3.比较低的头寸集中度。
4.beta-to-SPY很低。
5.中等换手率。
6.多头和空头头寸。
7.在流动性好的股票之间交易。
8.行业风险敞口低。
9.对风格风险的低暴露。
10.使用优化API下订单。
入门教程的第7课教你如何使用order_optimal_portfolio下订单。通读这一课是学习order_optimal_portfolio基础知识的最佳方法。为了满足这个需求,您需要使用order_optimal_portfolio将您的投资组合从一个状态移动到另一个状态。
from quantopian.pipeline import Pipeline
from quantopian.pipeline.experimental import QTradableStocksUS
def make_pipeline():
return Pipeline(
columns={
# Your pipeline columns go here.
},
screen=QTradableStocksUS()
)
import quantopian.algorithm as algo
import quantopian.optimize as opt
MAX_SHORT_POSITION_SIZE = 0.01 # 1%
MAX_LONG_POSITION_SIZE = 0.01 # 1%
# Define the position concentration constraint.
constrain_pos_size = opt.PositionConcentration.with_equal_bounds(
-MAX_SHORT_POSITION_SIZE,
MAX_LONG_POSITION_SIZE,
)
# Supply the constraint to order_optimal_portfolio.
algo.order_optimal_portfolio(
objective=my_objective, #Fill in with your objective function.
constraints=[
constrain_pos_size,
],
)
import quantopian.algorithm as algo
import quantopian.optimize as opt
# Define the dollar neutral constraint.
dollar_neutral = opt.DollarNeutral()
# Supply the constraint to order_optimal_portfolio.
algo.order_optimal_portfolio(
objective=my_objective, #Fill in with your objective function.
constraints=[
dollar_neutral,
],
)
def initialize(context):
# Schedule our reblance function to run every day, 45 minutes after
# market open.
schedule_function(
func=my_rebalance,
date_rule=date_rules.every_day(),
time_rule=time_rules.market_open(hours=0,minutes=45)
)
def my_rebalance(context, data):
# Ordering/rebalance logic goes here.
import quantopian.algorithm as algo
import quantopian.optimize as opt
MAX_GROSS_LEVERAGE = 1.0 # 1x
# Define the max leverage constraint.
constrain_gross_leverage = opt.MaxGrossExposure(MAX_GROSS_LEVERAGE)
# Supply the constraint to order_optimal_portfolio.
algo.order_optimal_portfolio(
objective=my_objective, #Fill in with your objective function.
constraints=[
constrain_gross_leverage,
],
)
你的算法不能与市场相关。具体来说,你的算法必须有一个绝对beta-to-SPY低于0.3。
一个算法需要有低的市场风险,以使它有资格分配审议。如果你的算法与股票市场的其他部分相关,那么这个算法提供的质量与购买市场指数没有什么不同。因此,这场竞赛要求算法保持市场中立。
要编写一个市场中性策略,你需要确保你的阿尔法信号与市场不相关。根据定义,阿尔法因素应该独立于市场整体运行。如果你的阿尔法信号是市场中立的,你的算法应该能够使用由阿尔法信号决定的权向量的最大化阿尔法目标。
另一种控制算法的beta-to-SPY的方法是使用历史上每个资产的beta-to-SPY为order_optimal_portfolio提供FactorExposure约束。然而,这种方法基于一个重要的假设,即组合我们投资组合中每种资产的历史 beta -to- spy 是一个很好的预测明天我们投资组合回报 beta-to- spy 的指标。这并不一定适用于所有的算法,所以它可能不适用于特定的策略。下面是一个FactorExposure的例子,它使用的是历史上每项资产的beta-to-SPY值:
import quantopian.algorithm as algo
import quantopian.optimize as opt
from quantopian.pipeline import Pipeline
from quantopian.pipeline.factors import SimpleBeta
def initialize(context):
# Define the beta-to-SPY factor in Pipeline.
beta = SimpleBeta(
target=sid(8554),
regression_length=260,
)
pipe = Pipeline(
columns={
'beta': beta,
},
screen=beta.notnull(),
)
algo.attach_pipeline(pipe, 'pipe')
def before_trading_start(context, data):
# Get the pipeline data every day.
context.pipeline_data = algo.pipeline_output('pipe')
def do_portfolio_construction(context, data):
pipeline_data = context.pipeline_data
# Define the beta constraint to be +/- 0.05 beta-to-SPY based
# on historical per-asset beta.
beta_neutral = opt.FactorExposure(
pipeline_data[['beta']],
min_exposures={'beta': -0.05},
max_exposures={'beta': 0.05},
)
# Supply the constraint to order_optimal_portfolio.
algo.order_optimal_portfolio(
objective=my_objective, #Fill in with your objective function.
constraints=[
beta_neutral,
],
)
import quantopian.algorithm as algo
import quantopian.optimize as opt
from quantopian.pipeline.experimental import risk_loading_pipeline
def initialize(context):
# Attach the risk loading pipeline to our algorithm.
algo.attach_pipeline(risk_loading_pipeline(), 'risk_loading_pipeline')
def before_trading_start(context, data):
# Get the risk loading data every day.
context.risk_loading_pipeline = pipeline_output('risk_loading_pipeline')
def place_orders(context, data):
# Constrain our risk exposures. We're using version 0 of the default bounds
# which constrain our portfolio to 18% exposure to each sector and 36% to
# each style factor.
constrain_sector_style_risk = opt.experimental.RiskModelExposure(
risk_model_loadings=context.risk_loading_pipeline,
version=0,
)
# Supply the constraint to order_optimal_portfolio.
algo.order_optimal_portfolio(
objective=my_objective, #Fill in with your objective function.
constraints=[constrain_sector_style_risk],
)
constrain_sector_style_risk = opt.experimental.RiskModelExposure(
risk_model_loadings=context.risk_loading_pipeline,
version=0,
min_momentum=-0.1,
max_momentum=0.1,
)
写一个赚钱的策略的最好的方法是有一个样本外的阿尔法因子。如果你很难找到这样一个因素,你应该尝试通过社区论坛或系列讲座来寻找想法,或者研究一些其他可以在quant上找到的数据。之后,按照入门教程中介绍的方法,将你的想法转化为使用Alphalens和Pyfolio的算法。