avatar of 发明者量化-小小梦 发明者量化-小小梦
집중하다 사신
4
집중하다
1271
수행원

로컬 파일에 Python 전략을 캡슐화하는 방법을 단계별로 알려드립니다.

만든 날짜: 2020-06-30 10:48:18, 업데이트 날짜: 2024-12-10 20:27:04
comments   3
hits   3310

로컬 파일에 Python 전략을 캡슐화하는 방법을 단계별로 알려드립니다.

로컬 파일에 Python 전략을 캡슐화하는 방법을 단계별로 알려드립니다.

이 글에서는 두 가지 해결책을 논의합니다. 글의 마지막에 있는 다른 해결책은 더 간단합니다(권장).

Python을 사용하여 전략을 작성하는 많은 개발자는 전략 코드 파일을 로컬에 저장하고 싶어하지만, 전략의 보안에 대해 우려합니다. 처럼FMZ API문서에서 제안된 한 가지 해결책:

정책 보안 Inventor Quantitative Trading Platform에서 전략을 개발하세요. 전략은 Inventor Quantitative 계정 보유자에게만 표시됩니다. 또한, 전략 코드는 Inventor Quantitative Trading Platform에서 완전히 현지화될 수 있습니다. 예를 들어, 전략은 Python 패키지에 캡슐화되어 전략 코드에 로드되어 전략 현지화를 달성할 수 있습니다. https://www.fmz.com/api#%E7%AD%96%E7%95%A5%E5%AE%89%E5%85%A8%E6%80%A7

사실, 이에 대해 걱정할 필요는 전혀 없지만 그러한 솔루션이 있으므로 완전한 구현 예를 제공합니다.

전략을 캡슐화하다

고전적인 Python 전략을 사용하여 간단한 Python 전략을 시연해 보겠습니다.Dual Thrust전략, 전략 주소: https://www.fmz.com/strategy/21856 우리는 전략 코드의 어떤 부분도 변경하지 않으려고 노력하며, 전략을 FMZ 플랫폼에서 전략 코드로 호출할 수 있는 파일에 캡슐화합니다. 실행 결과는 전략을 직접 실행하는 것과 정확히 같습니다. 캡슐화의 가장 큰 문제는 FMZ 플랫폼의 전략 코드에서 호출되는 전역 객체, 전역 함수 및 상수 값을 캡슐화된 파일에서 액세스할 수 없기 때문에 이러한 객체, 함수 및 변수를 전달하는 방법을 찾아야 한다는 것입니다. , 그리고 캡슐화된 문서에 대한 상수입니다. 그러면 단계적으로 처리해 보겠습니다.

로컬 파일에 Python 전략을 캡슐화하는 방법을 단계별로 알려드립니다.

로컬 편집기에서 열린 testA 파일에 붙여넣습니다.

로컬 파일에 Python 전략을 캡슐화하는 방법을 단계별로 알려드립니다.

  • 일부 코드를 추가하고 복사하여 붙여넣은 전략 코드 부분을 그대로 유지하세요.
  # 函数、对象
  exchanges = None
  exchange = None
  Log = None
  Sleep = None
  TA = None
  Chart = None
  LogProfitReset = None
  LogStatus = None
  _N = None
  _C = None 
  LogProfit = None  


  # 策略参数
  ContractTypeIdx = None
  MarginLevelIdx = None
  NPeriod = None
  Ks = None
  Kx = None
  AmountOP = None
  Interval = None
  LoopInterval = None
  PeriodShow = None  

  # 常量
  ORDER_STATE_PENDING = 0
  ORDER_STATE_CLOSED = 1
  ORDER_STATE_CANCELED = 2
  ORDER_STATE_UNKNOWN = 3
  ORDER_TYPE_BUY = 0 
  ORDER_TYPE_SELL = 1
  PD_LONG = 0
  PD_SHORT = 1  


  def SetExchanges(es):
      global exchanges, exchange
      exchanges = es
      exchange = es[0]  

  def SetFunc(pLog, pSleep, pTA, pChart, pLogStatus, pLogProfitReset, p_N, p_C, pLogProfit):
      global Log, Sleep, TA, Chart, LogStatus, LogProfitReset, _N, _C, LogProfit
      Log = pLog
      Sleep = pSleep
      TA = pTA
      Chart = pChart
      LogStatus = pLogStatus
      LogProfitReset = pLogProfitReset
      _N = p_N
      _C = p_C
      LogProfit = pLogProfit  

  def SetParams(pContractTypeIdx, pMarginLevelIdx, pNPeriod, pKs, pKx, pAmountOP, pInterval, pLoopInterval, pPeriodShow):
      global ContractTypeIdx, MarginLevelIdx, NPeriod, Ks, Kx, AmountOP, Interval, LoopInterval, PeriodShow
      ContractTypeIdx = pContractTypeIdx
      MarginLevelIdx = pMarginLevelIdx
      NPeriod = pNPeriod
      Ks = pKs
      Kx = pKx
      AmountOP = pAmountOP
      Interval = pInterval
      LoopInterval = pLoopInterval
      PeriodShow = pPeriodShow

위 코드의 주요 기능은 현재 파일에서 사용되는 전역 함수와 변수를 선언하는 것입니다. 그런 다음 이러한 기능을 가져오기 위한 인터페이스를 예약합니다.SetExchangesSetParamsSetFunc. FMZ 플랫폼의 전략은 이러한 함수를 호출하고 사용된 함수, 객체 등을 전달합니다.

FMZ 플랫폼에서의 출시 전략

창업 전략은 매우 간단합니다.

로컬 파일에 Python 전략을 캡슐화하는 방법을 단계별로 알려드립니다.

FMZ 플랫폼에 작성된 코드는 몇 줄에 불과합니다. 이 스타트업 전략의 매개변수는 우리가 캡슐화한 전략과 동일하다는 점에 유의해야 합니다.Dual Thrust OKCoin Futures의 파이썬 버전정확히 동일합니다. 사실, “Dual Thrust OKCoin Futures의 Python 버전” 전략을 직접 복사한 다음 전략 코드를 지우고 붙여넣을 수 있습니다.

import sys
# 这里我写的是自己放置testA文件的路径,具体我替换为xxx了,简单说就是设置自己的testA文件路径就可以了
sys.path.append("/Users/xxx/Desktop/pythonPlayground/")
import testA

def main():
    # 传递交易所对象
    testA.SetExchanges(exchanges)
    # 传递全局函数 SetFunc(pLog, pSleep, pTA, pChart, pLogStatus, pLogProfitReset, p_N, p_C, pLogProfit)
    testA.SetFunc(Log, Sleep, TA, Chart, LogStatus, LogProfitReset, _N, _C, LogProfit)
    # 传递策略参数 SetParams(pContractTypeIdx, pMarginLevelIdx, pNPeriod, pKs, pKx, pAmountOP, pInterval, pLoopInterval, pPeriodShow)
    testA.SetParams(ContractTypeIdx, MarginLevelIdx, NPeriod, Ks, Kx, AmountOP, Interval, LoopInterval, PeriodShow)
    # 执行封装的testA文件中的策略主函数
    testA.main()

이런 식으로 정책 논리 본문을 testA 파일에 캡슐화하고 호스트의 장치에 로컬로 배치합니다. FMZ 플랫폼에서는 시작 정책을 하나만 저장하면 됩니다. 이 시작 정책을 만드는 로봇은 로컬 파일을 직접 로드할 수 있습니다. 호스트에서 로컬로 실행합니다.

백테스팅 비교

  • 백테스팅을 위해 로컬로 testA 파일을 로드합니다.

로컬 파일에 Python 전략을 캡슐화하는 방법을 단계별로 알려드립니다.

  • 공개 서버에서 백테스트된 원래 전략

로컬 파일에 Python 전략을 캡슐화하는 방법을 단계별로 알려드립니다.

또 다른 더 간단한 방법

파일을 직접 로드하여 실행합니다. 이번에는 “Dual Thrust OKCoin Futures의 Python 버전” 전략의 코드를 넣기 위해 testB 파일을 준비합니다.

import time
class Error_noSupport(BaseException):
    def __init__(self):
        Log("只支持OKCoin期货!#FF0000")

class Error_AtBeginHasPosition(BaseException):
    def __init__(self):
        Log("启动时有期货持仓! #FF0000")

ChartCfg = {
    '__isStock': True,
    'title': {
        'text': 'Dual Thrust 上下轨图'
    },
    'yAxis': {

...

전략이 너무 길기 때문에 생략했으며, 전략 코드는 전혀 변경할 필요가 없습니다. 그런 다음 FMZ 플랫폼에서의 전략인 “Dual Thrust OKCoin Futures의 Python 버전(전략을 시작하고 testB 파일을 직접 실행)“을 준비하고, 로봇을 생성하고, testB 파일을 직접 로드하여 직접 실행합니다. 시작 전략은 또한 “Python 버전 Dual Thrust OKCoin Futures”의 원래 버전과 동일한 전략 매개변수 설정(전략 인터페이스 매개변수)을 가져야 한다는 점에 유의하세요.

로컬 파일에 Python 전략을 캡슐화하는 방법을 단계별로 알려드립니다.

if __name__ == '__main__':
    Log("run...")
    try:
        # 文件路径做了处理,可以写入自己testB文件放置的实际路径
        f = open("/Users/xxx/Desktop/pythonPlayground/testB.py", "r")
        code = f.read()
        exec(code)
    except Exception as e:
        Log(e)

백테스트를 수행하려면: 로컬 파일에 Python 전략을 캡슐화하는 방법을 단계별로 알려드립니다.

백테스트 결과는 위의 테스트와 일치합니다.

분명히 위의 두 번째 방법이 더 간단하고 권장됩니다. 더 나은 방법이 있다면 메시지를 남겨주세요.