Commit 77cc7cfd authored by Dr.李's avatar Dr.李

update algorithms

parent 2efc48ff
This diff is collapsed.
......@@ -10,6 +10,7 @@ from pathlib import Path
MSSQL_CONN = "mssql+pymssql://readdnds:reader%402021@121.37.138.1:14331/dnds"
MYSQL_CONN = "mysql+pymysql://reader:Reader#2020@121.37.138.1:13316/vision_product"
# MYSQL_CONN = "mysql+pymysql://rl_sync:rl_sync_2019@121.37.138.1:13306/vision"
RISK_STYLES = ['BETA',
'MOMENTUM',
......@@ -65,74 +66,71 @@ def read_sql(query, source="mssql"):
return pd.read_sql(query, con=engine)
def nearest_report_date(date, freq="Q", method="forward"):
# def nearest_report_date(date, freq="Q", method="forward"):
# if len(date) == 10:
# date = date.replace("-", "")
# mm = int(date[4:6])
# year = int(date[0:4])
# last_year = year
# if method == "forward":
# add = 1
# else:
# add = 0
# if freq == "Q":
# q = (mm // 3 + add) * 3 - 3
# else:
# q = (mm // 6 + add) * 6 - 6
# if q <= 0:
# q += 12
# last_year -= 1
# last = calendar.monthrange(last_year, q)[1]
# return dt.date(last_year, q, last).strftime("%Y%m%d")
def nearest_report_date(date, freq="Q"):
if len(date) == 10:
date = date.replace("-", "")
mm = int(date[4:6])
year = int(date[0:4])
last_year = year
if method == "forward":
add = 1
else:
add = 0
if freq == "Q":
q = (mm // 3 + add) * 3 - 3
q = ((mm - 1) // 3) * 3
else:
q = (mm // 6 + add) * 6 - 6
if q <= 0:
q += 12
last_year -= 1
q = ((mm - 1) // 6) * 6
if q == 0:
q = 12
last_year = year - 1
last = calendar.monthrange(last_year, q)[1]
return dt.date(last_year, q, last).strftime("%Y%m%d")
def fd_alive_funds(trade_dt, class_code=None):
# if class_code:
# if isinstance(class_code, str) or isinstance(class_code, int):
# condition = f" CLASSCODE like '{class_code}%' AND "
# else:
# condition = []
# for c in class_code:
# condition.append(f" CLASSCODE like '{c}%' ")
# condition = "OR".join(condition)
# condition = "(" + condition + ") AND"
# query = f"""
# select SECODE as SECURITYID, BEGINDATE, ENDDATE, CLASSCODE FROM TQ_FD_TYPE
# WHERE
# ISVALID = 1 AND
# {condition}
# TYPESTYLE = '22' AND
# BEGINDATE <= '{trade_dt}' AND
# (ENDDATE>='{trade_dt}' or ENDDATE = '19000101')
# ORDER BY SECODE;
# """
# else:
# query = f"""
# select SECODE as SECURITYID,BEGINDATE, ENDDATE, CLASSCODE FROM TQ_FD_TYPE
# WHERE
# ISVALID = 1 AND
# BEGINDATE <= '{trade_dt}' AND
# TYPESTYLE = '22' AND
# (ENDDATE>='{trade_dt}' or ENDDATE = '19000101')
# ORDER BY SECODE;
# """
# return read_sql(query)
df = pd.read_csv(str(Path(__file__).parents[0] / "wind_table.csv"))
df["SECODE"] = df["SECODE"].astype(str)
df["CLASSCODE"] = df["CLASSCODE"].astype(str)
def fd_alive_funds(trade_dt, class_code):
if class_code:
df = df[df.CLASSCODE.str.contains(str(class_code))]
df.rename(columns={"SECODE": "SECURITYID"}, inplace=True)
df = df.sort_values("CLASSCODE").groupby("SECURITYID", as_index=False).last()
return df
query = f"""
select security_code as SECURITYID, begin_date as BEGINDATE, end_date as ENDDATE, l2_name as CLASSCODE FROM wd_fd_classification
WHERE
flag = 1 AND
begin_date <= '{_to_yyyy_mm_dd(trade_dt)}' AND
(end_date>='{_to_yyyy_mm_dd(trade_dt)}' or end_date = '19000101') AND
l1_name = '{class_code}'
ORDER BY security_code;
"""
else:
query = f"""
select security_code as SECURITYID, begin_date as BEGINDATE, end_date as ENDDATE, l2_name as CLASSCODE FROM wd_fd_classification
WHERE
flag = 1 AND
begin_date <= '{_to_yyyy_mm_dd(trade_dt)}' AND
(end_date>='{_to_yyyy_mm_dd(trade_dt)}' or end_date = '19000101')
ORDER BY security_code;
"""
return read_sql(query, "mysql")
def fd_basicinfo(security_ids=None, trade_dt=None):
......@@ -223,6 +221,20 @@ def fd_hshkiport(security_ids, report_dates_begin, report_dates_end=None):
return read_sql(query).sort_values("SECURITYID").reset_index(drop=True)
def _to_yyyy_mm_dd(trade_dt):
if len(trade_dt) == 10:
return trade_dt
else:
return f"{trade_dt[0:4]}-{trade_dt[4:6]}-{trade_dt[6:8]}"
def _to_yyyymmdd(trade_dt):
if len(trade_dt) == 8:
return trade_dt
else:
return f"{trade_dt[0:4]}{trade_dt[5:7]}{trade_dt[8:10]}"
def fd_assetportfolio(security_ids, report_dates_begin, report_dates_end=None):
# 获取相关组合情况
if isinstance(security_ids, str):
......@@ -231,20 +243,24 @@ def fd_assetportfolio(security_ids, report_dates_begin, report_dates_end=None):
sec_id_strs = ",".join(["'" + s + "'" for s in security_ids])
if report_dates_end:
query = f"""
SELECT security_id as SECURITYID, report_date as REPORTDATE, bd_rto as BDRTO, conv_bd_rto as CONVBDRTO, equity_inve_rto as EQUITYINVERTO, st_fin_bd_rto as STFINBDRTO, deposit_rto as DEPOSITRTO FROM fd_portfolio
SELECT security_code as SECURITYID, report_date as REPORTDATE, bd_rto as BDRTO, conv_bd_rto as CONVBDRTO, equity_inve_rto as EQUITYINVERTO, st_fin_bd_rto as STFINBDRTO, deposit_rto as DEPOSITRTO FROM fd_portfolio
WHERE
report_date >= '{_to_yyyy_mm_dd(report_dates_begin)}' AND
report_date <= '{_to_yyyy_mm_dd(report_dates_end)}' AND
report_date >= '{report_dates_begin}' AND
report_date <= '{report_dates_end}' AND
is_valid = 1 AND
security_id in ({sec_id_strs})
flag = 1 AND
publish_date != 19000101 AND
security_code in ({sec_id_strs})
"""
else:
query = f"""
SELECT security_id as SECURITYID, report_date as REPORTDATE, bd_rto as BDRTO, conv_bd_rto as CONVBDRTO, equity_inve_rto as EQUITYINVERTO, st_fin_bd_rto as STFINBDRTO, deposit_rto as DEPOSITRTO FROM fd_portfolio
SELECT security_code as SECURITYID, report_date as REPORTDATE, bd_rto as BDRTO, conv_bd_rto as CONVBDRTO, equity_inve_rto as EQUITYINVERTO, st_fin_bd_rto as STFINBDRTO, deposit_rto as DEPOSITRTO FROM fd_portfolio
WHERE
report_date >= '{_to_yyyy_mm_dd(report_dates_begin)}' AND
report_date >= '{report_dates_begin}' AND
is_valid = 1 AND
security_id in ({sec_id_strs})
flag = 1 AND
publish_date != 19000101 AND
security_code in ({sec_id_strs})
"""
return read_sql(query, source="mysql").sort_values("SECURITYID").reset_index(drop=True)
......@@ -265,18 +281,7 @@ def fd_qtfdnav(security_ids, trade_dt):
return read_sql(query).sort_values("SECURITYID").reset_index(drop=True)
def _to_yyyy_mm_dd(trade_dt):
if len(trade_dt) == 10:
return trade_dt
else:
return f"{trade_dt[0:4]}-{trade_dt[4:6]}-{trade_dt[6:8]}"
def _to_yyyymmdd(trade_dt):
if len(trade_dt) == 8:
return trade_dt
else:
return f"{trade_dt[0:4]}{trade_dt[5:7]}{trade_dt[8:10]}"
def _join_ids(security_ids):
......@@ -445,7 +450,7 @@ def stk_return(start_date, end_date, security_ids=None):
sec_id_strs = _join_ids(security_ids)
if sec_id_strs:
query = f"""
SELECT security_code, trade_date, `close`, lat_factor FROM stk_daily_price_pro
SELECT security_code, trade_date, `close` * lat_factor AS lat_price FROM stk_daily_price_pro
WHERE
trade_date in ('{_to_yyyy_mm_dd(start_date)}', '{_to_yyyy_mm_dd(end_date)}') AND
security_code IN ({sec_id_strs}) AND
......
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