wip: add fund_code pool

main
jackluson 3 years ago
parent c825fe2d5f
commit fe021ccd34

@ -22,7 +22,7 @@ class FundStatistic:
def __init__(self):
# 统计上一个季度
last_quarter_time = time.localtime(time.time() - 3 * 30 * 24 * 3600)
time.strftime("%m-%d", last_quarter_time)
# time.strftime("%m-%d", last_quarter_time)
year = time.strftime("%Y", last_quarter_time)
date = time.strftime("%m-%d", last_quarter_time)
index = get_season_index(date)
@ -72,3 +72,15 @@ class FundStatistic:
# 分组查询特定股票的每个季度基金持有总数
def item_stock_fund_count(self, stock_name, fund_code_pool=None):
return self.each_query.select_special_stock_fund_count(stock_name, fund_code_pool)
def select_fund_pool(self, *, morning_star_rating_5="", morning_star_rating_3="", **args):
# print("morning_star_rating_5", morning_star_rating_5)
# print("morning_star_rating_3", morning_star_rating_3)
# print("args", args)
# morning_star_rating_5 = 5
return self.each_query.select_certain_condition_funds(
morning_star_rating_5=morning_star_rating_5,
morning_star_rating_3=morning_star_rating_3,
**args
)

@ -9,15 +9,10 @@ Author: luxuemin2108@gmail.com
Copyright (c) 2020 Camel Lu
'''
import pymysql
from pprint import pprint
from db.connect import connect
import pandas as pd
from sql_model.fund_query import FundQuery
from fund_info.statistic import FundStatistic
# cursor = connect().cursor()
def stocks_compare(stock_list, fund_code_pool=None):
each_statistic = FundStatistic()
@ -64,25 +59,42 @@ def stocks_compare(stock_list, fund_code_pool=None):
if __name__ == '__main__':
each_statistic = FundStatistic()
fund_code_pool = ['000001', '160133', '360014', '420002',
'420102', '000409', '000418', '000746',
'000751', '000884', '000991', '001043',
'001054', '001104', '001410', '001473',
'519714', '000003', '000011', '000029']
# fund_code_pool = ['000001', '160133', '360014', '420002',
# '420102', '000409', '000418', '000746',
# '000751', '000884', '000991', '001043',
# '001054', '001104', '001410', '001473',
# '519714', '000003', '000011', '000029']
morning_star_rating_5_condition = {
'value': 4,
'operator': '>='
}
morning_star_rating_3_condition = {
'value': 5,
'operator': '='
}
condition_dict = {
'morning_star_rating_5': morning_star_rating_5_condition,
'morning_star_rating_3': morning_star_rating_3_condition,
'manager_start_date': '2020-05-25'
}
fund_code_pool = each_statistic.select_fund_pool(
**condition_dict,
)
# pprint(fund_code_pool)
stock_top_list = each_statistic.all_stock_fund_count(
quarter_index="2021-Q1",
fund_code_pool=None,
filter_count=90)
fund_code_pool=fund_code_pool,
filter_count=5)
# print('2020-Q4 top 100 股票')
# pprint(stock_top_list)
# print(len(stock_top_list))
pprint(stock_top_list)
print(len(stock_top_list))
filter_list = stocks_compare(stock_top_list)
filter_list = stocks_compare(stock_top_list, fund_code_pool)
# pprint(filter_list)
# pprint(len(filter_list))
df_filter_list = pd.DataFrame(filter_list, columns=[
'名称', '2021-Q1持有数量', '2020-Q4持有数量', '环比', '环比百分比', '升Or降'])
print(df_filter_list)
df_filter_list.to_excel(
'./output/xlsx/top100-2021_q1_vs_2020_q4.xlsx', sheet_name='top100')
pprint(filter_list)
pprint(len(filter_list))
# df_filter_list = pd.DataFrame(filter_list, columns=[
# '名称', '2021-Q1持有数量', '2020-Q4持有数量', '环比', '环比百分比', '升Or降'])
# print(df_filter_list)
# df_filter_list.to_excel(
# './output/xlsx/top100-2021_q1_vs_2020_q4.xlsx', sheet_name='top100')

@ -12,6 +12,26 @@ from threading import Lock
from db.connect import connect
def format_sql(table_name, field_dict, prefix="AND"):
print("field_dict", field_dict['name'])
sql_str = ''
field_name = field_dict.get('name')
field_value = field_dict.get('value')
operator = field_dict.get('operator')
if not field_name or not field_value or not operator:
return sql_str
format_dict = {
"prefix": prefix,
'table_name': table_name,
'field_name': field_name,
"operator": operator,
"value": field_value
}
sql_str = '{prefix} {table_name}.{field_name} {operator} {value}'.format(
**format_dict)
return sql_str
class FundQuery:
def __init__(self):
@ -86,20 +106,40 @@ class FundQuery:
self.lock.release()
return results
def select_certain_condition_funds(self, *, quarter_index=None, morning_star_rating_5=None, morning_star_rating_3=None):
def select_certain_condition_funds(self, *, quarter_index=None, morning_star_rating_5=None, morning_star_rating_3=None, manager_start_date=None):
if quarter_index == None:
quarter_index = self.quarter_index
print("condition", quarter_index, morning_star_rating_5)
sql = "SELECT a.fund_code, b.fund_name, a.quarter_index, a.total_asset , a.manager_start_date, \
a.investname_style, a.three_month_retracement, a.june_month_retracement, a.risk_assessment_sharpby,\
a.risk_statistics_alpha, a.risk_statistics_beta, a.risk_statistics_r_square, a.risk_assessment_standard_deviation,\
a.risk_assessment_risk_coefficient, a.risk_rating_2, a.risk_rating_3, a.risk_rating_5, a.morning_star_rating_5,\
a.morning_star_rating_3, a.stock_position_total, a.stock_position_ten FROM fund_morning_quarter as a \
last_year_time = time.localtime(time.time() - 365 * 24 * 3600)
last_year_date = time.strftime('%Y-%m-%d', last_year_time)
morning_star_rating_3_sql = format_sql('a', {
'name': 'morning_star_rating_3',
**morning_star_rating_3
})
# site = {"name": "菜鸟教程", "url": ""}
# print("网站名:{name}, 地址 {url}".format(**site))
# if morning_star_rating_5 not None:
sql = "SELECT a.fund_code FROM fund_morning_quarter as a \
LEFT JOIN fund_morning_base AS b ON a.fund_code = b.fund_code \
WHERE b.fund_name NOT LIKE '%%C' AND b.fund_name NOT LIKE '%%E' AND a.quarter_index = '2021-Q1' AND \
a.morning_star_rating_5 >= 3 AND a.morning_star_rating_3 = 5 AND a.stock_position_total >= 50 AND a.stock_position_ten <= 60 \
AND a.risk_assessment_sharpby >1 AND a.risk_rating_2 > 1 AND a.risk_rating_3 > 1 AND a.risk_rating_5 > 1 AND a.manager_start_date < '2020-05-24'"
# TODO: finish
WHERE a.quarter_index = '{quarter_index}' AND b.fund_name NOT LIKE '%%C' AND b.fund_name NOT LIKE '%%E' {morning_star_rating_5} {morning_star_rating_3} AND a.stock_position_total >= 50 AND a.stock_position_ten <= 60 \
AND a.risk_assessment_sharpby >1 AND a.risk_rating_2 > 1 AND a.risk_rating_3 > 1 AND a.risk_rating_5 > 1 AND a.manager_start_date < '{manager_start_date}'"
format_dict = {
'quarter_index': quarter_index,
'morning_star_rating_5': "AND a.morning_star_rating_5 >= 3",
'morning_star_rating_3': morning_star_rating_3_sql,
'manager_start_date': str(last_year_date)
}
sql_format = sql.format(**format_dict)
self.lock.acquire()
self.cursor.execute(sql_format) # 执行sql语句
results = self.cursor.fetchall() # 获取查询的所有记录
self.lock.release()
fund_pool = []
for item in results:
fund_code = item[0]
fund_pool.append(fund_code)
return fund_pool
# 筛选同类基金除了A类
def select_similar_fund(self, similar_name):

Loading…
Cancel
Save