"""
> 黃金交叉是一隻純技術指標，是一個看漲信號，透過兩條移動平均線就能知道是否該做多進場 - [酷外匯](https://kknews.cc/invest/95a5brq.html)
"""
"""
隨著外匯投資交易的流行，黃金交叉已被越來越多地被外匯投資者所使用，經典的黃金交叉主要包括以下幾個因素：
- 日線圖
- 200 日移動平均線：如果移動平均線的周期超過200，它就會變得平坦
- 50 日移動平均線：更「靈活」，更接近於價格行為，移動速度更快

日線圖是黃金交叉策略的關鍵要素。由於黃金交叉是一個比較早的技術指標，當時的信息技術還並不發達，交易者大多傾向於使用日線圖。

這邊以特斯拉股價說明， 藍線 是 200 日均線、紅線 是 50 日均線，當 50 移動平均線升至200移動平均線時，市場進入上漲趨勢

和大多數技術指標一樣，移動平均線也具有一定的滯後性。因此，這意味著圖表上的黃金交叉出現的時候，市場實際上已經在上漲了。

出現上漲趨勢後在低點買入是一種很常見的交易方式，因為此時較慢的那條移動平均線可作為支撐，價格暫時不會下跌，當價格回落至此均線時，可進場做多。
"""
"""
## 實作黃金交叉策略
"""
"""
### 建立框架運行環境
"""
!pip install backtrader backtrader_plotting
import os, sys, argparse
import pandas as pd
import backtrader as bt
import backtrader.analyzers as btanalyzers
from backtrader_plotting import Bokeh
from backtrader_plotting.schemes import Blackly
%matplotlib inline
from shutil import copyfile

copyfile(src = "../input/strategies/GoldenCross.py", dst = "../working/GoldenCross.py")
copyfile(src = "../input/strategies/BuyAndHold.py", dst = "../working/BuyAndHold.py")
from GoldenCross import GoldenCross
# from BuyAndHold import BuyAndHold
"""
### 設定初始環境
"""
cerebro = bt.Cerebro()
cerebro.broker.setcash(1e5)
spy_prices = pd.read_csv('../input/quantitative-trading/SPY.csv', index_col="Date", parse_dates=True)
feed = bt.feeds.PandasData(dataname=spy_prices)
cerebro.adddata(feed)
"""
### 設定策略
"""
cerebro.addstrategy(GoldenCross)
# cerebro.addstrategy(BuyAndHold)
"""
## 設定分析
"""
# 交易分析 (策略勝率)
cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name='TradeAnalyzer')

# 交易基本統計分析
cerebro.addanalyzer(bt.analyzers.PeriodStats, _name='PeriodStats')

# 回落統計
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='DrawDown')

# 期望獲利/標準差
cerebro.addanalyzer(bt.analyzers.SQN, _name='SQN')
"""
## 運行環境
"""
print('投資 > 起始資產 %.2f 💲' % cerebro.broker.getvalue())
cerebro.run()
print('投資 > 結束資產 %.2f 💲' % cerebro.broker.getvalue())
"""
## 繪製圖表
"""
b = Bokeh(style='bar', plot_mode='single', scheme=Blackly())
cerebro.plot(b)