import os
import pandas
from typing import List
from tools_part.file_path_operator.file_path_operator import TQZFilePathOperator
from tools_part.pandas_operator.pandas_operator import TQZPandas
from constants_part.tqz_constant import (
TQZExcelDataSheetType,
TQZClosePositionsDetailColumnType,
TQZHoldPositionsTotalColumnType,
TQZOpenPositionsTotalColumnType,
TQZBuySellType,
TQZDefaultKey
)
TQZPandas.pre_set()
class TQZSplitDataframeOperator:
__datas_part_fold = TQZFilePathOperator.current_file_grandfather_path(
file=TQZFilePathOperator.father_path(source_path=__file__)
) + f'/source_datas_part'
@classmethod
def get_reverse_buySell_source_close_positions_detail_dataframe(cls, trade_record_all_path):
"""
Api of get reverse buy/sell source close positions detail dataframe.
"""
source_close_positions_detail_dataframe = cls.__get_close_positions_detail_dataframe(
trade_record_all_path=trade_record_all_path
)
only_buy_dataframe = source_close_positions_detail_dataframe.loc[
source_close_positions_detail_dataframe[TQZBuySellType.BUY_SELL.value] == TQZBuySellType.BUY.value
].copy()
only_buy_dataframe.loc[:, TQZBuySellType.BUY_SELL.value] = TQZBuySellType.SELL.value
only_sell_dataframe = source_close_positions_detail_dataframe.loc[
source_close_positions_detail_dataframe[TQZBuySellType.BUY_SELL.value] == TQZBuySellType.SELL.value
].copy()
only_sell_dataframe.loc[:, TQZBuySellType.BUY_SELL.value] = TQZBuySellType.BUY.value
reverse_buySell_profitClose_positions_detail_format_dataframe = only_buy_dataframe.append(only_sell_dataframe)
reverse_buySell_profitClose_positions_detail_format_dataframe.reset_index(inplace=True)
del reverse_buySell_profitClose_positions_detail_format_dataframe[TQZDefaultKey.INDEX.value]
return reverse_buySell_profitClose_positions_detail_format_dataframe
@classmethod
def get_open_positions_detail_format_dataframe(cls, trade_record_all_path):
"""
Api of get open positions detail format dataframe.
"""
merge_open_positions_detail_dataframe = cls.__merge_open_positions_total_dataframe(
trade_record_all_path=trade_record_all_path,
merge_columns_list=[
TQZOpenPositionsTotalColumnType.CONTRACT.value,
TQZOpenPositionsTotalColumnType.BUY_SELL.value
]
)
open_positions_detail_format_dataframe = pandas.DataFrame()
open_positions_detail_format_dataframe[
TQZOpenPositionsTotalColumnType.CONTRACT.value
] = merge_open_positions_detail_dataframe[
TQZOpenPositionsTotalColumnType.CONTRACT.value
]
open_positions_detail_format_dataframe[
TQZBuySellType.BUY_SELL.value
] = merge_open_positions_detail_dataframe[
TQZBuySellType.BUY_SELL.value
]
open_positions_detail_format_dataframe[
TQZOpenPositionsTotalColumnType.LOT.value
] = merge_open_positions_detail_dataframe[
TQZOpenPositionsTotalColumnType.LOT.value
]
return open_positions_detail_format_dataframe
@classmethod
def get_hold_positions_detail_format_dataframe(cls, trade_record_all_path):
"""
Api of get hold positions detail format dataframe.
"""
hold_positions_total_dataframe = cls.__get_hold_positions_total_dataframe(
trade_record_all_path=trade_record_all_path
)
buy_hold_positions_total_dataframe = hold_positions_total_dataframe.drop(
hold_positions_total_dataframe[
hold_positions_total_dataframe[TQZHoldPositionsTotalColumnType.BUY_HOLD_POSITION.value] == 0
].index,
inplace=False
)
buy_hold_positions_total_dataframe[TQZBuySellType.BUY_SELL.value] = TQZBuySellType.BUY.value
buy_hold_positions_total_format_dataframe = pandas.DataFrame()
buy_hold_positions_total_format_dataframe[
TQZHoldPositionsTotalColumnType.CONTRACT.value
] = buy_hold_positions_total_dataframe[
TQZHoldPositionsTotalColumnType.CONTRACT.value
]
buy_hold_positions_total_format_dataframe[
TQZBuySellType.BUY_SELL.value
] = buy_hold_positions_total_dataframe[
TQZBuySellType.BUY_SELL.value
]
buy_hold_positions_total_format_dataframe[
TQZClosePositionsDetailColumnType.LOT.value
] = buy_hold_positions_total_dataframe[
TQZHoldPositionsTotalColumnType.BUY_HOLD_POSITION.value
]
sell_hold_positions_total_dataframe = hold_positions_total_dataframe.drop(
hold_positions_total_dataframe[
hold_positions_total_dataframe[TQZHoldPositionsTotalColumnType.SELL_HOLD_POSITION.value] == 0
].index,
inplace=False
)
sell_hold_positions_total_dataframe[TQZBuySellType.BUY_SELL.value] = TQZBuySellType.SELL.value
sell_hold_positions_total_format_dataframe = pandas.DataFrame()
sell_hold_positions_total_format_dataframe[
TQZHoldPositionsTotalColumnType.CONTRACT.value
] = sell_hold_positions_total_dataframe[
TQZHoldPositionsTotalColumnType.CONTRACT.value
]
sell_hold_positions_total_format_dataframe[
TQZBuySellType.BUY_SELL.value
] = sell_hold_positions_total_dataframe[
TQZBuySellType.BUY_SELL.value
]
sell_hold_positions_total_format_dataframe[
TQZClosePositionsDetailColumnType.LOT.value
] = sell_hold_positions_total_dataframe[
TQZHoldPositionsTotalColumnType.SELL_HOLD_POSITION.value
]
format_hold_positions_dataframe = buy_hold_positions_total_format_dataframe.merge(
sell_hold_positions_total_format_dataframe,
how='outer'
)
format_hold_positions_dataframe[
TQZClosePositionsDetailColumnType.LOT.value
] = format_hold_positions_dataframe[
TQZClosePositionsDetailColumnType.LOT.value
].astype(int)
return format_hold_positions_dataframe
@classmethod
def get_close_positions_detail_format_dataframe(cls, trade_record_all_path):
"""
Api of get close positions detail format dataframe.
"""
merge_close_positions_detail_dataframe = cls.__merge_close_positions_detail_dataframe(
trade_record_all_path=trade_record_all_path,
merge_columns_list=[
TQZClosePositionsDetailColumnType.CONTRACT.value,
TQZClosePositionsDetailColumnType.BUY_SELL.value
]
)
close_positions_detail_format_dataframe = pandas.DataFrame()
close_positions_detail_format_dataframe[
TQZClosePositionsDetailColumnType.CONTRACT.value
] = merge_close_positions_detail_dataframe[
TQZClosePositionsDetailColumnType.CONTRACT.value
]
close_positions_detail_format_dataframe[
TQZClosePositionsDetailColumnType.BUY_SELL.value
] = merge_close_positions_detail_dataframe[
TQZClosePositionsDetailColumnType.BUY_SELL.value
]
close_positions_detail_format_dataframe[
TQZClosePositionsDetailColumnType.LOT.value
] = merge_close_positions_detail_dataframe[
TQZClosePositionsDetailColumnType.LOT.value
]
# exchange buy & sell on 'buy/sell' column
only_buy_dataframe = close_positions_detail_format_dataframe.loc[
close_positions_detail_format_dataframe[TQZBuySellType.BUY_SELL.value] == TQZBuySellType.BUY.value
].copy()
only_buy_dataframe.loc[:, TQZBuySellType.BUY_SELL.value] = TQZBuySellType.SELL.value
only_sell_dataframe = close_positions_detail_format_dataframe.loc[
close_positions_detail_format_dataframe[TQZBuySellType.BUY_SELL.value] == TQZBuySellType.SELL.value
].copy()
only_sell_dataframe.loc[:, TQZBuySellType.BUY_SELL.value] = TQZBuySellType.BUY.value
reverse_buySell_profitClose_positions_detail_format_dataframe = only_buy_dataframe.append(only_sell_dataframe)
reverse_buySell_profitClose_positions_detail_format_dataframe.reset_index(inplace=True)
del reverse_buySell_profitClose_positions_detail_format_dataframe[TQZDefaultKey.INDEX.value]
return reverse_buySell_profitClose_positions_detail_format_dataframe
@classmethod
def get_profitClose_positions_detail_format_dataframe(cls, trade_record_all_path):
"""
Api of get profit close positions detail format dataframe.
"""
merge_profitClose_positions_detail_dataframe = cls.__merge_profitClose_positions_detail_dataframe(
trade_record_all_path=trade_record_all_path,
merge_columns_list=[
TQZClosePositionsDetailColumnType.CONTRACT.value,
TQZClosePositionsDetailColumnType.BUY_SELL.value
]
)
profitClose_positions_detail_format_dataframe = pandas.DataFrame()
profitClose_positions_detail_format_dataframe[
TQZClosePositionsDetailColumnType.CONTRACT.value
] = merge_profitClose_positions_detail_dataframe[
TQZClosePositionsDetailColumnType.CONTRACT.value
]
profitClose_positions_detail_format_dataframe[
TQZClosePositionsDetailColumnType.BUY_SELL.value
] = merge_profitClose_positions_detail_dataframe[
TQZClosePositionsDetailColumnType.BUY_SELL.value
]
profitClose_positions_detail_format_dataframe[
TQZClosePositionsDetailColumnType.LOT.value
] = merge_profitClose_positions_detail_dataframe[
TQZClosePositionsDetailColumnType.LOT.value
]
# exchange buy & sell on 'buy/sell' column
only_buy_dataframe = profitClose_positions_detail_format_dataframe.loc[
profitClose_positions_detail_format_dataframe[TQZBuySellType.BUY_SELL.value] == TQZBuySellType.BUY.value
].copy()
only_buy_dataframe.loc[:, TQZBuySellType.BUY_SELL.value] = TQZBuySellType.SELL.value
only_sell_dataframe = profitClose_positions_detail_format_dataframe.loc[
profitClose_positions_detail_format_dataframe[TQZBuySellType.BUY_SELL.value] == TQZBuySellType.SELL.value
].copy()
only_sell_dataframe.loc[:, TQZBuySellType.BUY_SELL.value] = TQZBuySellType.BUY.value
reverse_buySell_profitClose_positions_detail_format_dataframe = only_buy_dataframe.append(only_sell_dataframe)
reverse_buySell_profitClose_positions_detail_format_dataframe.reset_index(inplace=True)
del reverse_buySell_profitClose_positions_detail_format_dataframe[TQZDefaultKey.INDEX.value]
return reverse_buySell_profitClose_positions_detail_format_dataframe
@classmethod
def get_lossClose_positions_detail_format_dataframe(cls, trade_record_all_path):
"""
Api of get loss close positions detail format dataframe.
"""
merge_lossClose_positions_detail_dataframe = cls.__merge_lossClose_positions_detail_dataframe(
trade_record_all_path=trade_record_all_path,
merge_columns_list=[
TQZClosePositionsDetailColumnType.CONTRACT.value,
TQZClosePositionsDetailColumnType.BUY_SELL.value
]
)
lossClose_positions_detail_format_dataframe = pandas.DataFrame()
lossClose_positions_detail_format_dataframe[
TQZClosePositionsDetailColumnType.CONTRACT.value
] = merge_lossClose_positions_detail_dataframe[
TQZClosePositionsDetailColumnType.CONTRACT.value
]
lossClose_positions_detail_format_dataframe[
TQZClosePositionsDetailColumnType.BUY_SELL.value
] = merge_lossClose_positions_detail_dataframe[
TQZClosePositionsDetailColumnType.BUY_SELL.value
]
lossClose_positions_detail_format_dataframe[
TQZClosePositionsDetailColumnType.LOT.value
] = merge_lossClose_positions_detail_dataframe[
TQZClosePositionsDetailColumnType.LOT.value
]
# exchange buy & sell on 'buy/sell' column
only_buy_dataframe = lossClose_positions_detail_format_dataframe.loc[
lossClose_positions_detail_format_dataframe[TQZBuySellType.BUY_SELL.value] == TQZBuySellType.BUY.value
].copy()
only_buy_dataframe.loc[:, TQZBuySellType.BUY_SELL.value] = TQZBuySellType.SELL.value
only_sell_dataframe = lossClose_positions_detail_format_dataframe.loc[
lossClose_positions_detail_format_dataframe[TQZBuySellType.BUY_SELL.value] == TQZBuySellType.SELL.value
].copy()
only_sell_dataframe.loc[:, TQZBuySellType.BUY_SELL.value] = TQZBuySellType.BUY.value
reverse_buySell_lossClose_positions_detail_format_dataframe = only_buy_dataframe.append(only_sell_dataframe)
reverse_buySell_lossClose_positions_detail_format_dataframe.reset_index(inplace=True)
del reverse_buySell_lossClose_positions_detail_format_dataframe[TQZDefaultKey.INDEX.value]
return reverse_buySell_lossClose_positions_detail_format_dataframe
# --- private part ---
@classmethod
def __merge_open_positions_total_dataframe(cls, trade_record_all_path, merge_columns_list: List):
"""
merge open positions total dataframe in columns.
"""
open_positions_detail_dataframe = cls.__get_open_positions_detail_dataframe(
trade_record_all_path=trade_record_all_path
)
merge_open_positions_detail_dataframe = open_positions_detail_dataframe.groupby(merge_columns_list).sum()
merge_open_positions_detail_dataframe.reset_index(inplace=True)
if merge_open_positions_detail_dataframe.empty is True:
merge_open_positions_detail_dataframe = open_positions_detail_dataframe
return merge_open_positions_detail_dataframe
@classmethod
def __merge_profitClose_positions_detail_dataframe(cls, trade_record_all_path, merge_columns_list: List):
"""
merge profit close positions detail dataframe in columns.
"""
profitClose_positions_detail_dataframe = cls.__get_profitClose_positions_detail_dataframe(
trade_record_all_path=trade_record_all_path
)
merge_profitClose_positions_detail_dataframe = profitClose_positions_detail_dataframe.groupby(merge_columns_list).sum()
merge_profitClose_positions_detail_dataframe.reset_index(inplace=True)
if merge_profitClose_positions_detail_dataframe.empty is True:
merge_profitClose_positions_detail_dataframe = profitClose_positions_detail_dataframe
return merge_profitClose_positions_detail_dataframe
@classmethod
def __merge_lossClose_positions_detail_dataframe(cls, trade_record_all_path, merge_columns_list: List):
"""
merge loss close positions detail dataframe in columns.
"""
lossClose_positions_detail_dataframe = cls.__get_lossClose_positions_detail_dataframe(
trade_record_all_path=trade_record_all_path
)
merge_lossClose_positions_detail_dataframe = lossClose_positions_detail_dataframe.groupby(merge_columns_list).sum()
merge_lossClose_positions_detail_dataframe.reset_index(inplace=True)
if merge_lossClose_positions_detail_dataframe.empty is True:
merge_lossClose_positions_detail_dataframe = lossClose_positions_detail_dataframe
return merge_lossClose_positions_detail_dataframe
@classmethod
def __merge_close_positions_detail_dataframe(cls, trade_record_all_path, merge_columns_list: List):
"""
merge close positions detail dataframe in columns.
"""
profitClose_positions_detail_dataframe = cls.__get_close_positions_detail_dataframe(
trade_record_all_path=trade_record_all_path
)
merge_profitClose_positions_detail_dataframe = profitClose_positions_detail_dataframe.groupby(
merge_columns_list).sum()
merge_profitClose_positions_detail_dataframe.reset_index(inplace=True)
if merge_profitClose_positions_detail_dataframe.empty is True:
merge_profitClose_positions_detail_dataframe = profitClose_positions_detail_dataframe
return merge_profitClose_positions_detail_dataframe
@classmethod
def __get_open_positions_detail_dataframe(cls, trade_record_all_path):
"""
Get open positions detail dataframe.
"""
deal_detail_sheet_dataframe = pandas.read_excel(
io=trade_record_all_path,
sheet_name=TQZExcelDataSheetType.DEAL_DETAIL.value
)
nan_list = list(deal_detail_sheet_dataframe.index[deal_detail_sheet_dataframe.isnull().all(axis=1)])
nan_list.append(len(deal_detail_sheet_dataframe) + 1)
del nan_list[0]
open_positions_detail_dataframe = deal_detail_sheet_dataframe.loc[nan_list[1] + 1:nan_list[2] - 1, :].dropna(
axis=1,
how='all',
inplace=False
)
open_positions_detail_dataframe.dropna(axis=0, inplace=True)
open_positions_detail_dataframe.drop(open_positions_detail_dataframe.index[0], inplace=True)
open_positions_detail_dataframe.reset_index(inplace=True)
del open_positions_detail_dataframe[TQZDefaultKey.INDEX.value]
open_positions_detail_dataframe.columns = [
TQZOpenPositionsTotalColumnType.CONTRACT.value,
TQZOpenPositionsTotalColumnType.DEAL_NUMBER.value,
TQZOpenPositionsTotalColumnType.DEAL_TIME.value,
TQZOpenPositionsTotalColumnType.BUY_SELL.value,
TQZOpenPositionsTotalColumnType.SPECULATE_HEDGING.value,
TQZOpenPositionsTotalColumnType.DEAL_PRICE.value,
TQZOpenPositionsTotalColumnType.LOT.value,
TQZOpenPositionsTotalColumnType.DEAL_VOLUME.value,
TQZOpenPositionsTotalColumnType.OPEN_CLOSE.value,
TQZOpenPositionsTotalColumnType.FEE.value,
TQZOpenPositionsTotalColumnType.CLOSE_POSITION_PROFIT_LOSS.value,
TQZOpenPositionsTotalColumnType.FUND_ACCOUNT_SEND_NUMBER.value,
TQZOpenPositionsTotalColumnType.DEAL_DATE.value,
TQZOpenPositionsTotalColumnType.EXCHANGE.value,
TQZOpenPositionsTotalColumnType.OPTION_PRICE_INCOME_AND_EXPENSES.value,
TQZOpenPositionsTotalColumnType.FUND_ACCOUNT_DEAL_NUMBER.value,
]
return open_positions_detail_dataframe[open_positions_detail_dataframe[TQZOpenPositionsTotalColumnType.OPEN_CLOSE.value] == "开仓"]
@classmethod
def __get_hold_positions_total_dataframe(cls, trade_record_all_path):
"""
Get hold positions total dataframe.
"""
hold_positions_total_sheet_dataframe = pandas.read_excel(
io=trade_record_all_path,
sheet_name=TQZExcelDataSheetType.FUND_STATE.value
)
nan_list = list(hold_positions_total_sheet_dataframe.index[hold_positions_total_sheet_dataframe.isnull().all(axis=1)])
nan_list.append(len(hold_positions_total_sheet_dataframe) + 1)
del nan_list[0]
hold_positions_total_sheet_dataframe = hold_positions_total_sheet_dataframe.loc[nan_list[4] + 1:nan_list[5] - 1, :].dropna(
axis=1,
how='all',
inplace=False
)
hold_positions_total_sheet_dataframe.dropna(axis=0, inplace=True)
hold_positions_total_sheet_dataframe.drop(hold_positions_total_sheet_dataframe.index[0], inplace=True)
hold_positions_total_sheet_dataframe.reset_index(inplace=True)
del hold_positions_total_sheet_dataframe[TQZDefaultKey.INDEX.value]
hold_positions_total_sheet_dataframe.columns = [
TQZHoldPositionsTotalColumnType.NUMBER.value,
TQZHoldPositionsTotalColumnType.CONTRACT.value,
TQZHoldPositionsTotalColumnType.BUY_HOLD_POSITION.value,
TQZHoldPositionsTotalColumnType.BUY_MEAN_PRICE.value,
TQZHoldPositionsTotalColumnType.SELL_HOLD_POSITION.value,
TQZHoldPositionsTotalColumnType.SELL_MEAN_PRICE.value,
TQZHoldPositionsTotalColumnType.YESTERDAY_SETTLE_PRICE.value,
TQZHoldPositionsTotalColumnType.TODAY_SETTLE_PRICE.value,
TQZHoldPositionsTotalColumnType.FLOAT_PROFIT_LOSS.value,
TQZHoldPositionsTotalColumnType.TRADE_DEPOSIT.value,
TQZHoldPositionsTotalColumnType.SPECULATE_HEDGING.value,
TQZHoldPositionsTotalColumnType.HOLD_POSITION_MARKET_VALUE.value,
TQZHoldPositionsTotalColumnType.EXCHANGE.value,
TQZHoldPositionsTotalColumnType.BUY_OPTION_MARKET.value,
TQZHoldPositionsTotalColumnType.SELL_OPTION_MARKET.value,
]
return hold_positions_total_sheet_dataframe
@classmethod
def __get_close_positions_detail_dataframe(cls, trade_record_all_path):
"""
Get close positions detail dataframe.
"""
close_positions_detail_sheet_dataframe = pandas.read_excel(
io=trade_record_all_path,
sheet_name=TQZExcelDataSheetType.CLOSE_POSITION_DETAIL.value
)
nan_list = list(close_positions_detail_sheet_dataframe.index[close_positions_detail_sheet_dataframe.isnull().all(axis=1)])
nan_list.append(len(close_positions_detail_sheet_dataframe) + 1)
del nan_list[0]
close_positions_detail_dataframe = close_positions_detail_sheet_dataframe.loc[nan_list[1] + 1:nan_list[2] - 1, :].dropna(
axis=1,
how='all',
inplace=False
)
close_positions_detail_dataframe.dropna(axis=0, inplace=True)
close_positions_detail_dataframe.drop(close_positions_detail_dataframe.index[0], inplace=True)
close_positions_detail_dataframe.reset_index(inplace=True)
del close_positions_detail_dataframe[TQZDefaultKey.INDEX.value]
close_positions_detail_dataframe.columns = [
TQZClosePositionsDetailColumnType.CONTRACT.value,
TQZClosePositionsDetailColumnType.BUY_SELL.value,
TQZClosePositionsDetailColumnType.DEAL_PRICE.value,
TQZClosePositionsDetailColumnType.OPEN_POSITION_PRICE.value,
TQZClosePositionsDetailColumnType.LOT.value,
TQZClosePositionsDetailColumnType.YESTERDAY_SETTLEMENT_PRICE.value,
TQZClosePositionsDetailColumnType.CLOSE_POSITION_PROFIT_LOSS.value,
TQZClosePositionsDetailColumnType.EXCHANGE.value,
TQZClosePositionsDetailColumnType.OPTION_PRICE_INCOME_AND_EXPENSES.value
]
return close_positions_detail_dataframe
@classmethod
def __get_lossClose_positions_detail_dataframe(cls, trade_record_all_path):
"""
Get loss close position detail dataframe.
"""
close_positions_detail_dataframe = cls.__get_close_positions_detail_dataframe(
trade_record_all_path=trade_record_all_path
)
return close_positions_detail_dataframe[
close_positions_detail_dataframe[TQZClosePositionsDetailColumnType.CLOSE_POSITION_PROFIT_LOSS.value] < 0
]
@classmethod
def __get_profitClose_positions_detail_dataframe(cls, trade_record_all_path):
"""
Get profit close position detail dataframe.
"""
close_positions_detail_dataframe = cls.__get_close_positions_detail_dataframe(
trade_record_all_path=trade_record_all_path
)
return close_positions_detail_dataframe[
close_positions_detail_dataframe[TQZClosePositionsDetailColumnType.CLOSE_POSITION_PROFIT_LOSS.value] > 0
]
@classmethod
def __to_excel(cls, dataframe, excel_path, sheet_name, freeze_panes=(1, 0), empty_others=False):
"""
Write dataframe to excel.
"""
if empty_others is True:
current_father_path = TQZFilePathOperator.father_path(source_path=excel_path)
for file_name in os.listdir(current_father_path):
os.remove(path=current_father_path + f'/{file_name}')
excel_writer = pandas.ExcelWriter(path=excel_path)
dataframe.to_excel(excel_writer, sheet_name=sheet_name, index=False, freeze_panes=freeze_panes)
excel_writer.save()
量化交易之Python篇 - 持仓周期算法(pandas) - split_dataframe_operator.py
最新推荐文章于 2022-05-26 16:07:36 发布