-
Notifications
You must be signed in to change notification settings - Fork 35
/
Copy pathcreate_picks.py
156 lines (113 loc) · 4.19 KB
/
create_picks.py
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
from sharpefolio import stocks
from sharpefolio import reports
from sharpefolio import calc
from datetime import date, timedelta
import sys
import MySQLdb
connection = MySQLdb.connect(
host="127.0.0.1",
user="vagrant",
passwd="vagrant",
db="sharpefolio"
)
# Set up stock mapper
stock_repository = stocks.StockMysqlRepository(connection)
stock_mapper = stocks.StockMapper(stock_repository)
# Set up price mapper
price_repository = stocks.PriceMysqlRepository(connection)
price_mapper = stocks.PriceMapper(price_repository)
# Set up report mapper
report_repository = reports.ReportMysqlRepository(connection)
report_mapper = reports.ReportMapper(report_repository)
# Set up ratio mapper
ratio_repository = reports.RatioMysqlRepository(connection)
ratio_mapper = reports.RatioMapper(ratio_repository)
# Set up pick mapper
pick_repository = reports.PickMysqlRepository(connection)
pick_mapper = reports.PickMapper(pick_repository)
# Set up recipe mapper
recipe_repository = reports.RecipeMysqlRepository(connection)
recipe_mapper = reports.RecipeMapper(recipe_repository)
combos = {
'n_stocks': [4, 5, 6, 7, 8],
'check_correlation': [True, False],
'distribution': ['even', 'ratio'],
'report_duration': [5, 10, 15, 20, 25, 30],
'report_formula': ['sharpe-v1.0-beta', 'sortino-v1.0-beta']
}
def recipe_combos(combos):
recipes = []
for n_stocks in combos['n_stocks']:
for check_correlation in combos['check_correlation']:
for distribution in combos['distribution']:
for report_duration in combos['report_duration']:
for report_formula in combos['report_formula']:
recipe = reports.Recipe(report_formula, report_duration, n_stocks, check_correlation, distribution)
recipes.append(recipe)
recipe_mapper.insert(recipe)
return recipes
class Picker:
def __init__(self, report, recipe):
self.report = report
self.recipe = recipe
self.start_date = report.start_date()
self.end_date = date(self.report.date.year, self.report.date.month, self.report.date.day)
def _picks_with_least_correlation(self):
top_ratios = ratio_mapper.find_highest_ratio(self.report.id, self.recipe.n_stocks)
stock_prices = {}
for ratio in top_ratios:
stock_prices[ratio.stock_id] = price_mapper.find_by_stock_id_in_range(ratio.stock_id, self.start_date, self.end_date)
picker = calc.InvertedCorrelationPicker(stock_prices)
picked_stock_ids = picker.pick(self.recipe.n_stocks)
picks = {}
for picked_stock_id in picked_stock_ids:
for ratio in top_ratios:
if ratio.stock_id == picked_stock_id:
stock = stock_mapper.find_by_id(ratio.stock_id)
picks[stock.symbol] = ratio.ratio
return picks
def _picks_with_highest_ratio(self):
picks = {}
highest_ratios = ratio_mapper.find_highest_ratio(self.report.id, self.recipe.n_stocks)
for ratio in highest_ratios:
symbol = stock_mapper.find_by_id(ratio.stock_id).symbol
picks[symbol] = ratio.ratio
return picks
def _distribute_picks_evenly(self, picks):
n = len(picks)
dist = {}
for symbol in picks.keys():
dist[symbol] = 1.0 / n
return dist
def _distribute_picks_by_ratio(self, picks):
n = sum(picks.values())
dist = {}
for symbol in picks.keys():
dist[symbol] = picks[symbol] / n
return dist
def create_picks(self):
# Check correlation of stocks
if self.recipe.check_correlation == True:
picks = self._picks_with_least_correlation()
else:
picks = self._picks_with_highest_ratio()
# Distribute stock_prices
if recipe.distribution == 'ratio':
dist = self._distribute_picks_by_ratio(picks)
else:
dist = self._distribute_picks_evenly(picks)
# Store picks in DB
for symbol in picks.keys():
stock = stock_mapper.find_by_symbol(symbol)
weight = dist[symbol]
print "recipe_id:", self.recipe.id, "report_id:", report.id, "stock_id:", stock.id, "weight:", weight
pick = reports.Pick(self.recipe.id, self.report.id, stock.id, weight)
pick_mapper.insert(pick)
last_date = price_mapper.find_last_date()
for recipe in recipe_combos(combos):
reports_collection = report_mapper.find_until_date_with_duration_and_formula(
last_date, recipe.report_duration, recipe.report_formula
)
for report in reports_collection:
picker = Picker(report, recipe)
picker.create_picks()