-
Notifications
You must be signed in to change notification settings - Fork 35
/
Copy pathrun_reports
executable file
·73 lines (54 loc) · 2.2 KB
/
run_reports
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
#!/usr/bin/env python
import MySQLdb
import argparse
from datetime import date, timedelta, datetime
from sharpefolio import stocks
from sharpefolio import reports
from sharpefolio import calc
def parseDateArg(string):
return datetime.strptime("%s" % string, "%Y-%m-%d").date()
connection = MySQLdb.connect(
host="127.0.0.1",
user="root",
passwd="root",
db="sharpefolio"
)
report_repository = reports.ReportMysqlRepository(connection)
report_mapper = reports.ReportMapper(report_repository)
# 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)
parser = argparse.ArgumentParser(description='Generate the ratios for the reports within the date range.')
yesterday = datetime.now().date()
parser.add_argument('startDate', type=parseDateArg)
parser.add_argument('--endDate', type=parseDateArg, default=yesterday)
args = parser.parse_args()
since_date = args.startDate
until_date = args.endDate
reports_collection = report_mapper.find_within_date(since_date, until_date)
print reports_collection
for report in reports_collection.loop():
# Report date range
end_date = report.date
start_date = report.start_date()
stocks_collection = stock_mapper.find_all()
for stock in stocks_collection.loop():
prices_collection = price_mapper.find_by_stock_id_in_range(stock.id, start_date, end_date)
prices = [price.closing_price for price in prices_collection.loop()]
ratio = calc.Ratio(prices)
if (report.formula == 'sharpe-v1.0-beta'):
value = sharpe = ratio.sharpe()
else:
value = ratio.sortino()
print 'calculating %s ratio %d for %s (%s - %d days): %f' % (report.formula, report.id, stock.symbol, report.date, report.duration, value)
ratio_entry = reports.Ratio(stock.id, report.id, value)
ratio_mapper.insert(ratio_entry)