주가 분석(SMA) - Backtesting을 사용하여 ROI 계산
15759 단어 SMA주식 가격Pythonbacktesting
개시하다
지난번에 이런 기사를 썼어요.
나는 이번 반격이 얼마나 되는지 시험해 보고 싶다.
되돌아오는 계산입니다. 하지만 지금까지 코코와 거래류 등이 적혀 있습니다. 하지만 Backtesting이라는 편리한 프로그램 라이브러리를 찾았기 때문에 이것을 사용하기로 결정했습니다.
위에 설치된 페이지에도 다음과 같이 쓰여 있다.$ pip install Backtesting
우선 보답을 찾아보도록 하겠습니다.
backtesting을 사용할 때는 Strategy 클래스를 설치해야 합니다.
여기서 우리는 황금십자가의 가격으로 구매하고 덕교차의 가격으로 판매할 것이다.
$ pip install Backtesting
backtesting을 사용할 때는 Strategy 클래스를 설치해야 합니다.
여기서 우리는 황금십자가의 가격으로 구매하고 덕교차의 가격으로 판매할 것이다.
class SmaCross(Strategy):
'''
SMS Cross Strategy
'''
long_term = 75
short_term = 25
def init(self):
close = self.data['Close']
self.long_sma = self.I(talib.SMA, close, self.long_term)
self.short_sma = self.I(talib.SMA, close, self.short_term)
def next(self):
if crossover(self.short_sma, self.long_sma):
self.buy()
elif crossover(self.long_sma, self.short_sma):
self.sell()
그럼, 내가 반격을 요구할게. df = get_stock(TICKER, START_DATE, END_DATE)
bt = Backtest(
df,
SmaCross,
cash=INIT_CASH,
trade_on_close=False,
exclusive_orders=True
)
output = bt.run()
print(output)
bt.plot()
print(output)의 결과입니다.결실
Start 2011-01-04 00:00:00
End 2020-12-30 00:00:00
Duration 3648 days 00:00:00
Exposure Time [%] 94.9775
Equity Final [$] 650714
Equity Peak [$] 1.42691e+06
Return [%] -34.9286
Buy & Hold Return [%] 163.934
Return (Ann.) [%] -4.3251
Volatility (Ann.) [%] 18.8042
Sharpe Ratio 0
Sortino Ratio 0
Calmar Ratio 0
Max. Drawdown [%] -65.8071
Avg. Drawdown [%] -6.89812
Max. Drawdown Duration 2779 days 00:00:00
Avg. Drawdown Duration 192 days 00:00:00
# Trades 41
Win Rate [%] 36.5854
Best Trade [%] 40.7543
Worst Trade [%] -13.8896
Avg. Trade [%] -1.04275
Max. Trade Duration 288 days 00:00:00
Avg. Trade Duration 85 days 00:00:00
Profit Factor 0.806629
Expectancy [%] -0.650414
SQN -0.722688
_strategy SmaCross
_equity_curve ...
_trades Size EntryB...
dtype: object
Return[%]의 행에 응답이 있습니다.결과는 유감스럽게도 마이너스 39.4%였다.bt. plot () 를 통해 거래 결과의 도표를 출력할 수 있습니다.2013년 중반 정점을 맞은 뒤 계속 하락하는 것처럼 보였다.
최적 조합 찾기(1)
Backtest의 optimize 방법을 사용하면 단기와 장기적인 최상의 조합을 찾을 수 있습니다.
stats, heatmap = bt.optimize(
long_term=range(3, MAX_LONG_TERM + 1, 101),
short_term=range(2, MAX_LONG_TERM, 100),
return_heatmap=True,
constraint=lambda p: p.short_term < p.long_term)
stats의 내용은 다음과 같다.결실
Start 2011-01-04 00:00:00
End 2020-12-30 00:00:00
Duration 3648 days 00:00:00
Exposure Time [%] 98.775
Equity Final [$] 1.97874e+06
Equity Peak [$] 1.97939e+06
Return [%] 97.8745
Buy & Hold Return [%] 163.934
Return (Ann.) [%] 7.27493
Volatility (Ann.) [%] 21.6981
Sharpe Ratio 0.33528
Sortino Ratio 0.52895
Calmar Ratio 0.152433
Max. Drawdown [%] -47.7255
Avg. Drawdown [%] -4.58205
Max. Drawdown Duration 2490 days 00:00:00
Avg. Drawdown Duration 108 days 00:00:00
# Trades 141
Win Rate [%] 48.227
Best Trade [%] 35.591
Worst Trade [%] -13.1921
Avg. Trade [%] 0.490535
Max. Trade Duration 192 days 00:00:00
Avg. Trade Duration 26 days 00:00:00
Profit Factor 1.44673
Expectancy [%] 0.629784
SQN 1.34157
_strategy SmaCross(long_te...
_equity_curve ...
_trades Size Entry...
dtype: object
되돌아오다term=23, short_term=17에서 97.9% 증가했다.자산이 대략 두 배로 늘었다.무역의 결과를 도표로 만들다.
bt.plot()
아래와 같이 열지도를 표시할 수 있다.
plot_heatmaps(heatmap, agg='mean', plot_width=2048, filename='heatmap')
long_term=23, short_term=17을 보실 수 있는 곳은 밝은 컬러로 가장 잘 어울리는 곳입니다.최적의 조합 찾기(2)
2~100일 5일 단위로 가장 적합한 조합을 요구하고 있다.나는 이번에 하루 일각씩 250일까지를 찾는 동안항목은 기본적으로 같지만 시간과 각법이 다를 뿐이다.내 컴퓨터로 한 시간 넘게 걸렸다.
stats의 내용은 다음과 같다.수익률은 144.6%, 자산은 약 2.4배다.
결실Start 2011-01-04 00:00:00
End 2020-12-30 00:00:00
Duration 3648 days 00:00:00
Exposure Time [%] 86.2393
Equity Final [$] 2.44551e+06
Equity Peak [$] 2.44631e+06
Return [%] 144.551
Buy & Hold Return [%] 163.934
Return (Ann.) [%] 9.63845
Volatility (Ann.) [%] 21.03
Sharpe Ratio 0.458318
Sortino Ratio 0.731527
Calmar Ratio 0.309028
Max. Drawdown [%] -31.1895
Avg. Drawdown [%] -4.22459
Max. Drawdown Duration 452 days 00:00:00
Avg. Drawdown Duration 50 days 00:00:00
# Trades 13
Win Rate [%] 69.2308
Best Trade [%] 44.9915
Worst Trade [%] -17.4933
Avg. Trade [%] 7.17498
Max. Trade Duration 629 days 00:00:00
Avg. Trade Duration 243 days 00:00:00
Profit Factor 4.90971
Expectancy [%] 8.24431
SQN 2.07852
_strategy SmaCross(long_te...
_equity_curve ...
_trades Size EntryB...
다음은 열映射을 도표로 설정합니다.
오른쪽 위쪽은 밝은 색입니다.이 근처 조합이 좋은 것 같아요.
이 뜨거운 지도지만 축의 라벨이 고장나서 보이지 않는다.색상 등도 조정하고 싶어 세아번(heatmap)으로 차트를 만든다. sns.set(font='IPAexGothic')
d = heatmap.reset_index().pivot('short_term', 'long_term', 'SQN')
fig, ax = plt.subplots(figsize=(12, 9))
sns.heatmap(d, square=True, cmap='seismic', center=0, ax=ax)
ax.set_title('移動平均期間の組み合わせによるSQN')
ax.invert_yaxis()
ax.grid()
plt.show()
빨간색이 진한 곳은 좋은 조합이고, 파란색이 진한 곳은 나쁜 조합이다.
최후
이번에 SMA를 사용하면 장기와 단기 어느 조합이 최적화를 요구합니까?그 결과 144%로 되돌아갔다.이는 자산의 2.4배로, 연리로 따지면 9%(복리)다.
하지만 생각해보면 2011년 당시 10000엔대였던 닛케이 평균 주가는 2020년 말 현재 26000엔대에 이른다.2011년 아무것도 사지 않으면 자산이 2.6배(160% 증가) 증가한다.
이 결과만 보면 SMA 활용 전략이 하나 더 있다고 생각한다.하지만 이번에는 황금십자로 사서 사십자로 파는 간단한 전략이다.다른 전략을 쓰면 결과도 바뀔 것 같아.
이번 소스는 GitHub 위에 놓습니다.
Reference
이 문제에 관하여(주가 분석(SMA) - Backtesting을 사용하여 ROI 계산), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mahoutsukaino-deshi/items/8907a34986804c58724a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Start 2011-01-04 00:00:00
End 2020-12-30 00:00:00
Duration 3648 days 00:00:00
Exposure Time [%] 86.2393
Equity Final [$] 2.44551e+06
Equity Peak [$] 2.44631e+06
Return [%] 144.551
Buy & Hold Return [%] 163.934
Return (Ann.) [%] 9.63845
Volatility (Ann.) [%] 21.03
Sharpe Ratio 0.458318
Sortino Ratio 0.731527
Calmar Ratio 0.309028
Max. Drawdown [%] -31.1895
Avg. Drawdown [%] -4.22459
Max. Drawdown Duration 452 days 00:00:00
Avg. Drawdown Duration 50 days 00:00:00
# Trades 13
Win Rate [%] 69.2308
Best Trade [%] 44.9915
Worst Trade [%] -17.4933
Avg. Trade [%] 7.17498
Max. Trade Duration 629 days 00:00:00
Avg. Trade Duration 243 days 00:00:00
Profit Factor 4.90971
Expectancy [%] 8.24431
SQN 2.07852
_strategy SmaCross(long_te...
_equity_curve ...
_trades Size EntryB...
sns.set(font='IPAexGothic')
d = heatmap.reset_index().pivot('short_term', 'long_term', 'SQN')
fig, ax = plt.subplots(figsize=(12, 9))
sns.heatmap(d, square=True, cmap='seismic', center=0, ax=ax)
ax.set_title('移動平均期間の組み合わせによるSQN')
ax.invert_yaxis()
ax.grid()
plt.show()
이번에 SMA를 사용하면 장기와 단기 어느 조합이 최적화를 요구합니까?그 결과 144%로 되돌아갔다.이는 자산의 2.4배로, 연리로 따지면 9%(복리)다.
하지만 생각해보면 2011년 당시 10000엔대였던 닛케이 평균 주가는 2020년 말 현재 26000엔대에 이른다.2011년 아무것도 사지 않으면 자산이 2.6배(160% 증가) 증가한다.
이 결과만 보면 SMA 활용 전략이 하나 더 있다고 생각한다.하지만 이번에는 황금십자로 사서 사십자로 파는 간단한 전략이다.다른 전략을 쓰면 결과도 바뀔 것 같아.
이번 소스는 GitHub 위에 놓습니다.
Reference
이 문제에 관하여(주가 분석(SMA) - Backtesting을 사용하여 ROI 계산), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mahoutsukaino-deshi/items/8907a34986804c58724a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)