# -*- coding: utf-8 -*-
"""
Created on Tue Aug 25 10:29:02 2020
@author: 19749
"""
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from datetime import datetime
import pandas as pd
class data:
def data11(self):
a = pd.read_csv('指数股票型.csv', encoding = "gb2312").T.reset_index(drop=False)
a.insert(2, '类别', '指数股票型')
a.columns = ['基金代码', '基金简称', '类别']
return a
def data12(self):
a = pd.read_csv('主动股票开放型.csv', encoding = "gb2312").T.reset_index(drop=False)
a.insert(2, '类别', '主动股票开放型')
a.columns = ['基金代码', '基金简称', '类别']
return a
def data21(self):
a = pd.read_csv('主动混合封闭型.csv', encoding = "gb2312").T.reset_index(drop=False)
a.insert(2, '类别', '主动混合封闭型')
a.columns = ['基金代码', '基金简称', '类别']
return a
def data22(self):
a = pd.read_csv('主动混合开放型.csv', encoding = "gb2312").T.reset_index(drop=False)
a.insert(2, '类别', '主动混合开放型')
a.columns = ['基金代码', '基金简称', '类别']
return a
def data31(self):
a = pd.read_csv('指数债券型.csv', encoding = "gb2312").T.reset_index(drop=False)
a.insert(2, '类别', '指数债券型')
a.columns = ['基金代码', '基金简称', '类别']
return a
def data32(self):
a = pd.read_csv('主动债券封闭型.csv', encoding = "gb2312").T.reset_index(drop=False)
a.insert(2, '类别', '主动债券封闭型')
a.columns = ['基金代码', '基金简称', '类别']
return a
def data33(self):
a = pd.read_csv('主动债券开放型.csv', encoding = "gb18030").T.reset_index(drop=False)
a.insert(2, '类别', '主动债券开放型')
a.columns = ['基金代码', '基金简称', '类别']
return a
def data_all(self):
a = pd.DataFrame({'基金代码': [], '基金简称': [], '类别': []})
for i in range(1,4):
for j in range(1,4):
try:
exec('global b\nb = self.data' + str(i) + str(j) + '()')
a = pd.concat([a, b])
except:
pass
return a
from WindPy import w
w.start()
class dt:
def __init__(self):
self.d = {'A': [], 'B': [], 'C': [], 'D': [], 'E': [], 'F': [], 'G': [], 'H': [], 'I': [], 'J': [], 'K': [], 'L': [], 'M': [], 'N': [], 'O': [], 'P': [], 'Q': [], 'R': [], 'S': [], 'T': [],
'其他': []}
def add(self, fund_list, date):
for i in range(len(fund_list)):
for k in self.d.keys():
self.d[k].append(float(0))
print(date, fund_list[i], self.d)
a = w.wset("allfundhelddetail",
"rptdate="+ date +";windcode="+ fund_list[i] +";field=stock_code,proportiontonetvalue")
a = a.Data
print('data为',a)
code_list = a[0]
prop_list = a[1]
for j in range(len(code_list)):
try:
c = w.wsd(code_list[j], "industry_CSRCcode12", "2020-08-15", "2020-08-17", "industryType=1")
c = c.Data[0][0]
p = prop_list[j]
self.d[c][i] += p
except:
p = prop_list[j]
self.d['其他'][i] += p
return self.d
def getKey(dic,value):
result = []
for key in dic:
if dic[key] == value:
result.append(key)
return result
class QtTable(QAbstractTableModel):
def __init__(self, data):
QAbstractTableModel.__init__(self)
self._data = data
def rowCount(self, parent=None):
return self._data.shape[0]
def columnCount(self, parent=None):
return self._data.shape[1]
def data(self, index, role=Qt.DisplayRole):
if index.isValid():
if role == Qt.DisplayRole:
return str(self._data.iloc[index.row(), index.column()])
return None
def headerData(self, col, orientation, role):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return self._data.columns[col]
return None
list_add = []
dict_sel = {}
list_feature = []
dict_save = {}
df = None
dict_1 = {'指数股票型': data().data11(),
'主动股票开放型': data().data12()}
dict_2 = {'主动混合封闭型': data().data21(),
'主动混合开放型': data().data22()}
dict_3 = {'指数债券型': data().data31(),
'主动债券封闭型': data().data32(),
'主动债券开放型': data().data33()}
dict_0 = {'股票型基金': dict_1,
'混合型基金': dict_2,
'债券型基金': dict_3}
list_0 = [dict_1,
dict_2,
dict_3]
class window2(QWidget):
def __init__(self):
super(window2,self).__init__()
self.setWindowTitle("同业分析")
self.resize(1700, 900)
self.vlt0 = QVBoxLayout(self)
self.top()
self.sub_top()
self.main_ui()
self.cal()
def top(self):
self.hlt0 = QHBoxLayout()
self.vlt0.addLayout(self.hlt0)
self.top_left()
self.top_right()
def top_left(self):
self.btn01 = QPushButton('宏观经济指标')
self.btn01.setStyleSheet("background-color: rgb(222,211,140)")
self.btn01.setMaximumWidth(140)
self.btn02 = QPushButton('同业分析')
self.btn02.setStyleSheet("background-color: rgb(137,190,178)")
self.btn02.setMaximumWidth(180)
self.btn03 = QPushButton('第三页面')
self.btn03.setStyleSheet("background-color: rgb(222,211,140)")
self.btn03.setMaximumWidth(100)
self.btn_op1 = QPushButton()
op1 = QGraphicsOpacityEffect()
op1.setOpacity(0)
self.btn_op1.setGraphicsEffect(op1)
self.hlt0.addWidget(self.btn01)
self.hlt0.addWidget(self.btn02)
self.hlt0.addWidget(self.btn03)
self.hlt0.addWidget(self.btn_op1)
def top_right(self):
self.btn04 = QPushButton('收起基金类别选择栏')
self.btn04.setStyleSheet("background-color: rgb(196,226,216)")
self.btn04.setMaximumWidth(180)
self.flag_sel = True
self.btn05 = QPushButton('收起基金筛选栏')
self.btn05.setStyleSheet("background-color: rgb(196,226,216)")
self.btn05.setMaximumWidth(140)
self.flag_flt = True
self.btn06 = QPushButton('展开属性选择栏')
self.btn06.setStyleSheet("background-color: rgb(196,226,216)")
self.btn06.setMaximumWidth(140)
self.flag_sub_top = True
self.hlt0.addWidget(self.btn04)
self.hlt0.addWidget(self.btn05)
self.hlt0.addWidget(self.btn06)
self.btn04.clicked.connect(self.sh_sel)
self.btn05.clicked.connect(self.sh_fil)
self.btn06.clicked.connect(self.sh_sub_top)
def sub_top(self):
self.hlt1 = QSplitter()
self.vlt0.addWidget(self.hlt1)
self.hlt1.setOrientation(Qt.Horizontal)
self.hlt1.setVisible(False)
self.btn11 = QPushButton('换手率')
self.btn11.setStyleSheet("background-color: rgb(255,232,130)")
self.btn11.setMaximumSize(80, 35)
self.flag_turn = False
self.btn12 = QPushButton('最大回撤')
self.btn12.setStyleSheet("background-color: rgb(255,232,130)")
self.btn12.setMaximumWidth(80)
self.flag_dd = False
self.btn13 = QPushButton('持股明细')
self.btn13.setStyleSheet("background-color: rgb(255,232,130)")
self.btn13.setMaximumWidth(80)
self.flag_dt = False
self.btn14 = QPushButton('收益率')
self.btn14.setStyleSheet("background-color: rgb(255,232,130)")
self.btn14.setMaximumSize(80, 35)
self.flag_nav = False
self.btn_op3 = QPushButton()
op3 = QGraphicsOpacityEffect()
op3.setOpacity(0)
self.btn_op3.setGraphicsEffect(op3)
self.hlt1.addWidget(self.btn_op3)
self.hlt1.addWidget(self.btn14)
self.hlt1.addWidget(self.btn11)
self.hlt1.addWidget(self.btn12)
self.hlt1.addWidget(self.btn13)
self.btn11.clicked.connect(self.sh_turn)
self.btn12.clicked.connect(self.sh_dd)
self.btn13.clicked.connect(self.sh_dt)
self.btn14.clicked.connect(self.sh_nav)
def main_ui(self):
self.spl0 = QSplitter()
self.vlt0.addWidget(self.spl0)
self.win_sel()
self.win_flt()
self.win_right()
self.win_feature()
def win_sel(self):
self.spl_sel = QSplitter()
self.spl_sel.setOrientation(Qt.Vertical)
self.spl0.addWidget(self.spl_sel)
self.tree1 = QTreeWidget()
self.tree1.setHeaderLabel('备选基金类别')
self.plot_tree1()
self.btn_sel = QPushButton('选择')
self.btn_sel.setMinimumHeight(40)
self.btn_sel.setMaximumSize(280, 40)
self.btn_sel.clicked.connect(self.add)
self.spl_sel.addWidget(self.tree1)
self.spl_sel.addWidget(self.btn_sel)
def win_flt(self):
self.spl_flt = QSplitter()
self.spl0.addWidget(self.spl_flt)
self.spl_flt.setOrientation(Qt.Vertical)
self.tree2 = QTreeWidget()
self.tree2.setColumnCount(2)
self.tree2.setHeaderLabels(['已选基金类别','数量'])
self.tree2.setColumnWidth(0,200)
self.btn_flt = QPushButton('确认基金类别与单只基金选择')
self.btn_flt.setMaximumHeight(40)
self.btn_flt.clicked.connect(self.get_fund)
self.btn_dl_show = QPushButton('展开单只基金选择栏')
self.btn_dl_show.setMaximumHeight(40)
self.btn_dl_show.clicked.connect(self.sh_dl)
self.flag_dl = False
self.spl_flt.addWidget(self.tree2)
self.spl_flt.addWidget(self.btn_dl_show)
self.win_dl()
self.spl_flt.addWidget(self.btn_flt)
def win_dl(self):
self.spl_dl = QSplitter()
self.spl_flt.addWidget(self.spl_dl)
self.spl_dl.setOrientation(Qt.Vertical)
self.spl_dl.setVisible(False)
self.btn_dl = QPushButton('单只基金选择')
self.btn_dl.setMaximumSize(330, 40)
self.tree5 = QTreeWidget()
self.tree5.setHeaderLabel('已选单只基金')
self.spl_dl.addWidget(self.btn_dl)
self.spl_dl.addWidget(self.tree5)
def win_right(self):
self.spl_right = QSplitter()
self.spl_right.setOrientation(Qt.Vertical)
self.spl0.addWidget(self.spl_right)
self.nav()
self.turn()
self.drawdown()
self.dt()
self.gbx_show = QGroupBox()
self.gbx_show.setMinimumWidth(800)
self.spl_right.addWidget(self.gbx_show)
self.view = QTableView()
self.gridLayout = QGridLayout(self.gbx_show)
self.gridLayout.addWidget(self.view, 0, 0)
def nav(self):
self.gbx_nav = QGroupBox()
self.gbx_nav.setMaximumHeight(70)
self.gbx_nav.setVisible(False)
self.spl_right.addWidget(self.gbx_nav)
self.hlt_nav = QHBoxLayout(self.gbx_nav)
self.l_nav0 = QLabel('收益率: ')
self.l_nav0.setMaximumWidth(100)
self.btn_nav1 = QPushButton('选择起始日期')
self.btn_nav1.setMaximumSize(140, 40)
self.btn_nav1.clicked.connect(self.show_cal1)
self.l_nav1 = QLabel()
self.l_nav1.setMaximumSize(170 , 40)
self.btn_nav2 = QPushButton('选择结束日期')
self.btn_nav2.setMaximumSize(140, 40)
self.btn_nav2.clicked.connect(self.show_cal2)
self.l_nav2 = QLabel()
self.l_nav2.setMaximumSize(170 , 40)
self.btn_op2 = QPushButton()
op2 = QGraphicsOpacityEffect()
op2.setOpacity(0)
self.btn_op2.setGraphicsEffect(op2)
self.btn_nav3 = QPushButton('作为属性输出')
self.btn_nav3.setMaximumWidth(120)
self.btn_nav3.setObjectName('nav')
self.btn_nav3.clicked.connect(self.sh_0)
self.l_nav3 = QLabel(' 选择范围:')
self.l_nav3.setMaximumWidth(90)
self.cb_nav = QComboBox()
self.cb_nav.setMaximumWidth(80)
self.cb_nav.addItems([' ', '前1%', '前5%', '前10%', '后1%', '后5%', '后10%'])
self.btn_nav4 = QPushButton('选择>>')
self.btn_nav4.setMaximumWidth(70)
self.btn_nav4.setObjectName('nav')
self.btn_nav4.clicked.connect(self.nav_add)
self.hlt_nav.addWidget(self.l_nav0)
self.hlt_nav.addWidget(self.btn_nav1)
self.hlt_nav.addWidget(self.l_nav1)
self.hlt_nav.addWidget(self.btn_nav2)
self.hlt_nav.addWidget(self.l_nav2)
self.hlt_nav.addWidget(self.btn_op2)
self.hlt_nav.addWidget(self.btn_nav3)
self.hlt_nav.addWidget(self.l_nav3)
self.hlt_nav.addWidget(self.cb_nav)
self.hlt_nav.addWidget(self.btn_nav4)
self.l_nav3.setVisible(False)
self.cb_nav.setVisible(False)
self.flag_nav_sel = False
def turn(self):
self.gbx_turn = QGroupBox()
self.gbx_turn.setMaximumHeight(70)
self.gbx_turn.setVisible(False)
self.spl_right.addWidget(self.gbx_turn)
self.hlt_turn = QHBoxLayout(self.gbx_turn)
self.l_turn = QLabel('换手率: 年份:')
self.l_turn.setMaximumWidth(140)
self.te_turn = QLineEdit('2020')
self.te_turn.setMaximumSize(75, 31)
self.l_turn2 = QLabel(' 区间:')
self.l_turn2.setMaximumWidth(70)
self.cbx_turn = QComboBox()
self.cbx_turn.addItems(['上半年', '下半年', '全年'])
self.cbx_turn.setMaximumWidth(80)
self.btn_op4 = QPushButton()
op4 = QGraphicsOpacityEffect()
op4.setOpacity(0)
self.btn_op4.setGraphicsEffect(op4)
self.btn_turn3 = QPushButton('作为属性输出')
self.btn_turn3.setMaximumWidth(120)
self.btn_turn3.setObjectName('turn')
self.btn_turn3.clicked.connect(self.sh_0)
self.l_turn3 = QLabel(' 选择范围:')
self.l_turn3.setMaximumWidth(90)
self.cb_turn = QComboBox()
self.cb_turn.setMaximumWidth(80)
self.cb_turn.addItems([' ', '前1%', '前5%', '前10%', '后1%', '后5%', '后10%'])
self.btn_turn2 = QPushButton('选择>>')
self.btn_turn2.setMaximumWidth(70)
self.btn_turn2.setObjectName('turn')
self.btn_turn2.clicked.connect(self.turn_add)
self.hlt_turn.addWidget(self.l_turn)
self.hlt_turn.addWidget(self.te_turn)
self.hlt_turn.addWidget(self.l_turn2)
self.hlt_turn.addWidget(self.cbx_turn)
self.hlt_turn.addWidget(self.btn_op4)
self.hlt_turn.addWidget(self.btn_turn3)
self.hlt_turn.addWidget(self.l_turn3)
self.hlt_turn.addWidget(self.cb_turn)
self.hlt_turn.addWidget(self.btn_turn2)
self.l_turn3.setVisible(False)
self.cb_turn.setVisible(False)
self.flag_turn_sel = False
def drawdown(self):
self.gbx_dd = QGroupBox()
self.gbx_dd.setMaximumHeight(70)
self.gbx_dd.setVisible(False)
self.spl_right.addWidget(self.gbx_dd)
self.hlt_dd = QHBoxLayout(self.gbx_dd)
self.l_dd0 = QLabel('最大回撤: ')
self.l_dd0.setMaximumWidth(100)
self.btn_dd1 = QPushButton('选择起始日期')
self.btn_dd1.setMaximumSize(140, 40)
self.btn_dd1.clicked.connect(self.show_cal3)
self.l_dd1 = QLabel()
self.l_dd1.setMaximumSize(170 , 40)
self.btn_dd2 = QPushButton('选择结束日期')
self.btn_dd2.setMaximumSize(140, 40)
self.btn_dd2.clicked.connect(self.show_cal4)
self.l_dd2 = QLabel()
self.l_dd2.setMaximumSize(170 , 40)
self.btn_op5 = QPushButton()
op5 = QGraphicsOpacityEffect()
op5.setOpacity(0)
self.btn_op5.setGraphicsEffect(op5)
self.btn_dd3 = QPushButton('作为属性输出')
self.btn_dd3.setMaximumWidth(120)
self.btn_dd3.setObjectName('dd')
self.btn_dd3.clicked.connect(self.sh_0)
self.l_dd3 = QLabel(' 选择范围:')
self.l_dd3.setMaximumWidth(90)
self.cb_dd = QComboBox()
self.cb_dd.setMaximumWidth(80)
self.cb_dd.addItems([' ', '前1%', '前5%', '前10%', '后1%', '后5%', '后10%'])
self.btn_dd4 = QPushButton('选择>>')
self.btn_dd4.setMaximumWidth(70)
self.btn_dd4.setObjectName('dd')
self.btn_dd4.clicked.connect(self.dd_add)
self.hlt_dd.addWidget(self.l_dd0)
self.hlt_dd.addWidget(self.btn_dd1)
self.hlt_dd.addWidget(self.l_dd1)
self.hlt_dd.addWidget(self.btn_dd2)
self.hlt_dd.addWidget(self.l_dd2)
self.hlt_dd.addWidget(self.btn_op5)
self.hlt_dd.addWidget(self.btn_dd3)
self.hlt_dd.addWidget(self.l_dd3)
self.hlt_dd.addWidget(self.cb_dd)
self.hlt_dd.addWidget(self.btn_dd4)
self.l_dd3.setVisible(False)
self.cb_dd.setVisible(False)
self.flag_dd_sel = False
def dt(self):
self.gbx_dt = QGroupBox()
self.gbx_dt.setMaximumHeight(70)
self.gbx_dt.setVisible(False)
self.spl_right.addWidget(self.gbx_dt)
self.hlt_dt = QHBoxLayout(self.gbx_dt)
self.l_dt = QLabel('持股明细: 年份:')
self.l_dt.setMaximumWidth(150)
self.te_dt = QLineEdit('2020')
self.te_dt.setMaximumSize(75, 31)
self.l_dt2 = QLabel(' 季度:')
self.l_dt2.setMaximumWidth(70)
self.cbx_dt = QComboBox()
self.cbx_dt.addItems(['第一季度', '第二季度', '第三季度', '第四季度'])
self.cbx_dt.setMaximumWidth(100)
self.btn_op6 = QPushButton()
op6 = QGraphicsOpacityEffect()
op6.setOpacity(0)
self.btn_op6.setGraphicsEffect(op6)
self.btn_dt = QPushButton('选择>>')
self.btn_dt.setMaximumWidth(70)
self.btn_dt.setObjectName('turn')
self.btn_dt.clicked.connect(self.dt_add)
self.hlt_dt.addWidget(self.l_dt)
self.hlt_dt.addWidget(self.te_dt)
self.hlt_dt.addWidget(self.l_dt2)
self.hlt_dt.addWidget(self.cbx_dt)
self.hlt_dt.addWidget(self.btn_op6)
self.hlt_dt.addWidget(self.btn_dt)
self.flag_dt_sel = False
def win_feature(self):
self.spl_feature = QSplitter()
self.spl_feature.setOrientation(Qt.Vertical)
self.spl0.addWidget(self.spl_feature)
self.l_feature0 = QLabel('筛选标准(新选择将替换旧选择):')
self.l_feature0.setMaximumHeight(28)
self.l_feature1 = QLabel('')
self.l_feature1.setMinimumHeight(64)
self.l_feature1.setObjectName('')
self.l_feature2 = QLabel('已选属性(点击删除): ')
self.l_feature2.setMaximumHeight(28)
self.tree4 = QListWidget()
self.btn_feature1 = QPushButton('确认')
self.btn_feature1.setMaximumHeight(45)
self.btn_feature1.clicked.connect(self.calculate)
self.btn_feature1.clicked.connect(self.plot_table)
self.btn_feature2 = QPushButton('保存至基金类别栏')
self.btn_feature2.setMaximumHeight(45)
self.btn_feature3 = QPushButton('导出表格')
self.btn_feature3.setMaximumHeight(45)
self.btn_feature4 = QPushButton('清空已选属性栏')
self.btn_feature4.setMaximumHeight(45)
self.btn_feature4.clicked.connect(self.feature_clear)
self.btn_feature5 = QPushButton('显示表格')
self.btn_feature5.setMaximumHeight(45)
self.btn_feature5.clicked.connect(self.plot_table)
self.spl_feature.addWidget(self.l_feature0)
self.spl_feature.addWidget(self.l_feature1)
self.spl_feature.addWidget(self.l_feature2)
self.spl_feature.addWidget(self.tree4)
self.spl_feature.addWidget(self.btn_feature1)
self.spl_feature.addWidget(self.btn_feature5)
self.spl_feature.addWidget(self.btn_feature2)
self.spl_feature.addWidget(self.btn_feature3)
self.spl_feature.addWidget(self.btn_feature4)
def cal(self):
#日历控件
self.cal1 = QCalendarWidget(self)
self.cal1.setMinimumSize(390, 280)
self.cal1.setMaximumSize(390, 280)
self.cal1.setVisible(False)
date = self.cal1.selectedDate()
self.l_nav1.setText(date.toString('yyyy-MM-dd dddd'))
self.cal2 = QCalendarWidget(self)
self.cal2.setMinimumSize(390, 280)
self.cal2.setMaximumSize(390, 280)
self.cal2.setVisible(False)
date = self.cal2.selectedDate()
self.l_nav2.setText(date.toString('yyyy-MM-dd dddd'))
self.cal3 = QCalendarWidget(self)
self.cal3.setMinimumSize(390, 280)
self.cal3.setMaximumSize(390, 280)
self.cal3.setVisible(False)
date = self.cal3.selectedDate()
self.l_dd1.setText(date.toString('yyyy-MM-dd dddd'))
self.cal4 = QCalendarWidget(self)
self.cal4.setMinimumSize(390, 280)
self.cal4.setMaximumSize(390, 280)
self.cal4.setVisible(False)
date = self.cal4.selectedDate()
self.l_dd2.setText(date.toString('yyyy-MM-dd dddd'))
self.cal1.clicked.connect(self.showDate1)
self.cal2.clicked.connect(self.showDate1)
self.cal3.clicked.connect(self.showDate2)
self.cal4.clicked.connect(self.showDate2)
def sh_sel(self):
if self.flag_sel == True:
self.spl_sel.setVisible(False)
self.btn04.setText('展开基金类别选择栏')
self.flag_sel = False
else:
self.spl_sel.setVisible(True)
self.btn04.setText('收起基金类别选择栏')
self.flag_sel = True
def sh_fil(self):
if self.flag_flt == True:
self.spl_flt.setVisible(False)
self.btn05.setText('展开已选基金栏')
self.flag_flt = False
else:
self.spl_flt.setVisible(True)
self.btn05.setText('收起已选基金栏')
self.flag_flt = True
def sh_sub_top(self):
if self.flag_sub_top == True:
self.hlt1.setVisible(True)
self.btn06.setText('收起属性选择栏')
self.flag_sub_top = False
else:
self.hlt1.setVisible(False)
self.btn06.setText('展开属性选择栏')
self.flag_sub_top = True
def sh_turn(self):
if self.flag_turn == False:
self.gbx_turn.setVisible(True)
self.btn11.setStyleSheet("background-color: rgb(249,205,173)")
self.flag_turn = True
else:
self.gbx_turn.setVisible(False)
self.btn11.setStyleSheet("background-color: rgb(255,232,130)")
self.flag_turn = False
def sh_dd(self):
if self.flag_dd == False:
self.gbx_dd.setVisible(True)
self.btn12.setStyleSheet("background-color: rgb(249,205,173)")
self.flag_dd = True
else:
self.gbx_dd.setVisible(False)
self.btn12.setStyleSheet("background-color: rgb(255,232,130)")
self.flag_dd = False
def sh_dt(self):
if self.flag_dt == False:
self.gbx_dt.setVisible(True)
self.btn13.setStyleSheet("background-color: rgb(249,205,173)")
self.flag_dt = True
else:
self.gbx_dt.setVisible(False)
self.btn13.setStyleSheet("background-color: rgb(255,232,130)")
self.flag_dt = False
def sh_nav(self):
if self.flag_nav == False:
self.gbx_nav.setVisible(True)
self.btn14.setStyleSheet("background-color: rgb(249,205,173)")
self.flag_nav = True
else:
self.gbx_nav.setVisible(False)
self.btn14.setStyleSheet("background-color: rgb(255,232,130)")
self.flag_nav = False
def sh_dl(self):
if self.flag_dl == True:
self.spl_dl.setVisible(False)
self.btn_dl_show.setText('展开单只基金选择栏')
self.flag_dl = False
else:
self.spl_dl.setVisible(True)
self.btn_dl_show.setText('收起单只基金选择栏')
self.flag_dl = True
def sh_0(self):
name = self.sender().objectName()
exec('if self.flag_' + name +'_sel == False:\n\t'
+'self.flag_' + name +'_sel = True\n\t'
+'print(self.flag_' + name +'_sel)\n\t'
+'self.l_' + name +'3.setVisible(True)\n\t'
+'self.cb_' + name +'.setVisible(True)\n\t'
+'self.btn_' + name +'3.setText("作为筛选条件")\n'
'else:\n\t'
+'self.flag_' + name +'_sel = False\n\t'
+'print(self.flag_' + name +'_sel)\n\t'
+'self.l_' + name +'3.setVisible(False)\n\t'
+'self.cb_' + name +'.setVisible(False)\n\t'
+'self.btn_' + name +'3.setText("作为属性输出")')
def showDate1(self):
global list_date1
a = self.cal1.selectedDate().toString('yyyy-MM-dd dddd')
b = self.cal2.selectedDate().toString('yyyy-MM-dd dddd')
self.l_nav1.setText(a)
self.l_nav2.setText(b)
list_date1 = [self.cal1.selectedDate().toString('yyyy-MM-dd'),
self.cal2.selectedDate().toString('yyyy-MM-dd')]
print(list_date1)
def showDate2(self):
global list_date2
a = self.cal3.selectedDate().toString('yyyy-MM-dd dddd')
b = self.cal4.selectedDate().toString('yyyy-MM-dd dddd')
self.l_dd1.setText(a)
self.l_dd2.setText(b)
list_date2 = [self.cal3.selectedDate().toString('yyyy-MM-dd'),
self.cal4.selectedDate().toString('yyyy-MM-dd')]
print(list_date2)
def show_cal1(self):
if self.btn_nav1.text() == '选择起始日期':
self.cal1.move(self.spl_right.x() + self.btn_nav1.x() + 25,
self.spl0.y() + self.gbx_nav.y() + 60)
self.cal1.raise_()
self.cal1.setVisible(True)
self.btn_nav1.setText('确认')
else:
self.cal1.setVisible(False)
self.btn_nav1.setText('选择起始日期')
def show_cal2(self):
if self.btn_nav2.text() == '选择结束日期':
self.cal2.move(self.spl_right.x() + self.btn_nav2.x() + 25,
self.spl0.y() + self.gbx_nav.y() + 60)
self.cal2.raise_()
self.cal2.setVisible(True)
self.btn_nav2.setText('确认')
else:
self.cal2.setVisible(False)
self.btn_nav2.setText('选择结束日期')
def show_cal3(self):
if self.btn_dd1.text() == '选择起始日期':
self.cal3.move(self.spl_right.x() + self.btn_dd1.x() + 25,
self.spl0.y() + self.gbx_dd.y() + 60)
self.cal3.raise_()
self.cal3.setVisible(True)
self.btn_dd1.setText('确认')
else:
self.cal3.setVisible(False)
self.btn_dd1.setText('选择起始日期')
def show_cal4(self):
if self.btn_dd2.text() == '选择结束日期':
self.cal4.move(self.spl_right.x() + self.btn_dd2.x() + 25,
self.spl0.y() + self.gbx_dd.y() + 60)
self.cal4.raise_()
self.cal4.setVisible(True)
self.btn_dd2.setText('确认')
else:
self.cal4.setVisible(False)
self.btn_dd2.setText('选择结束日期')
def plot_tree1(self):
global dict_save
self.tree1.clear()
self.root1 = QTreeWidgetItem(self.tree1)
self.root1.setText(0,'海通基金分类')
for i in dict_0.keys():
child11 = QTreeWidgetItem(self.root1)
child11.setText(0,i)
child11.setCheckState(0, not Qt.CheckState)
for j in dict_0[i]:
self.child12 = QTreeWidgetItem(child11)
self.child12.setText(0,j)
self.child12.setCheckState(0, not Qt.CheckState)
self.root2 = QTreeWidgetItem(self.tree1)
self.root2.setText(0,'自定义基金类别')
for i in dict_save:
self.child21 = QTreeWidgetItem(self.root2)
self.child21.setText(0, i)
self.child21.setCheckState(0, not Qt.CheckState)
self.tree1.itemChanged.connect(self.onclick)
self.onclick_flag = True
def onclick(self,item,cloumn):
global list_add
if self.onclick_flag == True:
if item.checkState(cloumn) == Qt.Checked:
list_add.append(item.text(0))
print("checked", item.text(0))
list_add = list(set(list_add))
if item.checkState(cloumn) == Qt.Unchecked:
list_add.remove(item.text(0))
print("unchecked", item.text(0))
list_add = list(set(list_add))
else:
pass
print(list_add)
def add(self):
global list_add, dict_sel, df
list_temp = []
dict_sel = {}
for i in list_add:
try:
for j in dict_0[i]:
list_temp.append(j)
dict_sel[i] = list_temp
list_temp = []
except:
for j in list_0:
try:
print(j[i])
try:
dict_sel[getKey(dict_0, j)[0]].append(i)
dict_sel[getKey(dict_0, j)[0]] = list(set(dict_sel[getKey(dict_0, j)[0]]))
except:
dict_sel[getKey(dict_0, j)[0]] = [i]
except:
pass
print(dict_sel)
#构建树以及获取基金数据
dict_df = {'基金代码': [], '基金简称': [], '类别': []}
df = pd.DataFrame(dict_df)
self.tree2.clear()
#类别基金
for i in dict_sel.keys():
self.root1 = QTreeWidgetItem(self.tree2)
self.root1.setText(0, i)
for j in dict_sel[i]:
self.child1 = QTreeWidgetItem(self.root1)
self.child1.setText(0, j)
a = dict_0[i][j]
l = str(len(a))
self.child1.setText(1, l)
df = pd.concat([df, a])
#自定义类别
self.root2 = QTreeWidgetItem(self.tree2)
self.root2.setText(0, '自定义基金类别')
for i in list_add:
try:
a = dict_save[i]
print(a)
try:
a.insert(2, '类别', i)
except:
pass
self.child2 = QTreeWidgetItem(self.root2)
self.child2.setText(0, i)
self.child2.setText(1, str(len(a)))
df = pd.concat([df, a])
except:
pass
self.tree2.expandAll()
def dl_add(self):
self.tree5.clear()
try:
for i in range(len(dl_new_0.list_add1)):
self.root = QTreeWidgetItem(self.tree5)
self.root.setText(0, dl_new_0.list_add1[i] +' '+ dl_new_0.list_add2[i])
except:
pass
def get_fund(self):
global df
#单只基金
if dl_new_0.list_add1 == []:
pass
else:
dict_df = {'基金代码': dl_new_0.list_add1, '基金简称': dl_new_0.list_add2}
a = pd.DataFrame(dict_df)
a.insert(2, '类别', '单只基金')
try:
df = pd.concat([df, a])
except:
df = a
#重排index
l = []
for i in range(len(df)):
l.append(i)
df.index = l
print(df)
def save_fund(self):
global df, dict_save, list_add, dict_sel
self.sf_flag = 0
self.onclick_flag = False
self.tree2.clear()
df = df.drop_duplicates(['基金代码'])
exec('df_'+ str(self.sf_flag) +" = df[['基金代码', '基金简称']]\n"+
'dict_save[dl_new_0.s_text] = df_'+ str(self.sf_flag))
list_add = []
dict_sel = {}
self.plot_tree1()
self.sf_flag += 1
print(dict_save)
def nav_add(self):
global list_feature, list_date1
if self.flag_nav_sel == False:
feature = 'nav_'+ list_date1[0] +'_'+ list_date1[1]
if feature in list_feature:
pass
else:
list_feature.append(feature)
item = QListWidgetItem()
btn = QPushButton('收益率:' +'自' + self.l_nav1.text()
+'\n至' + self.l_nav2.text())
btn.setObjectName(feature)
btn.clicked.connect(self.btn_del)
self.tree4.addItem(item)
self.tree4.setItemWidget(item, btn)
item.setSizeHint(QSize(60,60))
print(list_feature)
else:
self.l_feature1.setText('收益率:' +'自' + self.l_nav1.text()
+'\n\t至' + self.l_nav2.text()
+'\n\t选取' + self.cb_nav.currentText())
self.l_feature1.setObjectName('nav_'+ list_date1[0] +'_'
+ list_date1[1] +'_'+ str(self.cb_nav.currentIndex()))
def turn_add(self):
global list_feature, list_date1
if self.flag_turn_sel == False:
feature = 'turn_'+ self.te_turn.text() +'_'+ str(self.cbx_turn.currentIndex() + 1)
if feature in list_feature:
pass
else:
list_feature.append(feature)
item = QListWidgetItem()
btn = QPushButton('换手率:' + self.te_turn.text()
+'年 ' + self.cbx_turn.currentText())
btn.setObjectName(feature)
btn.clicked.connect(self.btn_del)
self.tree4.addItem(item)
self.tree4.setItemWidget(item, btn)
item.setSizeHint(QSize(60,60))
print(list_feature)
else:
self.l_feature1.setText('换手率:' + self.te_turn.text()
+'年 ' + self.cbx_turn.currentText()
+'\n\t选取' + self.cb_turn.currentText())
self.l_feature1.setObjectName('turn_'+ self.te_turn.text() +'_'
+ str(self.cbx_turn.currentIndex() + 1) +'_'
+ str(self.cb_turn.currentIndex()))
def dd_add(self):
global list_feature, list_date2
if self.flag_dd_sel == False:
feature = 'dd_'+ list_date2[0] +'_'+ list_date2[1]
if feature in list_feature:
pass
else:
list_feature.append(feature)
item = QListWidgetItem()
btn = QPushButton('最大回撤:' +'自' + self.l_dd1.text()
+'\n至' + self.l_dd2.text())
btn.setObjectName(feature)
btn.clicked.connect(self.btn_del)
self.tree4.addItem(item)
self.tree4.setItemWidget(item, btn)
item.setSizeHint(QSize(60,60))
print(list_feature)
else:
self.l_feature1.setText('最大回撤:' +'自' + self.l_dd1.text()
+'\n\t 至' + self.l_dd2.text()
+'\n\t 选取' + self.cb_dd.currentText())
self.l_feature1.setObjectName('dd_'+ list_date2[0] +'_'+ list_date2[1] +'_'
+ str(self.cb_dd.currentIndex()))
def dt_add(self):
global list_feature, list_date1
if self.flag_dt_sel == False:
feature = 'dt_'+ self.te_dt.text() +'_'+ str(self.cbx_dt.currentIndex() + 1)
if feature in list_feature:
pass
else:
list_feature.append(feature)
item = QListWidgetItem()
btn = QPushButton('持股:' + self.te_turn.text()
+'年 ' + self.cbx_turn.currentText())
btn.setObjectName(feature)
btn.clicked.connect(self.btn_del)
self.tree4.addItem(item)
self.tree4.setItemWidget(item, btn)
item.setSizeHint(QSize(60,60))
print(list_feature)
def btn_del(self):
global list_feature
button = self.sender()
list_feature.remove(button.objectName())
row = self.tree4.indexAt(button.pos()).row()
self.tree4.takeItem(row)
print(list_feature)
def calculate(self):
global list_feature, df
#筛选
if self.l_feature1.objectName() == '':
print('pass')
else:
fund_list = list(set(df['基金代码'].tolist()))
fund_code = ','.join(fund_list)
l_flt = self.l_feature1.objectName().split('_')
if l_flt[0] == 'nav':
self.nav_cal(l_flt, flag = True)
elif l_flt[0] == 'turn':
self.turn_cal(l_flt, flag = True)
elif l_flt[0] == 'dd':
self.dd_cal(l_flt, flag = True)
#添加属性
fund_list = list(set(df['基金代码'].tolist()))
fund_code = ','.join(fund_list)
for i in list_feature:
l = i.split('_')
if l[0] == 'nav':
self.nav_cal(l)
elif l[0] == 'turn':
self.turn_cal(l)
elif l[0] == 'dd':
self.dd_cal(l)
elif l[0] == 'dt':
self.dt_cal(l)
#输出图像
def plot_table(self):
global df
model = QtTable(df)
fnt = self.view.font()
fnt.setPointSize(9)
self.view.setFont(fnt)
self.view.setModel(model)
self.view.setWindowTitle('viewer')
self.view.resize(1080, 400)
self.view.show()
def nav_cal(self, l, flag = False):
global df
l_sel = list(set(df['类别'].tolist()))
print(l_sel, l)
df2 = pd.DataFrame(columns = df.columns.tolist())
for i in l_sel:
df_sel = df.loc[df['类别']==i]
fund_list = list(set(df_sel['基金代码'].tolist()))
print(i,len(fund_list))
df_sel['nav_'+ l[1]] = None
df_sel['nav_'+ l[2]] = None
count = int(len(fund_list)/4000) + 1
print(count)
for i in range(count):
print(i)
try:
fund_code = ','.join(fund_list[4000*i : 4000*(i + 1)])
lenth = 4000
print('you')
except:
fund_code = ','.join(fund_list[4000*i :])
lenth = len(fund_list[4000*i :])
print('fuck')
a = w.wsd(fund_code, "nav", l[1], l[1])
print(a)
nav = a.Data[0]
df_sel['nav_'+ l[1]].iloc[4000*i : 4000*i + lenth] = nav
a = w.wsd(fund_code, "nav", l[2], l[2])
nav = a.Data[0]
df_sel['nav_'+ l[2]].iloc[4000*i : 4000*i + lenth] = nav
d1 = datetime.strptime(l[1], '%Y-%m-%d')
d2 = datetime.strptime(l[2], '%Y-%m-%d')
diff = str(d2-d1).split(' ')[0]
df_sel[diff +'日收益率_'+ l[1] +'_'+ l[2]] = (df_sel['nav_'+ l[2]] - df_sel['nav_'+ l[1]])/int(diff)
if flag == True:
if l[-1] == '0':
print('pass')
if l[-1] == '1':
df_sel = df_sel.sort_values(by = [diff +'日收益率_'+ l[1] +'_'+ l[2]], ascending=False)
df_sel = df_sel.iloc[:int(len(df_sel)/100 + 1)]
df2 = pd.concat([df2, df_sel])
df = df2
def turn_cal(self, l, flag = False):
global df
l_sel = list(set(df['类别'].tolist()))
print(l_sel,l)
df2 = pd.DataFrame(columns = df.columns.tolist())
for i in l_sel:
df_sel = df.loc[df['类别']==i]
fund_list = list(set(df_sel['基金代码'].tolist()))
print(i,len(fund_list))
dict_turn = {'1': '上半年', '2': '下半年', '3': '全年'}
df_sel['turn_'+ l[1] +'年'+dict_turn[l[2]]] = None
count = int(len(fund_list)/4000) + 1
for i in range(count):
try:
fund_code = ','.join(fund_list[4000*i : 4000*(i + 1)])
lenth = 4000
except:
fund_code = ','.join(fund_list[4000*i :])
lenth = len(fund_list[4000*i :])
a = w.wsd(fund_code, "style_rpt_turn",
"2020-07-27", "2020-07-27", 'year='+ l[1] +'; Intervaltype='+ l[2])
print(a)
turn = a.Data[0]
print(len(turn))
df_sel['turn_'+ l[1] +'年'+dict_turn[l[2]]].iloc[4000*i : 4000*i + lenth] = turn
if flag == True:
if l[-1] == '0':
print('pass')
if l[-1] == '1':
df_sel = df_sel.sort_values(by = ['turn_'+ l[1] +'年'+dict_turn[l[2]]], ascending=False)
df_sel = df_sel.iloc[:int(len(df_sel)/100 + 1)]
df2 = pd.concat([df2, df_sel])
print(df_sel)
df = df2
print(df)
def dd_cal(self, l, flag = False):
global df
l_sel = list(set(df['类别'].tolist()))
print(l_sel)
df2 = pd.DataFrame(columns = df.columns.tolist())
for i in l_sel:
df_sel = df.loc[df['类别']==i]
fund_list = list(set(df_sel['基金代码'].tolist()))
print(i,len(fund_list))
df_sel['dd'+'_'+ l[1] +'_'+ l[2]] = None
count = int(len(fund_list)/4000) + 1
for i in range(count):
try:
fund_code = ','.join(fund_list[4000*i : 4000*(i + 1)])
lenth = 4000
except:
fund_code = ','.join(fund_list[4000*i :])
lenth = len(fund_list[4000*i :])
a = w.wsd(fund_code, "risk_maxdownside", l[1], l[2])
dd_raw = a.Data
dd = []
for j in dd_raw:
dd.append(j[0])
print(len(df_sel), len(dd))
df_sel['dd'+'_'+ l[1] +'_'+ l[2]].iloc[4000*i : 4000*i + lenth] = dd
if flag == True:
if l[-1] == '0':
print('pass')
if l[-1] == '1':
df_sel = df_sel.sort_values(by = ['dd'+'_'+ l[1] +'_'+ l[2]], ascending=False)
df_sel = df_sel.iloc[:int(len(df_sel)/100 + 1)]
df2 = pd.concat([df2, df_sel])
print(df_sel)
df = df2
print(df)
def dt_cal(self, l, flag = False):
global df
fund_list = list(set(df['基金代码'].tolist()))
dict_date = {'1': '0331',
'2': '0630',
'3': '0930',
'4': '1231'}
date = l[1] + dict_date[l[2]]
d = dt()
data = d.add(fund_list, date)
for i in data.keys():
df[date +'_'+ i] = data[i]
def to_csv(self):
global df
path = dl_new_0.path_text
df.to_csv(path, header=True, index=True, encoding = "gb2312")
print('done')
def feature_clear(self):
global list_feature
self.l_feature1.setObjectName('')
self.l_feature1.setText('')
list_feature = []
print(list_feature)
self.tree4.clear()
if __name__ == "__main__":
import sys
import dl_new_0
app = QApplication(sys.argv)
w2 = window2()
dl1 = dl_new_0.dialog_1()
dl2 = dl_new_0.dialog_2()
dl3 = dl_new_0.dialog_3()
w2.show()
w2.btn_dl.clicked.connect(dl1.show)
w2.btn_feature2.clicked.connect(dl2.show)
w2.btn_feature3.clicked.connect(dl3.show)
dl1.btn2.clicked.connect(w2.dl_add)
dl2.btn.clicked.connect(w2.save_fund)
dl3.btn.clicked.connect(w2.to_csv)
sys.exit(app.exec())
w2_fin,谢谢!
最新推荐文章于 2023-03-13 19:52:25 发布