고급 플랫폼 연구 파이썬 데이터 분석 및 전략 백테스트

저자:니나바다스, 창작: 2022-04-13 09:12:47, 업데이트: 2022-04-28 11:06:13

고급 플랫폼 연구 파이썬 데이터 분석 및 전략 백테스트.ipynb

고급 플랫폼 연구

FMZ는 사용자가 플랫폼 API와 친숙해지고 전략 연구를 수행하는 데 도움이되는 jupyter 노트북을 내장하고 있으며, Python3 C++11/17 및 자바스크립트의 학습 환경을 지원합니다. 노트북+파이썬은 데이터 분석 및 전략 연구에 거의 필수적인 매우 강력한 도구입니다. FMZ 플랫폼과 함께 제공되는 백테스트가 매우 유용하지만 복잡하고 큰 데이터 볼륨이있는 전략에는 적합하지 않습니다. 이 기사는 jupyter 노트북을 사용하는 고급 기술을 소개하고 무작위 쌍 거래 및 멀티 쌍 거래 전략의 백테스트를 구현합니다.

유피터 사용

FMZ 내부의 연구 환경은 사용할 수 있지만 네트워크는 불편합니다. 노트북 및 일반적으로 사용되는 관련 라이브러리를 가지고 자신의 장치에 아나콘다3를 설치하는 것이 좋습니다. 로컬 네트워크 환경을 공유하고 더 나은 성능을 가질 수 있습니다. 구글 콜라브를 사용하는 것도 좋습니다. 저장 장치에 몇 가지 제한이 있지만 무료이며 강력하며 로봇 학습과 관련된 연구에 적합합니다.

튜토리얼

노트북과 파이썬의 특정 사용 기술을위한 많은 온라인 튜토리얼이 있습니다. 파이썬 정량화 및 jupyter 노트북 튜토리얼과 같은 키워드를 검색하여 많은 정보를 찾을 수 있습니다. 당신은 크롤러, 데이터 처리, 백테스트, 전략 설계 및 플롯링과 같은 일련의 기초를 배우고 마스터해야합니다.

데이터 획득

플랫폼은 일반적으로 K-라인과 역사 데이터를 얻기 위해 API를 제공하며, 일부는 거래별로 실행 거래의 데이터를 제공합니다. 데이터를 얻고 저장하기 위해 크롤러를 사용해야합니다. 또한 플랫폼에 의해 푸시 된 데이터를 직접 받아 직접 로컬 데이터베이스 저장소를 만들 수 있습니다.

다음으로, 우리는 바이낸스에서 영구 계약의 K-라인 데이터를 얻고 저장하는 방법을 보여줄 것입니다.

먼저, 바이낸스 페퍼추얼 스 문서를 찾아보세요.https://binance-docs.github.io/apidocs/futures/cn/#c59e471e81. 필요한 매개 변수 및 반환된 데이터 형식을 볼 수 있습니다. 일반적으로 API에 의해 획득된 K-라인의 수는 제한되어 있으며 Binance는 최대 1000을 가지고 있으므로 루프 반복으로 획득해야합니다. 다른 플랫폼의 상황은 Binance와 유사합니다. 네트워크가 K-라인 크롤을 위해 해외 네트워크 (중국 국내 네트워크에 비해) 에 연결되어야한다는 점에 유의하십시오.

바이낸스가 지원하는 기간: 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M.

[24]에서: 수입 요청 #공용 라이브러리의 네트워크 요청 수입 날짜, 날짜, 시간 수입 시간 다를 PD로 가져오세요 [160]에서: def GetKlines ((symbol=BTC,start=2020-8-10,end=2021-8-10,period=1h): 스 = [] start_time = int(time.mktime(datetime.strptime(start, %Y-%m-%d).시간중수))) *1000 end_time = int(time.mktime(datetime.strptime(end, %Y-%m-%d).시간중수))) *1000 while start_time < end_time: 시작 시간 < 종료 시간 res = requests.get ((https://fapi.binance.com/fapi/v1/klines?symbol=%sUSDT&interval=%s&startTime=%s&limit=1000% ((symbol,period,start_time)) res_list = res.json() Klines += res_list #print ((datetime.utcfromtimestamp ((start_time/1000).strftime ((%Y-%m-%d %H:%M:%S),len ((res_list)) start_time = res_list[-1][0] return pd.DataFrame ((Klines,columns=[time,open,high,low,close,amount,end_time,volume,count,buy_amount,buy_volume,null]).astype)) [85]에서: df = GetKlines ((기호=BTC,start=2021-1-1,end=2021-8-10,period=1h)

데이터 저장 및 읽기에는 판다 라이브러리 내부의 기능을 사용할 수 있습니다. 형식은 csv이며, Excel 소프트웨어로 직접 열 수 있습니다.

가장 높은 가격, 가장 낮은 가격, 오픈 가격, 클로즈 가격 및 실행 부피 외에도 바이낸스가 반환하는 K-라인 데이터에는 전체 거래 금액, 이니셔티브 구매 금액, 실행 금액 등이 포함됩니다. 이것들은 전략을 구성하는 데 사용할 수있는 귀중한 정보입니다.

[86]에서: df.to_csv ((btc_klines.csv)) df = pd.read_csv ((btc_klines.csv,index_col=0) [87]에서: df 아웃[87]: ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 오픈 시간 높은 낮은 닫는 금액 종료_시간 부피 계산 구매_상량 구매_부피 null 0 1596988800000 11575.08 11642.00 11566.07 11591.37 6541.466 1596992399999 7.592336e+07 25724 3127.898 3.630633e+07 0 1 1596992400000 11591.39 11610.23 11526.90 11534.39 6969.252 1596995999999 8.057780e+07 27403 3390.424 3.920162e+07 0 2 1596996000000 11534.39 11656.69 11527.93 11641.07 6439.365 1596999599999 7.469135e+07 25403 3446.186 3.997906e+07 0 3 1596999600000 11641.06 11665.90 11624.20 11635.30 3911.582 1597003199999 4.555459e+07 17820 1842.413 2.145768e+07 0 4 1597003200000 11635.29 11684.00 11635.29 11673.81 3461.004 1597006799999 4.036804e+07 15513 1660.575 1.936981e+07 0 .................. 8805 1628658000000 45627.72 45894.53 45540.00 45801.45 10296.202 1628661599999 8806 1628661600000 45801.46 46270.00 45800.01 46087.86 26409.962 1628665199999 1.215164e+09 247170 13696.301 6.302708e+08 0 8807 1628665200000 46087.87 46450.00 46087.87 46367.38 23969.309 1628668799999 1.110210e+09 232348 11990.951 5.554267e+08 0 8808 1628668800000 46367.37 46643.13 46002.01 46217.01 23472.769 1628672399999 1.086549e+09 229533 12334.292 5.711837e+08 0 8809 1628672400000 46217.01 46329.69 46046.54 46297.16 6579.477 16286759999 3.039580e+08 78812 3313.055 1.530718e+08 0 , 8810 행 × 12 열

, [88]에서: df.index = pd.to_datetime ((df.time,unit=ms) # 지수를 날짜로 변환합니다. 이는 그래프에 편리합니다. [89]에서: df.close.plot ((figsize=(15,6),grid = True); #close 가격 아웃[89]:img[92]에서: (df.buy_amount.rolling(150).mean() /df.amount.rolling(150.mean)).plot ((figsize=(15,6),grid = True); 이니셔티브 구매 금액의 비율이 바닥에 도달 한 후 상승하는 상황은 일반적으로 가격 상승 상황에 반응하지만, 이니셔티브 구매 금액의 비율의 장기 평균은 49%입니다. 외출 [1]:img[93]에서: (df[count].rolling ((100).mean (()).plot ((figsize=(15,6),grid = True); #공평한 후에 실행된 금액,시장 코팅은 낮은 위치에 준비될 수 있습니다. 아웃[1]:img

역 테스트 엔진

이전 기사에서도 파이썬 백테스트 엔진을 제공했지만 여기에 최적화된 버전이 있습니다. USDT 마진 (또는 다른 코트 통화 마진) 영구 계약은 스팟 계약과 매우 유사합니다. 차이점은 영구 계약이 레버레이드 될 수 있으며 부정적인 금액을 보유 할 수 있다는 것입니다.

여기에 간단한 예제를 제시하고 있는데, 이는 멀티 심볼 스팟 또는 멀티 심볼 영구 백테스팅을 구현할 수 있다. 많은 세부 사항은 무시된다: 선물의 레버리지, 마진 점유, 자금 조달율, 청산 메커니즘, 시장 제작 및 주문 수용자 거래뿐만 아니라 주문 유지, 그러나 일반적으로 정상적인 백테스트 결과에 영향을 미치지 않는다. 그리고 가격과 양의 일치, 그리고 계정 업데이트 모두 외부에서 수입되어야 한다. 독자들은 이를 기반으로 개선할 수 있다.

교환 클래스 소개:

  • 계정:USDT는 필요 없는 기본 화폐를 나타냅니다. realised_profit: 이미 실현된 이익과 손실; unrealised_profit: 아직 실현되지 않은 이익과 손실; 총: 총 자본; 수수료: 처리 수수료. 다른 거래 쌍의 경우, 금액 (가장 짧은 경우 음수); hold_price: 보유 가격; 가치: 보유 가치; 가격: 현재 가격.

  • trade_symbols: 거래 쌍의 배열; 당신은 또한 하나의 거래 쌍에서 통과 할 수 있습니다; 기본 코팅 통화는 USDT입니다, 그러나 당신은 또한 다른 코팅 통화 기호를 백테스트로 사용할 수 있습니다.

  • 수수료: 전달 수수료; 간단하게 말해서, 제작자와 수신자를 구별하지 마십시오.

  • initial_balance: 초기 자산; 기본 거래 쌍의 초기 금액은 0입니다.

  • 구매 함수: 구매, 즉 매칭 메커니즘 없이 영구 계약에 대한 긴 및 짧은 폐쇄에 대응합니다.

  • 판매 기능: 판매.

  • 업데이트 기능: 모든 거래 쌍의 가격 사전에 통과해야하는 계정 정보를 업데이트합니다. [98]에서: 클래스 교환:

    def init(자신, 거래_상호, 수수료=0.0004, 초기_금액=10000): self.initial_balance = initial_balance #초기 잔액 자체 수수료 = 수수료 self.trade_symbols = 트레이드_시뮬러 자기계산 = {USDT:{실제_이익:0, 실제_이익:0, 총액:초기_금액, :0}} trade_symbols의 기호에 대해: 자기계산[표] = {금액:0, 지수_가격:0, 가치:0, 가격:0, 실현_이익:0, 실현되지 않은_이익:0, :0}

    def 무역 (자신, 기호, 방향, 가격, 금액):

      cover_amount = 0 if direction*self.account[symbol]['amount'] >=0 else min(abs(self.account[symbol]['amount']), amount)
      open_amount = amount - cover_amount
      self.account['USDT']['realised_profit'] -= price*amount*self.fee #take out the fee 
      self.account['USDT']['fee'] += price*amount*self.fee
      self.account[symbol]['fee'] += price*amount*self.fee
    
      if cover_amount > 0: #close first 
          self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount  #profit 
          self.account[symbol]['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount
          
          self.account[symbol]['amount'] -= -direction*cover_amount
          self.account[symbol]['hold_price'] = 0 if self.account[symbol]['amount'] == 0 else self.account[symbol]['hold_price']
          
      if open_amount > 0:
          total_cost = self.account[symbol]['hold_price']*direction*self.account[symbol]['amount'] + price*open_amount
          total_amount = direction*self.account[symbol]['amount']+open_amount
          
          self.account[symbol]['hold_price'] = total_cost/total_amount
          self.account[symbol]['amount'] += direction*open_amount
    

    def 구매 (자신, 기호, 가격, 금액):self.Trade(호상 1, 가격, 금액)

    def 판매 (자신, 기호, 가격, 금액):self.Trade(기호 -1, 가격, 금액)

    def 업데이트 ((자신, close_price): #자산 업데이트 자기계산[USDT][실현되지 않은_이익] = 0 self.trade_symbols에 있는 기호에 대해: self.account[symbol][unrealised_profit] = (close_price[symbol] - self.account[symbol][hold_price]) *self.account[symbol][amount] self.account[symbol][price] = close_price[symbol] self.account[symbol][value] = abs(self.account[symbol][amount]) *close_price[symbol] 자기계산[USDT][실현되지 않은_이익] += 자기계산[표자][실현되지 않은_이익] 자기계산[USDT][] = 둥글 ((자신계산[USDT][실현_이익] + 자기계산.초기_정액 + 자기계산[USDT][실현_이익],6) [117]에서: #테스트에서 볼 수 있듯이 플랫폼이 USDT 마진 또는 스팟인지에 대한 강조가 없습니다. 사실 결과는 동일합니다. e = Exchange([BTC], 수수료=0.0004, initial_balance=10000) #Exchange 객체를 생성하고 BTC의 하나의 거래 쌍만 e.BTC를 구매하십시오. e.BTC를 판매합니다 (BTC,41000, 0.1) e.Update (({BTC:41000}) #updtae 계정 정보 print ((e.account) #결정 계좌 정보 print('이익: ',순환 (e.account[USDT][total]-e.initial_balance,2)) 아웃[117]:{USDT: {실현된_이익: 96.76, 실현되지 않은_이익: 0.0, 총액: 10096.76, : 3.24}, BTC: {금액: 0.0, 유지_가격: 0, 가치: 0.0, 가격: 000, 41 실현된_이익: 100.0, 실현되지 않은_이익: 0.0, : 3.24}} 이익: 96.76

그리드 전략 백테스트

먼저, 클래식 영구 격자 전략을 백테스트 해 봅시다. 이 전략은 최근 우리 플랫폼에서 매우 인기가 있습니다. 스포트 격자 하나와 비교하면 통화를 보유 할 필요가 없으며 스포트 격자 하나보다 훨씬 편리한 레버리지를 추가 할 수 있습니다. 그러나 직접 백테스트 할 수 없기 때문에 통화 기호를 선택하는 데 도움이되지 않습니다. 여기 우리는 백테스트 엔진을 지금 사용하고 테스트합니다.

라이브의 위에는 2021년 4월 4일부터 시작된 공식적인 봇이 있다. 포지션 값은 150, 그리드 간격은 0.01, 현재 이익은 3600USDT이다. 동일한 매개 변수와 5min K-line를 사용해서 백테스트하면 이익은 3937USDT이다. 봇의 시작에서의 포지션 값이 150 USDT 미만이기 때문에 결과는 상당히 정확하다. 그리드 간격을 0.005로 변경하면 이익은 5226U이다. 0.005의 그리드 간격은 분명히 0.01보다 더 좋은 매개 변수이며, 그것을 알아내기 위해 백테스트가 필요하다.

K-라인 기간이 짧을수록 해당 백테스트 결과가 정확하고 필요한 데이터 양이 커집니다. 독자는 원하는 거래 쌍으로 기호 매개 변수를 변경하는 것을 시도 할 수 있습니다.

[241]에서: 기호 = TRX df = GetKlines ((기호=기호,start=2021-4-4,end=2021-8-11,period=5m) [286]에서: 값 = 150 pct = 0.01

e = 거래소 ([표], 수수료=0.0002, 초기_금액=10000) init_price = df.loc[0,close] res_list = [] # 중간 결과를 저장하는 데 사용됩니다 df.iterrows에 있는 행에 대해: kline = row[1] #그게 하나의 K-line만 테스트하고 하나의 구매 주문이나 하나의 판매 주문만 얻을 수 있습니다. buy_price = (value / pct - value) / ((value / pct) / init_price + e.account[symbol][amount]) #sell order price, 이는 메이커 실행이기 때문에 최종 매칭 가격이기도 합니다. sell_price = (value / pct + value) / ((value / pct) / init_price + e.account[symbol][amount])

if kline.low < buy_price: #the lowest price of K-line is less than the current maker price; the buy order is executed 
    e.Buy(symbol,buy_price,value/buy_price)
if kline.high > sell_price:
    e.Sell(symbol,sell_price,value/sell_price)
e.Update({symbol:kline.close})
res_list.append([kline.time, kline.close, e.account[symbol]['amount'], e.account['USDT']['total']-e.initial_balance])

res = pd.DataFrame ((data=res_list, columns=[시간,가격,금액,이익]) res.index = pd.to_datetime (res.time,unit=ms) [287]에서: e.계산 아웃[287]:{USDT: {실현_이익: 3866.633149565143, 실현되지 않은 이익: 70.54622281993666 총: 13937.179372, 료: 177.51000000000596 TRX: {금액: 36497.43208747655, hold_price: 0.08203709078461048 값: 3064.689372385406, 가격: 0.08397, 이윤은 4044.143149565462입니다. 실현되지 않은 이익: 70.54622281993666 177.51000000000596 [288]에서: res.profit.plot ((figsize=(15,6),grid = True); 외출 [1]:img[170]에서: res.price.plot ((figsize=(15,6),grid = True); #close 가격 외출[170]:img

스팟 평형 전략 백테스트

이 유형의 전략은 또한 비교적 인기가 있지만 FMZ 플랫폼은 멀티 기호 전략을 백테스트하는 데 그다지 좋지 않습니다. 이 백테스트 엔진을 사용하여 시도하십시오. 우리는 BTC, ETH, LTC 및 XRP의 네 개의 주류 통화 기호를 선택하고 각각 시장 가치의 25%를 구성하고 1%의 오차를 모두 균형을 맞추고 있습니다.

먼저, 지난 1년 동안 4개의 기호의 폐쇄 가격을 얻으십시오. ETH가 가장 큰 상승세를 보이고 다른 3개 기호가 비슷한 상승세를 보이는 것을 볼 수 있습니다. 이 4개의 기호를 평균적으로 보유하면 최종 순액은 4.5입니다. 백테스트 후, 균형 전략은 약간 향상된 최종 순액은 5.3입니다.

[290]에서: 기호 = [BTC,ETH,LTC,XRP] 데이터 = {} 기호 속의 기호의 경우: df = GetKlines ((기호=기호,start=2020-8-11,end=2021-8-11,period=1h) data[symbol] = df.close [291]에서: df = pd.DataFrame (([data[symbol].symbols의 기호에 대한 값],index=symbols).T [302]에서: e = 교환 (기호, 수수료=0.0004, 초기_금액=10000) res_list = [] df.iterrows에 있는 행에 대해: 가격 = 행 [1] 전체 = e계산[USDT][] e.평가를 업데이트합니다. 기호 속의 기호의 경우: pct = e.account[symbol][value]/총 pct > 0.26라면 e.판매 (표상, 가격 (표상), (표상-0.25) *총/가격 (표상) pct < 0.24라면 e.구매 (표지,가격 (표지), 0.25%) *총/가격 (표지) res_list.append (([e.account[symbol][value] for symbol in symbols] + [e.account[USDT][total]]) res = pd.DataFrame ((data=res_list, columns=symbols+[total]) [303]에서: (df/df.iloc[0,:]).plot(figsize=(15,6),grid = True); #정상화로 트랜드를 플롯 외출 [1]:img[304]에서: (res.total/10000-(df/df.iloc[0,:]).mean(axis=1)).plot(figsize=(15,6),grid = True); #효과를 강화합니다 외출 [1]:img

거북이 전략

거북이 전략은 클래식 트렌드 전략으로 포지션을 추가하기 위해 완전한 스톱 로스 로직을 포함합니다. 자세한 내용은 참조하십시오:https://zhuanlan.zhihu.com/p/27987938우리는 여기서 간단한 버전을 실행해서 백테스트를 합니다.

거북이 전략 기간은 전략에 큰 영향을 미치며, 너무 짧은 기간을 선택하는 것은 바람직하지 않습니다. 여기서는 6h를 선택합니다. 돈치안 채널 기간은 5로 선택되고, 포지션 비율은 백테스트에 따라 0.003로 선택됩니다. 가격이 채널의 업밴드를 뚫고 긴 포지션 1 유닛을 열고, 가격이 포지션을 열고 0.3 변동성을 계속 증가하면 1 유닛을 추가하고 가격이 손실을 막기 위해 최신 오픈 가격의 변동성을 2.5 이하로 떨어집니다. 짧은 주문의 원칙은 동일합니다. ETH의 큰 황소 시장으로 인해 거북이 전략은 주요 추세를 포착하고 궁극적으로 기간 동안 최대 4 배의 이윤을 달성하여 27 배의 이윤을 달성했습니다.

거북이 전략의 매개 변수는 기간과 밀접하게 관련이 있으며 백트 테스트를 통해 선택해야합니다. 또한 높은 위험을 피하기 위해 각 시간 오픈 포지션의 단위가 너무 크지 않도록 주의해야합니다.

최종 순액 차트에서 볼 수 있듯이 거북이 전략은 장기적인 전략이며, 이 과정에서 3~4개월 동안 수익이 없을 수 있으며, 반복적인 스톱 손실이 발생할 수 있지만, 한쪽에서 큰 시장 코팅이 발생하면 거북이 전략은 트렌드를 활용하여 큰 포지션을 축적하고, 트렌드의 끝까지 유지하여 많은 수익을 얻을 수 있습니다. 상승의 끝에서 전략은 많은 포지션을 축적할 것입니다. 이 시점에서 변동성이 상대적으로 크며, 종종 큰 이익이 철수됩니다. 거북이 전략을 사용하는 것은 그 단점과 인내심을 받아들이는 것을 요구합니다.

[424]에서: 기호 = ETH df = GetKlines ((기호=기호,start=2019-8-11,end=2021-8-11,period=6h) [425]에서: df.index = pd.to_datetime ((df.time,unit=ms) [568]에서: M = 5 # 도니치안 채널의 기간 부피 pct = 0.003 # 추가된 포지션과 전체 포지션의 비율 df[up] = df[high].rolling ((M).max().shift(1) #upBand Donchian 채널, 긴 만들기 위해 사용 됩니다. df[down] = df[low].rolling ((M).max ((().shift ((1) df[] = (df[]+df[])/2 df[true_range] = pd.concat([df[high]-df[low],df[high]-df[close].shift(1),df[close].shift(1)-df[low],축=1).max (축=1) df[N] = df[true_range].rolling ((50).mean() #N은 최근 변동성, 구매 및 중지 손실을 판단하는 데 사용되는 [572]에서: open_times = 0.3 #포지션 개설 판단 stop_times = 2.5 #stop 손실 e = 교환 (([표], 수수료=0.0004, initial_balance=10000) #취득자를 0.0004로 설정 res_list = [] last_price = 0 #최후 오픈 포지션 가격 df.iterrows에 있는 행에 대해: kline = row[1] if kline.isnull().sum() > 0: #데이터 없는 섹션을 건너가 계속해 단위 = e.account[USDT][total]*pct/kline.N #open position 단위 금액

if kline.high >  kline.up and e.account[symbol]['amount'] == 0: #first time to open long position 
    e.Buy(symbol,kline.up,unit) #notice the trading price here
    last_price = kline.up
if e.account[symbol]['amount'] > 0 and kline.high > last_price + open_times*kline.N: #long position, buy in 
    e.Buy(symbol,last_price + open_times*kline.N,unit)
    last_price = last_price + open_times*kline.N
if e.account[symbol]['amount'] > 0 and kline.low < last_price - stop_times*kline.N: #long position, stop loss
    e.Sell(symbol,last_price - stop_times*kline.N,e.account[symbol]['amount'])
    
if kline.low <  kline.down and e.account[symbol]['amount'] == 0: #open short
    e.Sell(symbol,kline.down,unit)
    last_price = kline.down
if e.account[symbol]['amount'] < 0 and kline.low < last_price - open_times*kline.N: #short position, buy in 
    e.Sell(symbol,last_price - open_times*kline.N,unit)
    last_price = last_price - open_times*kline.N
if e.account[symbol]['amount'] < 0 and kline.high > last_price + stop_times*kline.N: #short position, stop loss
    e.Buy(symbol,last_price + stop_times*kline.N,-e.account[symbol]['amount'])
    
e.Update({symbol:kline.close})
res_list.append([kline.time, kline.close, e.account[symbol]['amount']*kline.close, e.account['USDT']['total']])

res = pd.DataFrame ((data=res_list, columns=[time,price,value,total]) res.index = pd.to_datetime (res.time,unit=ms) print (( 최종 시장 가치:,res[][-1]) [572]:결정 시장 가치: 280760.566996 [573]에서: res.total.plot ((figsize=(15,6), 그리드 = True) 외출[573]:img[571]에서: (res.value/res.total).plot ((figsize=(15,6),그리드 = True) 외출[571]:img

결론

만약 당신이 jupyter 노트북 연구 플랫폼을 사용하는 데 능숙하다면, 데이터 획득, 데이터 분석, 전략 백테스트, 차트 표시, 등과 같은 작업을 쉽게 수행할 수 있습니다. 이는 양적 거래의 불가피한 방법입니다. 만약 당신이 지금 전략 작성에 대한 단서가 없다면, 당신은 먼저 데이터를 분석할 수도 있습니다. 초보자를 위해 권장 자원은:

데이터 분석을 위해 파이썬을 사용하세요:https://wizardforcel.gitbooks.io/pyda-2e/content/

파이썬 정량 학습:https://wizardforcel.gitbooks.io/python-quant-uqer/content/

[ ]에서:


더 많은