-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathalgorithm_sentiment.py
More file actions
87 lines (64 loc) · 2.14 KB
/
Copy pathalgorithm_sentiment.py
File metadata and controls
87 lines (64 loc) · 2.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import quantopian.algorithm as algo
import quantopian.optimize as opt
from quantopian.pipeline import Pipeline
from quantopian.pipeline.data.psychsignal import stocktwits
from quantopian.pipeline.factors import SimpleMovingAverage
from quantopian.pipeline.filters import QTradableStocksUS
from quantopian.pipeline.experimental import risk_loading_pipeline
def initialize(context):
context.max_leverage = 1.0
context.max_pos_size = 0.015
context.max_turnover = 0.95
algo.attach_pipeline(
make_pipeline(),
'data_pipe'
)
algo.attach_pipeline(
risk_loading_pipeline(),
'risk_pipe'
)
algo.schedule_function(
rebalance,
algo.date_rules.week_start(),
algo.time_rules.market_open(),
)
def before_trading_start(context, data):
context.pipeline_data = algo.pipeline_output('data_pipe')
context.risk_factor_betas = algo.pipeline_output('risk_pipe')
def make_pipeline():
sentiment_score = SimpleMovingAverage(
inputs=[stocktwits.bull_minus_bear],
window_length=3,
mask=QTradableStocksUS()
)
return Pipeline(
columns={
'sentiment_score': sentiment_score,
},
screen=sentiment_score.notnull()
)
def rebalance(context, data):
alpha = context.pipeline_data.sentiment_score
if not alpha.empty:
objective = opt.MaximizeAlpha(alpha)
constrain_pos_size = opt.PositionConcentration.with_equal_bounds(
-context.max_pos_size,
context.max_pos_size
)
max_leverage = opt.MaxGrossExposure(context.max_leverage)
dollar_neutral = opt.DollarNeutral()
max_turnover = opt.MaxTurnover(context.max_turnover)
factor_risk_constraints = opt.experimental.RiskModelExposure(
context.risk_factor_betas,
version=opt.Newest
)
algo.order_optimal_portfolio(
objective=objective,
constraints=[
constrain_pos_size,
max_leverage,
dollar_neutral,
max_turnover,
factor_risk_constraints,
]
)