고급 플랫폼 연구
FMZ는 사용자가 플랫폼 API와 친숙해지고 전략 연구를 수행하는 데 도움이되는 jupyter 노트북을 내장하고 있으며, Python3 C++11/17 및 자바스크립트의 학습 환경을 지원합니다. 노트북+파이썬은 데이터 분석 및 전략 연구에 거의 필수적인 매우 강력한 도구입니다. FMZ 플랫폼과 함께 제공되는 백테스트가 매우 유용하지만 복잡하고 큰 데이터 볼륨이있는 전략에는 적합하지 않습니다. 이 기사는 jupyter 노트북을 사용하는 고급 기술을 소개하고 무작위 쌍 거래 및 멀티 쌍 거래 전략의 백테스트를 구현합니다.
FMZ 내부의 연구 환경은 사용할 수 있지만 네트워크는 불편합니다. 노트북 및 일반적으로 사용되는 관련 라이브러리를 가지고 자신의 장치에 아나콘다3를 설치하는 것이 좋습니다. 로컬 네트워크 환경을 공유하고 더 나은 성능을 가질 수 있습니다. 구글 콜라브를 사용하는 것도 좋습니다. 저장 장치에 몇 가지 제한이 있지만 무료이며 강력하며 로봇 학습과 관련된 연구에 적합합니다.
노트북과 파이썬의 특정 사용 기술을위한 많은 온라인 튜토리얼이 있습니다. 파이썬 정량화 및 jupyter 노트북 튜토리얼과 같은 키워드를 검색하여 많은 정보를 찾을 수 있습니다. 당신은 크롤러, 데이터 처리, 백테스트, 전략 설계 및 플롯링과 같은 일련의 기초를 배우고 마스터해야합니다.
플랫폼은 일반적으로 K-라인과 역사 데이터를 얻기 위해 API를 제공하며, 일부는 거래별로 실행 거래의 데이터를 제공합니다. 데이터를 얻고 저장하기 위해 크롤러를 사용해야합니다. 또한 플랫폼에 의해 푸시 된 데이터를 직접 받아 직접 로컬 데이터베이스 저장소를 만들 수 있습니다.
다음으로, 우리는 바이낸스에서 영구 계약의 K-라인 데이터를 얻고 저장하는 방법을 보여줄 것입니다.
먼저, 바이낸스 페퍼추얼 스
바이낸스가 지원하는 기간: 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M.
[24]에서:
수입 요청 #공용 라이브러리의 네트워크 요청
수입 날짜, 날짜, 시간
수입 시간
데이터 저장 및 읽기에는 판다 라이브러리 내부의 기능을 사용할 수 있습니다. 형식은 csv이며, Excel 소프트웨어로 직접 열 수 있습니다.
가장 높은 가격, 가장 낮은 가격, 오픈 가격, 클로즈 가격 및 실행 부피 외에도 바이낸스가 반환하는 K-라인 데이터에는 전체 거래 금액, 이니셔티브 구매 금액, 실행 금액 등이 포함됩니다. 이것들은 전략을 구성하는 데 사용할 수있는 귀중한 정보입니다.
[86]에서:
df.to_csv ((
,
[88]에서:
df.index = pd.to_datetime ((df.time,unit=
이전 기사에서도 파이썬 백테스트 엔진을 제공했지만 여기에 최적화된 버전이 있습니다. 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 = 트레이드_시뮬러
자기계산 = {
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): #자산 업데이트
자기계산[
먼저, 클래식 영구 격자 전략을 백테스트 해 봅시다. 이 전략은 최근 우리 플랫폼에서 매우 인기가 있습니다. 스포트 격자 하나와 비교하면 통화를 보유 할 필요가 없으며 스포트 격자 하나보다 훨씬 편리한 레버리지를 추가 할 수 있습니다. 그러나 직접 백테스트 할 수 없기 때문에 통화 기호를 선택하는 데 도움이되지 않습니다. 여기 우리는 백테스트 엔진을 지금 사용하고 테스트합니다.
K-라인 기간이 짧을수록 해당 백테스트 결과가 정확하고 필요한 데이터 양이 커집니다. 독자는 원하는 거래 쌍으로 기호 매개 변수를 변경하는 것을 시도 할 수 있습니다.
[241]에서:
기호 =
e = 거래소 ([표], 수수료=0.0002, 초기_금액=10000)
init_price = df.loc[0,
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=[
이 유형의 전략은 또한 비교적 인기가 있지만 FMZ 플랫폼은 멀티 기호 전략을 백테스트하는 데 그다지 좋지 않습니다. 이 백테스트 엔진을 사용하여 시도하십시오. 우리는 BTC, ETH, LTC 및 XRP의 네 개의 주류 통화 기호를 선택하고 각각 시장 가치의 25%를 구성하고 1%의 오차를 모두 균형을 맞추고 있습니다.
먼저, 지난 1년 동안 4개의 기호의 폐쇄 가격을 얻으십시오. ETH가 가장 큰 상승세를 보이고 다른 3개 기호가 비슷한 상승세를 보이는 것을 볼 수 있습니다. 이 4개의 기호를 평균적으로 보유하면 최종 순액은 4.5입니다. 백테스트 후, 균형 전략은 약간 향상된 최종 순액은 5.3입니다.
[290]에서:
기호 = [
거북이 전략은 클래식 트렌드 전략으로 포지션을 추가하기 위해 완전한 스톱 로스 로직을 포함합니다. 자세한 내용은 참조하십시오:https://zhuanlan.zhihu.com/p/27987938우리는 여기서 간단한 버전을 실행해서 백테스트를 합니다.
거북이 전략 기간은 전략에 큰 영향을 미치며, 너무 짧은 기간을 선택하는 것은 바람직하지 않습니다. 여기서는 6h를 선택합니다. 돈치안 채널 기간은 5로 선택되고, 포지션 비율은 백테스트에 따라 0.003로 선택됩니다. 가격이 채널의 업밴드를 뚫고 긴 포지션 1 유닛을 열고, 가격이 포지션을 열고 0.3 변동성을 계속 증가하면 1 유닛을 추가하고 가격이 손실을 막기 위해 최신 오픈 가격의 변동성을 2.5 이하로 떨어집니다. 짧은 주문의 원칙은 동일합니다. ETH의 큰 황소 시장으로 인해 거북이 전략은 주요 추세를 포착하고 궁극적으로 기간 동안 최대 4 배의 이윤을 달성하여 27 배의 이윤을 달성했습니다.
거북이 전략의 매개 변수는 기간과 밀접하게 관련이 있으며 백트 테스트를 통해 선택해야합니다. 또한 높은 위험을 피하기 위해 각 시간 오픈 포지션의 단위가 너무 크지 않도록 주의해야합니다.
최종 순액 차트에서 볼 수 있듯이 거북이 전략은 장기적인 전략이며, 이 과정에서 3~4개월 동안 수익이 없을 수 있으며, 반복적인 스톱 손실이 발생할 수 있지만, 한쪽에서 큰 시장 코팅이 발생하면 거북이 전략은 트렌드를 활용하여 큰 포지션을 축적하고, 트렌드의 끝까지 유지하여 많은 수익을 얻을 수 있습니다. 상승의 끝에서 전략은 많은 포지션을 축적할 것입니다. 이 시점에서 변동성이 상대적으로 크며, 종종 큰 이익이 철수됩니다. 거북이 전략을 사용하는 것은 그 단점과 인내심을 받아들이는 것을 요구합니다.
[424]에서:
기호 =
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=[
만약 당신이 jupyter 노트북 연구 플랫폼을 사용하는 데 능숙하다면, 데이터 획득, 데이터 분석, 전략 백테스트, 차트 표시, 등과 같은 작업을 쉽게 수행할 수 있습니다. 이는 양적 거래의 불가피한 방법입니다. 만약 당신이 지금 전략 작성에 대한 단서가 없다면, 당신은 먼저 데이터를 분석할 수도 있습니다. 초보자를 위해 권장 자원은:
데이터 분석을 위해 파이썬을 사용하세요:https://wizardforcel.gitbooks.io/pyda-2e/content/
파이썬 정량 학습:https://wizardforcel.gitbooks.io/python-quant-uqer/content/
[ ]에서: