PyQt入门之股票收益计算

# -*- coding:utf-8 -*-

"""
@Author:        [email protected]
@Create Date:   2018-03-29
@Update Data:   2018-03-29
@Version:       V0.1.20180329
"""

import sys
import time
import logging
import datetime
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

import tushare as ts

INTEREST = 0.0704
LOGGING_LEVEL = logging.INFO


def logging_config(logging_level):
    # log_format = "[line: %(lineno)d] - %(levelname)s - %(message)s"
    # log_format = "%(asctime)s - %(levelname)s - %(message)s"
    # log_format = "%(asctime)s [line: %(lineno)d] - %(levelname)s - %(message)s"
    log_format = "[File: %(filename)s line: %(lineno)d] - %(levelname)s - %(message)s"
    logging.basicConfig(level=logging_level, format=log_format)


class StockCalcClass(QWidget):
    def __init__(self, parent=None):
        super(StockCalcClass, self).__init__(parent)

        self.setWindowTitle('StockCalc')

        font = QFont()
        font.setWeight(75)
        font.setBold(True)

        # vbox_layv = QVBoxLayout()
        grid_layv = QGridLayout()

        # grid_layv.setSpacing(10)

        # stock number
        lbl_stock_num = QLabel('Stock Number: ', self)
        lbl_stock_num.setFont(font)
        grid_layv.addWidget(lbl_stock_num, 0, 0)

        # stock number
        self.edt_stock_num = QLineEdit('10000', self)
        grid_layv.addWidget(self.edt_stock_num, 0, 1)

        # the price of record date
        lbl_record_price = QLabel('Record Price: ', self)
        lbl_record_price.setFont(font)
        grid_layv.addWidget(lbl_record_price, 1, 0)

        # the price of record date
        self.edt_record_price = QLineEdit('48.04', self)
        grid_layv.addWidget(self.edt_record_price, 1, 1)

        # the price of open date
        lbl_open_price = QLabel('Open Price: ', self)
        lbl_open_price.setFont(font)
        grid_layv.addWidget(lbl_open_price, 2, 0)

        # the price of open date
        self.edt_open_price = QLineEdit('48.04', self)
        grid_layv.addWidget(self.edt_open_price, 2, 1)

        # the price of open date
        lbl_calc_result = QLabel('Calc Result: ', self)
        lbl_calc_result.setFont(font)
        grid_layv.addWidget(lbl_calc_result, 3, 0)

        # the price of open date
        self.tb_calc_result = QTextBrowser()
        grid_layv.addWidget(self.tb_calc_result, 3, 1, 1, 120)

        # get current price
        bt_price = QPushButton('Get Price', self)
        bt_price.clicked.connect(self.get_price)
        grid_layv.addWidget(bt_price, 4, 0)

        # calc result
        bt_calc = QPushButton('Calc', self)
        bt_calc.clicked.connect(self.calc_result)
        grid_layv.addWidget(bt_calc, 4, 1)

        # grid_layv.setColumnStretch(1, 10)
        # self.setGeometry(300, 300, 250, 150)

        # vbox_layv.addLayout(grid_layv)

        self.setLayout(grid_layv)

    def calc_result(self):
        percent_list = [0.22, 0.24, 0.26, 0.28]

        total_income = 0
        stock_number = int(self.edt_stock_num.text())
        record_price = float(self.edt_record_price.text())
        open_price = float(self.edt_open_price.text())

        self.tb_calc_result.clear()

        print('stock number: {}, current price: {}, open price: {}'.format(stock_number, record_price, open_price))
        self.tb_calc_result.append('stock number: {}, current price: {}, open price: {}'.
                                   format(stock_number, record_price, open_price))

        for percent in percent_list:
            income_val = calc_sale_income(stock_number, percent, open_price)
            interest_val = calc_interest(stock_number, percent_list.index(percent))
            tax_val = calc_tax(stock_number, percent, record_price, open_price)
            total_income += income_val - interest_val - tax_val

            # logging.info('For the {} year, Sale Income: {:,.2f}, Principal & Interest: {:,.2f}, Income Tax: {:,.2f}, '
            #              'Net Income: {:,.2f}'.format(percent_list.index(percent) + 1, income_val, interest_val,
            #                                           tax_val, income_val - interest_val - tax_val))

            print('For the {} year, Sale Income: {:,.2f}, Principal & Interest: {:,.2f}, Income Tax: {:,.2f}, '
                  'Net Income: {:,.2f}'.format(percent_list.index(percent) + 1, income_val, interest_val, tax_val,
                                               income_val - interest_val - tax_val))

            self.tb_calc_result.append('For the {} year, Sale Income: {:,.2f}, Principal & Interest: {:,.2f}, '
                                       'Income Tax: {:,.2f}, Net Income: {:,.2f}'.
                                       format(percent_list.index(percent) + 1, income_val, interest_val, tax_val,
                                              income_val - interest_val - tax_val))

        print('Total Income: {:,.2f}'.format(total_income))
        self.tb_calc_result.append('Total Income: {:,.2f}'.format(total_income))

    def get_price(self):
        price_df = ts.get_realtime_quotes('603160')
        self.edt_record_price.setText(str(float(price_df.iloc[0, list(price_df.columns).index('price')])))
        self.edt_open_price.setText(str(float(price_df.iloc[0, list(price_df.columns).index('price')])))


def get_all_input_info():
    stock_number = int(input('Please input the stock number: '))
    # record_price = float(input('Please input the price of record day: '))
    open_price = float(input('Please input the price of open day: '))

    # return stock_number, record_price, open_price
    return stock_number, open_price


def calc_tax(stock_number, percent, record_price, open_price):
    total_increase_per_month = ((record_price + open_price) / 2 * stock_number * percent -
                                stock_number * 48.04 * percent) / 12
    tax_percent = 0
    sub_number = 0

    if 0 < total_increase_per_month <= 1500:
        tax_percent = 0.03
        sub_number = 0
    elif 1500 < total_increase_per_month <= 4500:
        tax_percent = 0.10
        sub_number = 105
    elif 4500 < total_increase_per_month <= 9000:
        tax_percent = 0.2
        sub_number = 555
    elif 9000 < total_increase_per_month <= 35000:
        tax_percent = 0.25
        sub_number = 1005
    elif 35000 < total_increase_per_month <= 55000:
        tax_percent = 0.30
        sub_number = 2755
    elif 55000 < total_increase_per_month <= 80000:
        tax_percent = 0.35
        sub_number = 5505
    elif 80000 < total_increase_per_month:
        tax_percent = 0.45
        sub_number = 13505

    logging.debug('total_increase_per_month: {}, tax_percent: {}, sub_number: {}'.
                  format(total_increase_per_month, tax_percent, sub_number))
    tax = (total_increase_per_month * tax_percent - sub_number) * 12

    return tax


def calc_interest(stock_number, index):
    capital = 0
    interest = 0

    if 0 == index:
        capital = stock_number * 48.04
        interest = stock_number * 48.04 * 0.22
    elif 1 == index:
        capital = stock_number * 48.04 * (1 - 0.22)
        interest = stock_number * 48.04 * 0.24
    elif 2 == index:
        capital = stock_number * 48.04 * (1 - 0.22 - 0.24)
        interest = stock_number * 48.04 * 0.26
    elif 3 == index:
        capital = stock_number * 48.04 * (1 - 0.22 - 0.24 - 0.26)
        interest = stock_number * 48.04 * 0.28

    interest_val = capital * INTEREST + interest

    return interest_val


def calc_sale_income(stock_number, percent, open_price):
    logging.debug('stock_number: {}, percent: {}, open_price: {}'.format(stock_number, percent, open_price))
    income_val = stock_number * percent * open_price * (1 - 0.001)

    return income_val


def main(argv):
    logging_config(LOGGING_LEVEL)
    '''
    price_df = ts.get_realtime_quotes('603160')
    current_price = float(price_df.iloc[0, list(price_df.columns).index('price')])

    stock_base_info = get_all_input_info()

    # base_info = (10000, current_price, current_price)
    base_info = (stock_base_info[0], current_price, stock_base_info[1])

    percent_list = [0.22, 0.24, 0.26, 0.28]
    total_income = 0

    print('stock number: {}, current price: {}, open price: {}'.format(base_info[0], base_info[1], base_info[2]))

    for percent in percent_list:
        income_val = calc_sale_income(base_info[0], percent, base_info[2])
        interest_val = calc_interest(base_info[0], percent_list.index(percent))
        tax_val = calc_tax(base_info[0], percent, base_info[1], base_info[2])
        total_income += income_val - interest_val - tax_val

        # logging.info('For the {} year, Sale Income: {:,.2f}, Principal & Interest: {:,.2f}, Income Tax: {:,.2f}, '
        #              'Net Income: {:,.2f}'.format(percent_list.index(percent) + 1, income_val, interest_val, tax_val,
        #                                           income_val - interest_val - tax_val))
        print('For the {} year, Sale Income: {:,.2f}, Principal & Interest: {:,.2f}, Income Tax: {:,.2f}, '
              'Net Income: {:,.2f}'.format(percent_list.index(percent) + 1, income_val, interest_val, tax_val,
                                           income_val - interest_val - tax_val))

    print('Total Income: {:,.2f}'.format(total_income))
    '''

    app = QApplication(argv)
    ex = StockCalcClass()
    ex.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    print("Script start execution at %s\n\n" % str(datetime.datetime.now()))
    time_start = time.time()
    main(sys.argv)
    print("\n\nScript end execution at %s" % str(datetime.datetime.now()))
    print("Total Elapsed Time: %s seconds\n" % (time.time() - time_start))

results matching ""

    No results matching ""