import re
import os
import pandas
from tools_part.file_path_operator.file_path_operator import TQZFilePathOperator
from tools_part.split_dataframe_operator.split_dataframe_operator import TQZSplitDataframeOperator
from constants_part.tqz_constant import (
TQZClosePositionsDetailColumnType,
TQZFunctionModuleType,
TQZHoldPositionsPeriodKey,
TQZDefaultKey,
TQZBuySellType
)
class TQZMergeAllClosePositionsHoldPositionsPeriodApi:
__datas_part_fold = TQZFilePathOperator.current_file_grandfather_path(
file=__file__
) + f'/source_datas_part'
@classmethod
def merge_history_closePositions_holdPositions_period_dataframe(cls, account_names):
account_closeHoldPositionsPeriod_dictionary = {}
for datas_part_file in os.listdir(path=cls.__datas_part_fold): # one datas_part_file is one account
account_name = re.search(r'^[a-zA-Z0-9]+', datas_part_file).group()
if account_name not in account_names:
continue
current_account_trade_record_fold = f'{cls.__datas_part_fold}/{datas_part_file}/交易记录'
all_merge_closePositions_holdPositions_period_dataframe = cls.__get_merge_all_closePositions_holdPositions_period_dataframe(
current_account_trade_record_fold=current_account_trade_record_fold
)
account_closeHoldPositionsPeriod_dictionary[account_name] = all_merge_closePositions_holdPositions_period_dataframe
return account_closeHoldPositionsPeriod_dictionary
# --- private part ---
@classmethod
def __get_merge_all_closePositions_holdPositions_period_dataframe(cls, current_account_trade_record_fold):
"""
Get value of merge all-close-positions-hold-positions-period-dataframe
"""
yesterday_hold_positions_dataframe = pandas.DataFrame()
all_merge_closePositions_holdPositions_period_dataframe = cls.__init_all_merge_closePositions_holdPositions_period_dataframe()
for trade_record in os.listdir(path=current_account_trade_record_fold):
trade_record_all_path = f'{current_account_trade_record_fold}/{trade_record}'
print(f'---------------------trade_record: {trade_record}---------------------')
today_open_positions_dataframe, today_hold_positions_dataframe, today_close_positions_dataframe, today_reverse_buySell_close_positions_dataframe = cls.__get_today_open_hold_close_reverseBuySellClose_positions_dataframes(
trade_record_all_path=trade_record_all_path
)
if len(yesterday_hold_positions_dataframe) is 0:
yesterday_hold_positions_dataframe = today_hold_positions_dataframe
yesterday_hold_positions_dataframe[TQZFunctionModuleType.HOLD_POSITION_PERIOD.value] = 0
today_reverse_buySell_close_positions_dataframe[TQZFunctionModuleType.HOLD_POSITION_PERIOD.value] = 0
all_merge_closePositions_holdPositions_period_dataframe = all_merge_closePositions_holdPositions_period_dataframe.append(
today_reverse_buySell_close_positions_dataframe,
ignore_index=True
)
else:
yesterday_hold_positions_dataframe[TQZFunctionModuleType.HOLD_POSITION_PERIOD.value] += 1
# calculate todayClose hold positions period dataframe
todayClose_holdPositions_period_format_dataframe = cls.__calculate_todayClose_hold_positions_period_dataframe(
today_close_positions_dataframe=today_close_positions_dataframe,
yesterday_hold_positions_dataframe=yesterday_hold_positions_dataframe
)
# add hold-positions-period column to today_reverse_buySell_close_positions_period_dataframe
all_merge_closePositions_holdPositions_period_dataframe = cls.__update_all_merge_closePositions_holdPositions_period_dataframe(
todayClose_holdPositions_period_format_dataframe=todayClose_holdPositions_period_format_dataframe,
today_reverse_buySell_close_positions_dataframe=today_reverse_buySell_close_positions_dataframe,
source_all_merge_closePositions_holdPositions_period_dataframe=all_merge_closePositions_holdPositions_period_dataframe
)
# update yesterday hold positions dataframe
yesterday_hold_positions_dataframe = cls.__update_yesterday_hold_positions_dataframe(
today_open_positions_dataframe=today_open_positions_dataframe,
today_hold_positions_dataframe=today_hold_positions_dataframe,
today_close_positions_dataframe=today_close_positions_dataframe,
yesterday_hold_positions_dataframe=yesterday_hold_positions_dataframe
)
return all_merge_closePositions_holdPositions_period_dataframe
@classmethod
def __update_all_merge_closePositions_holdPositions_period_dataframe(cls, todayClose_holdPositions_period_format_dataframe, today_reverse_buySell_close_positions_dataframe, source_all_merge_closePositions_holdPositions_period_dataframe):
"""
update all_merge_closePositions_holdPositions_period_dataframe
"""
todayClose_holdPositions_period_format_dataframe.set_index([
TQZClosePositionsDetailColumnType.CONTRACT.value,
TQZBuySellType.BUY_SELL.value
], inplace=True)
today_reverse_buySell_close_positions_dataframe.set_index([
TQZClosePositionsDetailColumnType.CONTRACT.value,
TQZBuySellType.BUY_SELL.value
], inplace=True)
today_reverse_buySell_close_positions_dataframe[
TQZFunctionModuleType.HOLD_POSITION_PERIOD.value
] = todayClose_holdPositions_period_format_dataframe[
TQZFunctionModuleType.HOLD_POSITION_PERIOD.value
]
today_reverse_buySell_close_positions_dataframe.reset_index(inplace=True)
all_merge_closePositions_holdPositions_period_dataframe = source_all_merge_closePositions_holdPositions_period_dataframe.append(
today_reverse_buySell_close_positions_dataframe,
ignore_index=True
)
return all_merge_closePositions_holdPositions_period_dataframe
@classmethod
def __calculate_todayClose_hold_positions_period_dataframe(cls, today_close_positions_dataframe, yesterday_hold_positions_dataframe):
"""
Calculate today_close_hold_positions_period with today_close_positions_dataframe and yesterday_hold_positions_dataframe
"""
today_close_yesterdayHold_positions_dataframe = pandas.merge(
today_close_positions_dataframe,
yesterday_hold_positions_dataframe,
how=TQZDefaultKey.LEFT.value,
on=[TQZClosePositionsDetailColumnType.CONTRACT.value, TQZClosePositionsDetailColumnType.BUY_SELL.value]
)
today_close_yesterdayHold_positions_dataframe.fillna(0, inplace=True)
today_close_yesterdayHold_positions_dataframe[
TQZHoldPositionsPeriodKey.LOT.value
] = today_close_yesterdayHold_positions_dataframe[
TQZHoldPositionsPeriodKey.LOT_X.value
] - today_close_yesterdayHold_positions_dataframe[
TQZHoldPositionsPeriodKey.LOT_Y.value
]
today_close_yesterdayHold_positions_dataframe.rename(
columns={
TQZHoldPositionsPeriodKey.LOT_X.value: TQZHoldPositionsPeriodKey.TODAY_CLOSE.value,
TQZHoldPositionsPeriodKey.LOT_Y.value: TQZHoldPositionsPeriodKey.YESTERDAY_HOLD.value,
TQZHoldPositionsPeriodKey.LOT.value: TQZHoldPositionsPeriodKey.TODAY_CLOSE_SUB_YESTERDAY_HOLD.value
},
inplace=True
)
today_close_yesterdayHold_positions_dataframe.loc[
today_close_yesterdayHold_positions_dataframe[
TQZHoldPositionsPeriodKey.TODAY_CLOSE_SUB_YESTERDAY_HOLD.value
] <= 0,
TQZFunctionModuleType.HOLD_POSITION_PERIOD.value
] = yesterday_hold_positions_dataframe[
TQZFunctionModuleType.HOLD_POSITION_PERIOD.value
]
today_close_yesterdayHold_positions_dataframe.loc[
today_close_yesterdayHold_positions_dataframe[
TQZHoldPositionsPeriodKey.TODAY_CLOSE_SUB_YESTERDAY_HOLD.value
] >= 0, TQZFunctionModuleType.HOLD_POSITION_PERIOD.value
] = round(
(today_close_yesterdayHold_positions_dataframe[
TQZHoldPositionsPeriodKey.YESTERDAY_HOLD.value
] / today_close_yesterdayHold_positions_dataframe[
TQZHoldPositionsPeriodKey.TODAY_CLOSE.value
]) * yesterday_hold_positions_dataframe[
TQZFunctionModuleType.HOLD_POSITION_PERIOD.value
],
5
)
todayClose_holdPositions_period_format_dataframe = pandas.DataFrame()
todayClose_holdPositions_period_format_dataframe[
TQZClosePositionsDetailColumnType.CONTRACT.value
] = today_close_yesterdayHold_positions_dataframe[
TQZClosePositionsDetailColumnType.CONTRACT.value
]
todayClose_holdPositions_period_format_dataframe[
TQZBuySellType.BUY_SELL.value
] = today_close_yesterdayHold_positions_dataframe[
TQZBuySellType.BUY_SELL.value
]
todayClose_holdPositions_period_format_dataframe[
TQZFunctionModuleType.HOLD_POSITION_PERIOD.value
] = today_close_yesterdayHold_positions_dataframe[
TQZFunctionModuleType.HOLD_POSITION_PERIOD.value
]
todayClose_holdPositions_period_format_dataframe.fillna(0, inplace=True)
todayClose_holdPositions_period_format_dataframe[
TQZFunctionModuleType.HOLD_POSITION_PERIOD.value
] = round(todayClose_holdPositions_period_format_dataframe[TQZFunctionModuleType.HOLD_POSITION_PERIOD.value])
todayClose_holdPositions_period_format_dataframe[
TQZFunctionModuleType.HOLD_POSITION_PERIOD.value
] = todayClose_holdPositions_period_format_dataframe[TQZFunctionModuleType.HOLD_POSITION_PERIOD.value].astype(int)
return todayClose_holdPositions_period_format_dataframe
@classmethod
def __update_yesterday_hold_positions_dataframe(cls, today_open_positions_dataframe, today_hold_positions_dataframe, today_close_positions_dataframe, yesterday_hold_positions_dataframe):
"""
Update yesterday-hold-positions-dataframe.
"""
yesterday_hold_positions_dataframe.set_index([
TQZHoldPositionsPeriodKey.CONTRACT.value,
TQZHoldPositionsPeriodKey.BUY_SELL.value
], inplace=True)
yesterday_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.YESTERDAY_HOLD.value
] = yesterday_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.LOT.value
]
del yesterday_hold_positions_dataframe[TQZHoldPositionsPeriodKey.LOT.value]
today_hold_positions_dataframe.set_index([
TQZHoldPositionsPeriodKey.CONTRACT.value,
TQZHoldPositionsPeriodKey.BUY_SELL.value
], inplace=True)
today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.TODAY_HOLD.value
] = today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.LOT.value
]
del today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.LOT.value
]
today_open_positions_dataframe.set_index([
TQZHoldPositionsPeriodKey.CONTRACT.value,
TQZHoldPositionsPeriodKey.BUY_SELL.value
], inplace=True)
today_close_positions_dataframe.set_index([
TQZHoldPositionsPeriodKey.CONTRACT.value,
TQZHoldPositionsPeriodKey.BUY_SELL.value
], inplace=True)
today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.TODAY_CLOSE.value
] = today_close_positions_dataframe[
TQZHoldPositionsPeriodKey.LOT.value
]
today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.TODAY_OPEN.value
] = today_open_positions_dataframe[
TQZHoldPositionsPeriodKey.LOT.value
]
today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.YESTERDAY_HOLD.value
] = yesterday_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.YESTERDAY_HOLD.value
]
today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.TOTAL_HOLD_POSITION_PERIOD_YESTERDAY.value
] = yesterday_hold_positions_dataframe[
TQZFunctionModuleType.HOLD_POSITION_PERIOD.value
]
today_hold_positions_dataframe.fillna(0, inplace=True)
today_hold_positions_dataframe.loc[
today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.TODAY_CLOSE.value
] >= today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.YESTERDAY_HOLD.value
],
TQZHoldPositionsPeriodKey.YESTERDAY_POSITION.value
] = 0
today_hold_positions_dataframe.loc[
today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.TODAY_CLOSE.value
] >= today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.YESTERDAY_HOLD.value
],
TQZHoldPositionsPeriodKey.TODAY_POSITION.value
] = today_hold_positions_dataframe[TQZHoldPositionsPeriodKey.TODAY_HOLD.value]
today_hold_positions_dataframe.loc[
today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.TODAY_CLOSE.value
] < today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.YESTERDAY_HOLD.value
],
TQZHoldPositionsPeriodKey.YESTERDAY_POSITION.value
] = today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.YESTERDAY_HOLD.value
] - today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.TODAY_CLOSE.value
]
today_hold_positions_dataframe.loc[
today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.TODAY_CLOSE.value
] < today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.YESTERDAY_HOLD.value
],
TQZHoldPositionsPeriodKey.TODAY_POSITION.value
] = today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.TODAY_HOLD.value
] - today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.YESTERDAY_POSITION.value
]
today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.TOTAL_HOLD_POSITION_PERIOD_TODAY.value
] = round(
(today_hold_positions_dataframe[TQZHoldPositionsPeriodKey.YESTERDAY_POSITION.value] /
today_hold_positions_dataframe[TQZHoldPositionsPeriodKey.TODAY_HOLD.value]) *
today_hold_positions_dataframe[TQZHoldPositionsPeriodKey.TOTAL_HOLD_POSITION_PERIOD_YESTERDAY.value],
5
)
today_hold_positions_dataframe.reset_index(inplace=True)
today_hold_positions_format_dataframe = pandas.DataFrame()
today_hold_positions_format_dataframe[
TQZHoldPositionsPeriodKey.CONTRACT.value
] = today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.CONTRACT.value
]
today_hold_positions_format_dataframe[
TQZHoldPositionsPeriodKey.BUY_SELL.value
] = today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.BUY_SELL.value
]
today_hold_positions_format_dataframe[
TQZHoldPositionsPeriodKey.LOT.value
] = today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.TODAY_HOLD.value
]
today_hold_positions_format_dataframe[
TQZFunctionModuleType.HOLD_POSITION_PERIOD.value
] = today_hold_positions_dataframe[
TQZHoldPositionsPeriodKey.TOTAL_HOLD_POSITION_PERIOD_TODAY.value
]
yesterday_hold_positions_dataframe = today_hold_positions_format_dataframe
return yesterday_hold_positions_dataframe
@classmethod
def __get_today_open_hold_close_reverseBuySellClose_positions_dataframes(cls, trade_record_all_path):
"""
Get
today_open_positions_dataframe、
today_hold_positions_dataframe、
today_close_positions_dataframe、
today_reverse_buySell_close_positions_dataframe with trade_record_all_path.
"""
today_open_positions_dataframe = TQZSplitDataframeOperator.get_open_positions_detail_format_dataframe(
trade_record_all_path=trade_record_all_path
)
today_hold_positions_dataframe = TQZSplitDataframeOperator.get_hold_positions_detail_format_dataframe(
trade_record_all_path=trade_record_all_path
)
today_close_positions_dataframe = TQZSplitDataframeOperator.get_close_positions_detail_format_dataframe(
trade_record_all_path=trade_record_all_path
)
today_reverse_buySell_close_positions_dataframe = TQZSplitDataframeOperator.get_reverse_buySell_source_close_positions_detail_dataframe(
trade_record_all_path=trade_record_all_path
)
return today_open_positions_dataframe, today_hold_positions_dataframe, today_close_positions_dataframe, today_reverse_buySell_close_positions_dataframe
@classmethod
def __init_all_merge_closePositions_holdPositions_period_dataframe(cls):
"""
Init all merge close positions hold positions period dataframe.
"""
return pandas.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,
TQZFunctionModuleType.HOLD_POSITION_PERIOD.value
]
)
if __name__ == '__main__':
content_dictionary = TQZMergeAllClosePositionsHoldPositionsPeriodApi.merge_history_closePositions_holdPositions_period_dataframe(account_names=["JHcy0125"])
print("content_dictionary: " + str(content_dictionary))