aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/position.py13
-rw-r--r--sql/dawn.sql27
2 files changed, 40 insertions, 0 deletions
diff --git a/python/position.py b/python/position.py
index da2fa4b8..5f2d3da0 100644
--- a/python/position.py
+++ b/python/position.py
@@ -22,6 +22,19 @@ def get_list(engine, workdate=None, asset_class=None, include_unsettled=True):
positions.set_index('bbg_id', inplace=True)
return positions
+def get_list_range(engine, begin, end, asset_class=None):
+ begin = pd.Timestamp(begin).date()
+ end = pd.Timestamp(end).date()
+ positions = pd.read_sql_query("select identifier, bbg_type from list_positions_range(%s, %s, %s)",
+ engine,
+ params=(begin, end, asset_class))
+ positions.loc[positions.identifier.str.len() <= 11, 'cusip'] = positions.identifier.str.slice(stop=9)
+ positions.loc[positions.identifier.str.len() == 12, 'isin'] = positions.identifier
+ positions['bbg_id'] = positions.cusip.where(positions.cusip.notnull(), positions['isin']) + \
+ ' ' + positions.bbg_type
+ positions.set_index('bbg_id', inplace=True)
+ return positions
+
def backpopulate_marks(begin_str='2015-01-15', end_str='2015-07-15'):
pattern = re.compile("\d{4}-\d{2}-\d{2}")
list_of_daily_folder = (fullpath for (fullpath, _, _) in os.walk('/home/share/Daily')
diff --git a/sql/dawn.sql b/sql/dawn.sql
index e57ea3cc..fe0feeb0 100644
--- a/sql/dawn.sql
+++ b/sql/dawn.sql
@@ -241,6 +241,33 @@ BEGIN
END;
$$ LANGUAGE plpgsql;
+CREATE OR REPLACE function list_positions_range(start_date date,
+ end_date date,
+ p_class asset_class DEFAULT NULL)
+RETURNS TABLE(identifier varchar(12), description varchar(32), notional float, strategy bond_strat,
+ curr_cpn float, start_accrued_date date, last_settle_date date,
+ principal_payment float, accrued_payment float, currency currency, daycount day_count,
+ bbg_type bbg_type) AS $$
+DECLARE sqlquery text;
+DECLARE asset_opt text;
+DECLARE unsettled_opt text;
+BEGIN
+
+ sqlquery := 'WITH temp AS (SELECT bonds.identifier, asset_class, settle_date, folder,
+ principal_payment, accrued_payment, sum(faceamount*(2*buysell::int-1) )
+ OVER (PARTITION BY bonds.identifier) notional FROM bonds
+ WHERE trade_date <=$2)
+ SELECT DISTINCT ON (temp.identifier) temp.identifier, securities.description, notional, folder,
+ securities.coupon, start_accrued_date, settle_date, temp.principal_payment,
+ temp.accrued_payment, securities.currency, securities.day_count, securities.bbg_type
+ FROM temp LEFT JOIN securities USING (identifier)
+ WHERE (temp.notional>0 or (temp.notional==0 and settle_date>=$1)) AND paid_down>$1 '||asset_opt
+ ||' ORDER BY identifier, settle_date desc';
+ RETURN QUERY EXECUTE sqlquery USING start_date, end_date, p_class;
+END;
+$$ LANGUAGE plpgsql;
+
+
CREATE OR REPLACE function risk_positions(p_date date, p_assetclass asset_class) RETURNS TABLE
(description varchar(32), identifier varchar(12), notional float, price float,
strategy bond_strat, factor float, local_market_value float, usd_market_value float,