0
点赞
收藏
分享

微信扫一扫

量化交易之Python篇 - 合并历史平仓 - merge_all_closePositions_holdPositions_period_api.py

禾木瞎写 2023-03-02 阅读 45


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))

举报

相关推荐

0 条评论