Commit 71535598 authored by pengxiong@wealthgrow.cn's avatar pengxiong@wealthgrow.cn

Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	logs/tamp_course_order.log
parents fda2a67e 2826bea6
......@@ -2,7 +2,7 @@
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="jdk" jdkName="Python 3.6" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TestRunnerService">
......
......@@ -3,5 +3,5 @@
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7" project-jdk-type="Python SDK" />
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.6" project-jdk-type="Python SDK" />
</project>
\ No newline at end of file
......@@ -7,11 +7,15 @@
# @Software : PyCharm
# -----------------------------------------------------------------------------
from app.api.engine import tamp_user_engine, tamp_pay_session
from app.api.engine import tamp_pay_engine
from app.api.engine import tamp_user_engine, tamp_product_engine, tamp_product_session
from app.model.base import Base
from app.model.order import OrderInfo
from app.model.tamp_product_models import t_fund_info
if __name__ == '__main__':
Base.metadata.create_all(bind=tamp_pay_engine)
# Base.metadata.create_all(bind=tamp_pay_engine)
sql = 'select `fund_name` from `fund_info`'
row = tamp_product_session.execute(sql)
print(row)
# tamp_product_session.query(t_fund_info).filter(t_fund_info)
No preview for this file type
......@@ -11,6 +11,7 @@ import numpy as np
from sqlalchemy import and_
import tushare as ts
import datetime
from decimal import Decimal
from app.api.engine import tamp_user_session, tamp_product_session
# from app.model.tamp_user_models import CustomerOrder, CustomerInfo
# from app.model.tamp_product_models import FundInfo
......@@ -33,10 +34,10 @@ class UserCustomerDataAdaptor:
p_end_date = pd.to_datetime(end_date).date()
p_end_date = datetime.date(year=p_end_date.year, month=p_end_date.month, day=1) - datetime.timedelta(days=1)
self.end_date = pd.to_datetime(str(p_end_date))
# self.end_date = pd.to_datetime("2020-11-23")
self.end_date = pd.to_datetime("2020-11-23")
p_start_date = datetime.date(year=p_end_date.year, month=p_end_date.month, day=1)
self.month_start_date = p_start_date
# self.month_start_date = pd.to_datetime("2020-11-16")
self.month_start_date = pd.to_datetime("2020-11-16")
self.user_customer_order_df = self.get_user_customer_order_data()
self.fund_nav_total, self.fund_cnav_total = self.get_customer_fund_nav_data()
self.index_df = self.get_customer_index_nav_data()
......@@ -195,12 +196,15 @@ class UserCustomerDataAdaptor:
# cnav_df.loc[confirm_share_date, cur_fund_id] = cur_cnav
if cur_fund_id+"_amount" not in cnav_df:
profit = cnav_df[cur_fund_id].dropna() - cnav_df[cur_fund_id].dropna().shift(1)
price = cnav_df[cur_fund_id].dropna()
profit = price.diff().fillna(Decimal(0))
cnav_df[cur_fund_id + "_profit"] = profit
cnav_df[cur_fund_id + "_profit_ratio"] = profit / cnav_df[cur_fund_id].dropna().shift(1)
cnav_df[cur_fund_id + "_profit"] = cnav_df[cur_fund_id + "_profit"].fillna(Decimal(0))
profit_ratio = profit / cnav_df[cur_fund_id].dropna().shift(1)
cnav_df[cur_fund_id + "_profit_ratio"] = profit_ratio
cnav_df[cur_fund_id + "_profit_ratio"] = cnav_df[cur_fund_id + "_profit_ratio"].fillna(Decimal(0))
cnav_df[cur_fund_id+"_amount"] = 0
cnav_df[cur_fund_id + "_earn"] = 0
# cnav_df[cur_fund_id + "_cum_earn"] = 0
cnav_df[cur_fund_id + "_share"] = 0
# buy
......@@ -212,9 +216,16 @@ class UserCustomerDataAdaptor:
cnav_df.loc[confirm_share_date:, cur_fund_id + "_amount"] -= row["confirm_amount"]
cnav_df.loc[confirm_share_date:, cur_fund_id + "_share"] -= row["confirm_share"]
cnav_df[cur_fund_id + "_earn"] = cnav_df[cur_fund_id + "_profit"] * cnav_df[cur_fund_id + "_share"]
cnav_df[cur_fund_id + "_earn"] = cnav_df[cur_fund_id + "_earn"].apply(lambda x: float(x))
cnav_df[cur_fund_id + "_cum_earn"] = cnav_df[cur_fund_id + "_earn"].cumsum()
# cnav_df[cur_fund_id + "_earn"] = cnav_df[cur_fund_id + "_profit"] * cnav_df[cur_fund_id + "_share"]
# cnav_df[cur_fund_id + "_earn"] = cnav_df[cur_fund_id + "_earn"].apply(lambda x: float(x))
# cnav_df[cur_fund_id + "_cum_earn"] = cnav_df[cur_fund_id + "_earn"].cumsum()
for p_fund_id_ in p_fund_id_list:
cnav_df[p_fund_id_ + "_earn"] = (cnav_df[p_fund_id_ + "_profit"] * cnav_df[p_fund_id_ + "_share"]).apply(lambda x: float(x)).fillna(0)
# cnav_df[p_fund_id_ + "_earn"] = cnav_df[p_fund_id_ + "_earn"].apply(lambda x: float(x))
cnav_df[p_fund_id_ + "_cum_earn"] = cnav_df[p_fund_id_ + "_earn"].cumsum().fillna(0)
# cnav_df[p_fund_id_ + "_net_amount"] = cnav_df[p_fund_id_ + "_cum_earn"] + cnav_df[p_fund_id_ + "_amount"].apply(lambda x: float(x))
cnav_df[p_fund_id_ + "_net_amount"] = cnav_df[p_fund_id_ + "_share"] * cnav_df[p_fund_id_]
self.group_data[p_folio] = {"result_cnav_data": cnav_df, "order_df": p_order_df}
return cnav_df
......@@ -257,14 +268,27 @@ class UserCustomerDataAdaptor:
cur_fund_id = str(row["fund_id"])
confirm_share_date = pd.to_datetime(row["confirm_share_date"])
if cur_fund_id + "_amount" not in cnav_df:
profit = cnav_df[cur_fund_id].dropna() - cnav_df[cur_fund_id].dropna().shift(1)
price = cnav_df[cur_fund_id].dropna()
profit = price.diff().fillna(Decimal(0))
cnav_df[cur_fund_id + "_profit"] = profit
cnav_df[cur_fund_id + "_profit_ratio"] = profit / cnav_df[cur_fund_id].dropna().shift(1)
cnav_df[cur_fund_id + "_profit"] = cnav_df[cur_fund_id + "_profit"].fillna(Decimal(0))
profit_ratio = profit / cnav_df[cur_fund_id].dropna().shift(1)
cnav_df[cur_fund_id + "_profit_ratio"] = profit_ratio
cnav_df[cur_fund_id + "_profit_ratio"] = cnav_df[cur_fund_id + "_profit_ratio"].fillna(Decimal(0))
cnav_df[cur_fund_id + "_amount"] = 0
cnav_df[cur_fund_id + "_earn"] = 0
# cnav_df[cur_fund_id + "_cum_earn"] = 0
cnav_df[cur_fund_id + "_share"] = 0
# profit = cnav_df[cur_fund_id].dropna() - cnav_df[cur_fund_id].dropna().shift(1)
# cnav_df[cur_fund_id + "_profit"] = profit
# cnav_df[cur_fund_id + "_profit"] = cnav_df[cur_fund_id + "_profit"].fillna(Decimal(0))
# cnav_df[cur_fund_id + "_profit_ratio"] = profit / cnav_df[cur_fund_id].dropna().shift(1)
# cnav_df[cur_fund_id + "_profit_ratio"] = cnav_df[cur_fund_id + "_profit_ratio"].fillna(Decimal(0))
# cnav_df[cur_fund_id + "_amount"] = 0
# cnav_df[cur_fund_id + "_earn"] = 0
# # cnav_df[cur_fund_id + "_cum_earn"] = 0
# cnav_df[cur_fund_id + "_share"] = 0
# buy
if row['order_type'] == 1:
cnav_df.loc[confirm_share_date:, cur_fund_id + "_amount"] += row["confirm_amount"]
......@@ -274,8 +298,10 @@ class UserCustomerDataAdaptor:
cnav_df.loc[confirm_share_date:, cur_fund_id + "_amount"] -= row["confirm_amount"]
cnav_df.loc[confirm_share_date:, cur_fund_id + "_share"] -= row["confirm_share"]
cnav_df[cur_fund_id + "_earn"] = cnav_df[cur_fund_id + "_profit"] * cnav_df[cur_fund_id + "_share"]
cnav_df[cur_fund_id + "_earn"] = cnav_df[cur_fund_id + "_earn"].apply(lambda x: float(x))
cnav_df[cur_fund_id + "_cum_earn"] = cnav_df[cur_fund_id + "_earn"].cumsum()
for p_fund_id_ in p_fund_id_list:
cnav_df[p_fund_id_ + "_earn"] = (cnav_df[p_fund_id_ + "_profit"] * cnav_df[p_fund_id_ + "_share"]).apply(lambda x: float(x)).fillna(0)
# cnav_df[p_fund_id_ + "_earn"] = cnav_df[p_fund_id_ + "_earn"].apply(lambda x: float(x))
cnav_df[p_fund_id_ + "_cum_earn"] = cnav_df[p_fund_id_ + "_earn"].cumsum().fillna(0)
# cnav_df[p_fund_id_ + "_net_amount"] = cnav_df[p_fund_id_ + "_cum_earn"] + cnav_df[p_fund_id_ + "_amount"].apply(lambda x: float(x))
cnav_df[p_fund_id_ + "_net_amount"] = cnav_df[p_fund_id_ + "_share"] * cnav_df[p_fund_id_]
return cnav_df
......@@ -38,9 +38,18 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
profit_df = cur_folio_result_cnav_data[fund_id_list_earn]
# 组合收益率数组
return_ratio_df = self.combination_yield(cur_folio_result_cnav_data, fund_id_list)
# return_ratio_df, contribution_decomposition= self.combination_yield(cur_folio_result_cnav_data, fund_id_list)
# resample_df = resample(return_ratio_df, self.trade_cal_date, freq_max)
resample_cur_folio_result_cnav_data = resample(cur_folio_result_cnav_data, self.trade_cal_date, freq_max)
return_ratio_df, contribution_decomposition = self.combination_yield(resample_cur_folio_result_cnav_data,
fund_id_list)
resample_df = resample(return_ratio_df, self.trade_cal_date, freq_max)
# 收益分解df
contribution_decomposition_df = contribution_decomposition.fillna(0)*100
folio_report_data["contribution_decomposition"] = contribution_decomposition_df
# 总成本
total_cost = float(cur_folio_order_data[cur_folio_order_data["order_type"] == 1]["confirm_amount"].sum() - \
cur_folio_order_data[cur_folio_order_data["order_type"] == 2]["confirm_amount"].sum())
......@@ -104,7 +113,29 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
# 累积收益率
cumulative_return= return_ratio_df["cum_return_ratio"].values[-1]
folio_report_data["contribution_decomposition"] = float(cumulative_return)
folio_report_data["cumulative_return"] = float(cumulative_return)
# 月度分组
def year_month(x):
a = x.year
b = x.month
return str(a) + "/" + str(b)
profit_df_cp = profit_df.copy()
profit_df_cp["date"] = profit_df_cp.index
grouped = profit_df_cp.groupby(profit_df_cp["date"].apply(year_month))
sum_group = grouped.agg(np.sum)
month_sum = sum_group.sum(axis=1)
# 贡献分解
month_earn = sum_group.div(month_sum, axis='rows')
month_earn["datetime"] = pd.to_datetime(month_earn.index)
month_earn.sort_values(by="datetime", inplace=True)
del month_earn["datetime"]
col = list(month_earn.columns)
col_ = {x: x.replace('_earn', '') for x in list(col)}
month_earn.rename(columns=col_, inplace=True)
folio_report_data["contribution_decomposition"] = month_earn
# 组合内单个基金净值数据 组合内基金持仓数据
result_fund_nav_info, result_fund_hoding_info = self.group_fund_basic_info_data(cur_folio_order_data, cur_folio_result_cnav_data, cumulative_profit, total_cost)
......@@ -141,7 +172,11 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
report_data["hold_days"] = hold_days
# 组合收益率数组
return_ratio_df = self.combination_yield(cur_folio_result_cnav_data, fund_id_list)
# return_ratio_df = self.combination_yield(cur_folio_result_cnav_data, fund_id_list)
# resample_df = resample(return_ratio_df, self.trade_cal_date, freq_max)
resample_cur_folio_result_cnav_data = resample(cur_folio_result_cnav_data, self.trade_cal_date, freq_max)
return_ratio_df, contribution_decomposition = self.combination_yield(resample_cur_folio_result_cnav_data, fund_id_list)
resample_df = resample(return_ratio_df, self.trade_cal_date, freq_max)
# 总成本
......@@ -233,7 +268,7 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
# 累积收益率
cumulative_return = return_ratio_df["cum_return_ratio"].values[-1]
report_data["contribution_decomposition"] = float(cumulative_return)
report_data["cumulative_return"] = float(cumulative_return)
# 对应指数数据
index_df = self.get_customer_index_nav_data()
......@@ -294,40 +329,41 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
@staticmethod
def combination_yield(p_combina_df, fund_id_list):
fund_id_list_amount = [i + "_amount" for i in fund_id_list]
fund_id_list_amount = [i + "_net_amount" for i in fund_id_list]
fund_id_list_profit_ratio = [i + "_profit_ratio" for i in fund_id_list]
nav_amount_df = p_combina_df[fund_id_list + fund_id_list_amount+fund_id_list_profit_ratio].copy()
nav_amount_df["sum_amount"] = nav_amount_df[fund_id_list_amount].sum(axis=1).apply(lambda x: Decimal.from_float(x))
nav_net_amount_df = p_combina_df[fund_id_list + fund_id_list_amount+fund_id_list_profit_ratio].copy()
# nav_net_amount_df = resample(return_ratio_df, self.trade_cal_date, freq_max)
nav_net_amount_df["sum_net_amount"] = nav_net_amount_df[fund_id_list_amount].sum(axis=1).apply(lambda x: Decimal.from_float(x))
for amount_name in fund_id_list:
nav_amount_df[amount_name+"_amount_ratio"] = nav_amount_df[amount_name+"_amount"]/nav_amount_df["sum_amount"]
nav_amount_df[amount_name+"_profit_ratio_weight"] = nav_amount_df[amount_name+"_amount_ratio"] * nav_amount_df[amount_name+"_profit_ratio"]
nav_net_amount_df[amount_name+"_amount_ratio"] = nav_net_amount_df[amount_name+"_net_amount"]/(nav_net_amount_df["sum_net_amount"])
nav_net_amount_df[amount_name+"_profit_ratio_weight"] = nav_net_amount_df[amount_name+"_amount_ratio"].shift(1) * nav_net_amount_df[amount_name+"_profit_ratio"]
fund_profit_ratio = nav_net_amount_df[amount_name + "_profit_ratio"].dropna() + 1
nav_net_amount_df[amount_name + "_profit_cum_ratio_weight"] = (fund_profit_ratio.cumprod()-1)*nav_net_amount_df[amount_name+"_amount_ratio"].shift(1)
# enter_date = nav_net_amount_df[amount_name+"_profit_ratio"].dropna()
fund_id_list_profit_ratio_weight = [i + "_profit_ratio_weight" for i in fund_id_list]
nav_profit_ratio_weight = nav_amount_df[fund_id_list_profit_ratio_weight].copy().fillna(method='ffill')
nav_profit_ratio_weight = nav_net_amount_df[fund_id_list_profit_ratio_weight].copy().fillna(method='ffill')
# 收益率
# 组合收益率
return_ratio = nav_profit_ratio_weight.sum(axis=1)
# 累积收益率
return_ratio_list = list(return_ratio.values)
cum_return_ratio = []
last_ratio = 0
for i in range(len(return_ratio_list)):
if i == 0:
last_ratio = 1 + return_ratio_list[i]
cum_return_ratio.append(last_ratio)
continue
cur_ratio = (1 + return_ratio_list[i]) * last_ratio
cum_return_ratio.append(cur_ratio)
last_ratio = cur_ratio
# 组合累积收益率
# return_ratio_list = list(return_ratio.values)
cum_return_ratio = (return_ratio + 1).fillna(0).cumprod()
# 收益率
# 收益率df
cum_return_ratio_df = pd.DataFrame(return_ratio.values, columns=["return_ratio"])
cum_return_ratio_df["cum_return_ratio"] = cum_return_ratio
cum_return_ratio_df["cum_return_ratio"] = cum_return_ratio.values
cum_return_ratio_df.index = return_ratio.index
return cum_return_ratio_df
# 单个基金累计收益分解df
weight_name_list = [i + "_profit_cum_ratio_weight" for i in fund_id_list]
signal_fund_cum_weight = nav_net_amount_df[weight_name_list]
re_name = {x: x.replace("_profit_cum_ratio_weight", "") for x in weight_name_list}
signal_fund_cum_weight.rename(columns=re_name, inplace=True)
return cum_return_ratio_df, signal_fund_cum_weight
@staticmethod
def signal_fund_profit_result(p_fund_nav_df, cur_fund_id):
......
......@@ -6,10 +6,6 @@
# @Email : acepengxiong@163.com
# @Software : PyCharm
# -----------------------------------------------------------------------------
import base64
from urllib import parse
from io import BytesIO
import numpy as np
import matplotlib.pyplot as plt
......@@ -18,11 +14,11 @@ from matplotlib.ticker import FuncFormatter
from matplotlib.font_manager import FontProperties
# 中文字体初始化
plt.rcParams['font.sans-serif']=['Heiti TC']
plt.rcParams['font.sans-serif']=['simsunb.ttf']
def to_percent(temp, position):
return '%.2f' % temp + '%'
return '%1.0f' % temp + '%'
def draw_month_return_chart(xlabels, product_list, cumulative):
......@@ -32,7 +28,7 @@ def draw_month_return_chart(xlabels, product_list, cumulative):
# plt.ylabel('Scores')
figsize = (24, 12)
# 标签文字大小
fontsize = 15
fontsize = 20
# 初始化
fig = plt.figure(figsize=figsize)
ax1 = fig.add_subplot(111)
......@@ -45,17 +41,16 @@ def draw_month_return_chart(xlabels, product_list, cumulative):
# 坐标轴
ax1.tick_params(labelsize=fontsize)
ax2.tick_params(labelsize=fontsize)
# 坐标轴颜色
ax2.tick_params(axis='y', colors='#C6A774')
ax1.set_xticks(loc)
ax1.set_xticklabels(xlabels)
# ax1.yaxis.set_major_formatter(FuncFormatter(to_percent))
ax2.yaxis.set_major_formatter(FuncFormatter(to_percent))
# temp_rate = np.zeros(max_x_count)
# for i in range(len(product_list)):
# temp_rate += product_list[i]['data']
# max_rate = np.max(np.hstack((temp_rate, cumulative['data'])))
temp_rate = np.zeros(max_x_count)
for i in range(len(product_list)):
temp_rate += product_list[i]['data']
max_rate = np.max(np.hstack((temp_rate, cumulative['data'])))
# ax2.set_ylim(0, max_rate + 15)
# 柱状图
......@@ -87,12 +82,8 @@ def draw_month_return_chart(xlabels, product_list, cumulative):
ax2.text(a, b + 0.1, '%.2f' % b + '%', ha='center', va='bottom', fontsize=fontsize)
ax2.legend(loc='upper center', fontsize=fontsize)
# plt.show()
imgdata = BytesIO()
fig.savefig(imgdata, format='png')
imgdata.seek(0) # rewind the data
month_return_img = 'data:image/png;base64,' + base64.b64encode(imgdata.getvalue()).decode('utf-8')
return month_return_img
plt.show()
plt.savefig("")
def draw_contribution_chart(xlabels, product_list, cumulative):
......
This diff is collapsed.
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