量化交易之Python篇 - 持仓周期算法(pandas) - split_dataframe_operator.py

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
## 讲师介绍: 近 5 年个人投资理财年化收益平均超 25%。如果你也想提升自己的睡后收入,轻松赚钱,那么这门课就是为你量身打造。课程基于一个完整真实的量化交易业务来讲授,并融入老师的理财经验以及使用编程技术辅助投资的技巧,让你面对各种复杂投资情况也能做到游刃有余。 ## 学习目标: 从不懂“理财”开始到实现自动交易,成为一个“技术流”理财高手 编程技术 + 核心量化策略 + 交易系统开发 + 讲师经验分享,学会用技术辅助理财 本课程从最基础的什么是量化开始讲起,即使对投资理财不了解同样可以学习,轻松入门无压力。 从如何获取数据开始,到实现实盘交易,课程对量化交易的每一步都进行细致讲解,为你铺开量化交易的每一个细节。 不仅仅只是教你学会使用某种工具,更会教给你量化交易的投资思想,让你面对各种情况都游刃有余。 ## 课程亮点: 设计适合自己并能适应市场的交易策略,才是量化交易的灵魂 课程亲手带你设计并实现两种交易策略,快速培养你的策略思维能力 1. 择时策略:通过这个策略学会如何利用均线,创建择时策略,优化股票买入卖出的时间点。2. 选股策略:掌握选股策略的核心逻辑,并基于收益率创建动量选股策略,并验证其有效性。 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 第三方平台大而全,不易扩展,效率还差,信息安全也是大问题,打造自己的交易平台才是更优解

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值