当前位置:   article > 正文

量化交易之hft篇 - 合约绩效分析 (优化盈亏算法)_hft算法

hft算法
  1. import os
  2. from vnpy.app.tqz_hft_parser_app.hft_parser_path import TQZHftParserPath
  3. from vnpy.trader.tqz_extern.tools.position_operator.position_operator import TQZJsonOperator
  4. from vnpy.trader.tqz_extern.tools.pandas_operator.pandas_operator import pandas
  5. from vnpy.app.tqz_hft_parser_app.tqz_constant import TQZTradeLogTitles, TQZOrderType, TQZHftSheetType, TQZHftMeritsTitles
  6. class TQZHftMerits:
  7. # --- api part ---
  8. @classmethod
  9. def tqz_create(cls, parser_trade_result_fold, code_cancelOrderCounts_json_allPath, hft_merits_fold):
  10. """
  11. create hft merits of every code.
  12. """
  13. for parser_trade_result_code_file in os.listdir(parser_trade_result_fold):
  14. all_path = f'{parser_trade_result_fold}/{parser_trade_result_code_file}'
  15. code_cancelOrderTimes_dictionary = TQZJsonOperator.tqz_load_jsonfile(jsonfile=code_cancelOrderCounts_json_allPath)
  16. code_csv_content = pandas.read_csv(all_path)
  17. code_merits_detailed_dataframe = cls.__get_code_merits_detailed_dataframe(code_csv_content=code_csv_content)
  18. # cancel_order_limits
  19. source_code_name = parser_trade_result_code_file.split('.')[0]
  20. code_name = source_code_name.replace('_', '.')
  21. if code_name in code_cancelOrderTimes_dictionary.keys():
  22. cancel_order_limits = code_cancelOrderTimes_dictionary[code_name]
  23. else:
  24. cancel_order_limits = 0
  25. code_merits_total_dataframe = cls.__get_code_merits_total_dataframe(
  26. sum_slippage=code_merits_detailed_dataframe[TQZTradeLogTitles.SLIPPAGE.value].sum(),
  27. cancel_order_limits=cancel_order_limits,
  28. trade_times=len(code_merits_detailed_dataframe),
  29. send_order_times=len(code_merits_detailed_dataframe) + int(cancel_order_limits),
  30. profit_and_loss_sum=cls.__get_profit_and_loss_sum(code_csv_content=code_csv_content, close_price=0)
  31. )
  32. excel_writer = pandas.ExcelWriter(path=f'{hft_merits_fold}/{source_code_name}.xlsx')
  33. code_merits_total_dataframe.to_excel(excel_writer, sheet_name=TQZHftSheetType.TOTAL.value, index=False, freeze_panes=(1, 0))
  34. code_merits_detailed_dataframe.to_excel(excel_writer, sheet_name=TQZHftSheetType.DETAILED.value, index=False, freeze_panes=(1, 0))
  35. excel_writer.save()
  36. # --- private part ---
  37. @staticmethod
  38. def __get_profit_and_loss_sum(code_csv_content, close_price):
  39. order_type = TQZTradeLogTitles.ORDER_TYPE.value
  40. receive_trade_price = TQZTradeLogTitles.RECEIVE_TRADE_PRICE.value
  41. lots = TQZTradeLogTitles.LOTS.value
  42. receive_buy_trade_price = close_price - code_csv_content.loc[code_csv_content[order_type] == TQZOrderType.BUY_ORDER_TYPE.value][receive_trade_price]
  43. receive_sell_trade_price = code_csv_content.loc[code_csv_content[order_type] == TQZOrderType.SELL_ORDER_TYPE.value][receive_trade_price] - close_price
  44. receive_short_trade_price = code_csv_content.loc[code_csv_content[order_type] == TQZOrderType.SHORT_ORDER_TYPE.value][receive_trade_price] - close_price
  45. receive_cover_trade_price = close_price - code_csv_content.loc[code_csv_content[order_type] == TQZOrderType.COVER_ORDER_TYPE.value][receive_trade_price]
  46. buy_profit_and_loss = receive_buy_trade_price * code_csv_content.loc[code_csv_content[order_type] == TQZOrderType.BUY_ORDER_TYPE.value][lots]
  47. sell_profit_and_loss = receive_sell_trade_price * code_csv_content.loc[code_csv_content[order_type] == TQZOrderType.SELL_ORDER_TYPE.value][lots]
  48. short_profit_and_loss = receive_short_trade_price * code_csv_content.loc[code_csv_content[order_type] == TQZOrderType.SHORT_ORDER_TYPE.value][lots]
  49. cover_profit_and_loss = receive_cover_trade_price * code_csv_content.loc[code_csv_content[order_type] == TQZOrderType.COVER_ORDER_TYPE.value][lots]
  50. return (buy_profit_and_loss.sum() + sell_profit_and_loss.sum() + short_profit_and_loss.sum() + cover_profit_and_loss.sum()) * code_csv_content[TQZTradeLogTitles.VOL_SCALE.value].mean()
  51. @staticmethod
  52. def __get_code_merits_detailed_dataframe(code_csv_content):
  53. code_merits_detailed_dataframe = pandas.DataFrame()
  54. code_merits_detailed_dataframe[TQZTradeLogTitles.CODE.value] = code_csv_content[TQZTradeLogTitles.CODE.value]
  55. code_merits_detailed_dataframe[TQZTradeLogTitles.ORDER_TYPE.value] = code_csv_content[TQZTradeLogTitles.ORDER_TYPE.value]
  56. code_merits_detailed_dataframe[TQZTradeLogTitles.MARKET_TIME_OF_SEND_ORDER.value] = code_csv_content[TQZTradeLogTitles.MARKET_TIME_OF_SEND_ORDER.value]
  57. code_merits_detailed_dataframe[TQZTradeLogTitles.SEND_ORDER_TIME.value] = code_csv_content[TQZTradeLogTitles.SEND_ORDER_TIME.value]
  58. code_merits_detailed_dataframe[TQZTradeLogTitles.SLIPPAGE.value] = code_csv_content[TQZTradeLogTitles.RECEIVE_TRADE_PRICE.value] - code_csv_content[TQZTradeLogTitles.SEND_ORDER_PRICE.value]
  59. code_merits_detailed_dataframe[TQZTradeLogTitles.RECEIVE_TRADE_TIME.value] = code_csv_content[TQZTradeLogTitles.RECEIVE_TRADE_TIME.value]
  60. return code_merits_detailed_dataframe
  61. @staticmethod
  62. def __get_code_merits_total_dataframe(sum_slippage, cancel_order_limits, trade_times, send_order_times, profit_and_loss_sum):
  63. columns = [
  64. TQZHftMeritsTitles.SUM_SLIPPAGE.value,
  65. TQZHftMeritsTitles.CANCEL_ORDER_COUNTS.value,
  66. TQZHftMeritsTitles.TRADE_TIMES.value,
  67. TQZHftMeritsTitles.SEND_ORDER_TIMES.value,
  68. TQZHftMeritsTitles.PROFIT_AND_LOSS.value
  69. ]
  70. code_merits_total_dataframe = pandas.DataFrame(columns=columns)
  71. last_line = len(code_merits_total_dataframe)
  72. code_merits_total_dataframe.loc[last_line, TQZHftMeritsTitles.SUM_SLIPPAGE.value] = sum_slippage
  73. code_merits_total_dataframe.loc[last_line, TQZHftMeritsTitles.CANCEL_ORDER_COUNTS.value] = cancel_order_limits
  74. code_merits_total_dataframe.loc[last_line, TQZHftMeritsTitles.TRADE_TIMES.value] = trade_times
  75. code_merits_total_dataframe.loc[last_line, TQZHftMeritsTitles.SEND_ORDER_TIMES.value] = send_order_times
  76. code_merits_total_dataframe.loc[last_line, TQZHftMeritsTitles.PROFIT_AND_LOSS.value] = profit_and_loss_sum
  77. return code_merits_total_dataframe
  78. if __name__ == '__main__':
  79. TQZHftMerits.tqz_create(
  80. parser_trade_result_fold=TQZHftParserPath.parser_trade_result_fold(),
  81. code_cancelOrderCounts_json_allPath=TQZHftParserPath.code_cancelOrderCounts_json_allPath(),
  82. hft_merits_fold=TQZHftParserPath.hft_merits_fold()
  83. )

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/817833
推荐阅读
相关标签
  

闽ICP备14008679号