Commit 9203f363 authored by Yucheng's avatar Yucheng

add fetch_outright_status function

parent b19af2d0
...@@ -33,6 +33,7 @@ from alphamind.data.dbmodel.models import Formulas ...@@ -33,6 +33,7 @@ from alphamind.data.dbmodel.models import Formulas
from alphamind.data.dbmodel.models import DailyPortfoliosSchedule from alphamind.data.dbmodel.models import DailyPortfoliosSchedule
from alphamind.data.dbmodel.models import Performance from alphamind.data.dbmodel.models import Performance
from alphamind.data.dbmodel.models import Positions from alphamind.data.dbmodel.models import Positions
from alphamind.data.dbmodel.models import OutrightTmp
from alphamind.data.transformer import Transformer from alphamind.data.transformer import Transformer
from alphamind.model.loader import load_model from alphamind.model.loader import load_model
from alphamind.formula.utilities import encode_formula from alphamind.formula.utilities import encode_formula
...@@ -792,6 +793,44 @@ class SqlEngine(object): ...@@ -792,6 +793,44 @@ class SqlEngine(object):
index=False, index=False,
dtype={'weight': sa.types.JSON}) dtype={'weight': sa.types.JSON})
def fetch_outright_status(self, ref_date: str):
table = OutrightTmp
t = select([table.trade_id]).\
where(and_(table.trade_date <= ref_date,
table.operation == 'withdraw')).alias('t')
query = select([table]).\
where(and_(table.trade_id.notin_(t),
table.trade_date <= ref_date))
df = pd.read_sql(query, engine.engine).set_index('trade_id')
# calc total volume
df['total_volume'] = df.groupby('trade_id')['volume'].transform(sum)
# parse price
def parse_price_rule(x: pd.Series):
code = x['code']
rule = x['price_rule'].split('@')
if rule[0] in ['closePrice', 'openPrice']:
query = select([getattr(Market, rule[0])]).\
where(and_(Market.code == code, Market.trade_date == rule[1]))
data = pd.read_sql(query, engine.engine)
price = data.values[0][0]
elif rule[0] == 'fixedPrice':
price = float(rule[1])
else:
raise KeyError('do not have rule for %s' % x['price_rule'])
return price
df['price'] = df.apply(lambda x: parse_price_rule(x), axis=1)
df.drop(['remark', 'price_rule'], axis=1, inplace=True)
# pivot portfolio volume
total_cols = df.columns
pivot_cols = ['portfolio_name', 'volume']
tmp = df[pivot_cols].pivot(columns='portfolio_name')
tmp.columns = tmp.columns.droplevel(0)
res = df[[c for c in total_cols if c not in pivot_cols]].drop_duplicates().join(tmp).reset_index()
return res.sort_values(['trade_id'])
if __name__ == '__main__': if __name__ == '__main__':
...@@ -799,9 +838,7 @@ if __name__ == '__main__': ...@@ -799,9 +838,7 @@ if __name__ == '__main__':
engine = SqlEngine() engine = SqlEngine()
df = engine.fetch_factor_range(universe, df = engine.fetch_outright_status('2017-12-28')
['closePrice'],
start_date='2015-12-21',
end_date='2017-12-25')
print(df) print(df)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment