ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

量化交易之vnpy篇 - 主力合约换月 - 拉取当前主力合约数据 (天勤)

2021-07-23 16:00:18  阅读:509  来源: 互联网

标签:vnpy contracts self dataframe 拉取 symbols vt main 合约


class TQZTqClient:
    """
    Client for querying main future contracts of current market from Tianqin.
    """

    def __init__(self, account_name, account_password):
        """
        init api with account_name & account_password
        """

        self.main_vt_symbols = []
        self.tq_api = TqApi(TqKq(), auth=f'{account_name},{account_password}')

    def load_main_contracts(self, ins_class):
        """
        Load main contracts from TqSdk
        """

        try:
            tq_main_contracts = self.tq_api.query_quotes(ins_class=ins_class)

            [self.main_vt_symbols.append(
                self.__get_vt_symbol(
                    tq_symbol=self.tq_api.get_quote(symbol=main_contract).underlying_symbol
                )
            ) for main_contract in tq_main_contracts]

        except:
            pass

        finally:
            print("主力合约数据收取完成")
            print("self.main_vt_symbols: " + str(self.main_vt_symbols))
            self.__create_main_contracts(current_main_vt_symbols=self.main_vt_symbols)
            self.tq_api.close()


    # --- private part ---
    def __update_today_main_contracts(self, market_main_vt_symbols):
        """
        Update main contracts of current day to excel
        """
        TQZMainContractsChangeFilePath.ensure_mainContractsFold_is_exist()

        market_main_vt_symbols = sorted(market_main_vt_symbols)

        if os.path.exists(path=TQZMainContractsChangeFilePath.main_contracts_excel()) is False:
            self.__create_main_contracts(current_main_vt_symbols=market_main_vt_symbols)
        else:
            pre_main_contracts_dataframe = self.__init_pre_main_contracts_dataframe(market_main_vt_symbols=market_main_vt_symbols)

            today_main_contracts_dataframe = self.__init_today_main_contracts_dataframe(
                market_main_vt_symbols=market_main_vt_symbols,
                pre_main_contracts_dataframe=pre_main_contracts_dataframe
            )

            self.__to_excel(
                content_dataframe=today_main_contracts_dataframe,
                path=TQZMainContractsChangeFilePath.main_contracts_excel(),
                sheet_name=TQZMainContractsSheetType.CURRENT_FUTURE_MAIN_CONTRACT.value
            )

    @staticmethod
    def __init_today_main_contracts_dataframe(market_main_vt_symbols, pre_main_contracts_dataframe):
        today_main_contracts_dataframe = pandas.DataFrame(
            columns=[
                TQZMainContractsColumnType.MAIN_CONTRACT.value,
                TQZMainContractsColumnType.ENTRY_PRICE.value
            ]
        )
        today_main_contracts_dataframe[TQZMainContractsColumnType.MAIN_CONTRACT.value] = market_main_vt_symbols
        today_main_contracts_dataframe.set_index(TQZMainContractsColumnType.MAIN_CONTRACT.value, inplace=True)
        today_main_contracts_dataframe[TQZMainContractsColumnType.ENTRY_PRICE.value] = pre_main_contracts_dataframe[
            TQZMainContractsColumnType.ENTRY_PRICE.value]
        today_main_contracts_dataframe.reset_index(inplace=True)

        return today_main_contracts_dataframe

    @staticmethod
    def __init_pre_main_contracts_dataframe(market_main_vt_symbols):
        pre_main_contracts_dataframe = pandas.read_excel(
            io=TQZMainContractsChangeFilePath.main_contracts_excel(),
            sheet_name=TQZMainContractsSheetType.CURRENT_FUTURE_MAIN_CONTRACT.value
        )

        not_main_contracts = []
        current_main_contracts = pre_main_contracts_dataframe[
            TQZMainContractsColumnType.MAIN_CONTRACT.value].values.tolist()

        for current_main_contract in current_main_contracts:
            if current_main_contract not in market_main_vt_symbols:
                not_main_contracts.append(current_main_contract)

        pre_main_contracts_dataframe.set_index(TQZMainContractsColumnType.MAIN_CONTRACT.value, inplace=True)
        pre_main_contracts_dataframe.drop(not_main_contracts, inplace=True)  # drop all non_main_contracts

        return pre_main_contracts_dataframe

    def __create_main_contracts(self, current_main_vt_symbols):
        """
        Create main-contracts-excel when excel is not exsit.
        """

        main_contracts_dataframe = pandas.DataFrame(
            columns=[
                TQZMainContractsColumnType.MAIN_CONTRACT.value,
                TQZMainContractsColumnType.ENTRY_PRICE.value
            ]
        )

        main_contracts_dataframe[TQZMainContractsColumnType.MAIN_CONTRACT.value] = sorted(current_main_vt_symbols)

        self.__to_excel(
            content_dataframe=main_contracts_dataframe,
            path=TQZMainContractsChangeFilePath.main_contracts_excel(),
            sheet_name=TQZMainContractsSheetType.CURRENT_FUTURE_MAIN_CONTRACT.value
        )

    @staticmethod
    def __to_excel(content_dataframe, path, sheet_name):
        """
        Write content_dataframe to path/excel/sheet_name
        """

        excel_writer = pandas.ExcelWriter(path=path)
        content_dataframe.to_excel(
            excel_writer,
            sheet_name=sheet_name,
            index=False,
            freeze_panes=(1, 0)
        )
        excel_writer.save()

    @staticmethod
    def __get_vt_symbol(tq_symbol):
        """
        Change tq_symbol format to vt_symbol format
        """
        return f'{tq_symbol.split(".")[1]}.{tq_symbol.split(".")[0]}'

标签:vnpy,contracts,self,dataframe,拉取,symbols,vt,main,合约
来源: https://blog.csdn.net/Michael_234198652/article/details/119037378

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有