<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 技術分析入門 —— 雙均線策略 > 來源:https://uqer.io/community/share/554051bbf9f06c1c3d687fac > 本篇中,我們將通過技術分析流派中經典的“雙均線策略”,向大家展現如何在量化實驗室中使用Python測試自己的想法,并最終將它轉化為策略! ## 1. 準備工作 一大波Python庫需要在使用之前被導入: + `matplotlib` 用于繪制圖表 + `numpy` 時間序列的計算 + `pandas` 處理結構化的表格數據 + `DataAPI` 通聯數據提供的數據API + `seaborn` 用于美化matplotlib圖表 ```py from matplotlib import pylab import numpy as np import pandas as pd import DataAPI import seaborn as sns sns.set_style('white') ``` 我們的關注點是關于一只ETF基金的投資:華夏上證50ETF,代碼:`510050.XSHG`。我們考慮的回測周期: + 起始:2008年1月1日 + 結束:2015年4月23日 這里我們使用數據API函數`MktFunddGe`t獲取基金交易價格的日線數據,最后獲得`security`是`pandas`下的`DataFrame`對象: ```py secID = '510050.XSHG' start = '20080101' end = '20150423' security = DataAPI.MktFunddGet(secID, beginDate=start, endDate=end, field=['tradeDate', 'closePrice']) security['tradeDate'] = pd.to_datetime(security['tradeDate']) security = security.set_index('tradeDate') security.info() <class 'pandas.core.frame.DataFrame'> DatetimeIndex: 1775 entries, 2008-01-02 00:00:00 to 2015-04-23 00:00:00 Data columns (total 1 columns): closePrice 1775 non-null float64 dtypes: float64(1) ``` 最近5天的收盤價如下: ```py security.tail() ``` | | closePrice | | --- | --- | | tradeDate | | | 2015-04-17 | 3.185 | | 2015-04-20 | 3.103 | | 2015-04-21 | 3.141 | | 2015-04-22 | 3.241 | | 2015-04-23 | 3.212 | 適當的圖表可以幫助研究人員直觀的了解標的的歷史走勢,這里我們直接借助`DataFrame`的`plot`成員: ```py security['closePrice'].plot(grid=False, figsize=(12,8)) sns.despine() ``` ![](https://box.kancloud.cn/2016-07-30_579cbb012558a.png) ## 2. 策略描述 > 這里我們以經典的“雙均線”策略為例,講述如何使用量化實驗室進行分析研究。 這里我們使用的均線定義為: + 短期均線: `window_short = 20`,相當于月均線 + 長期均線: `window_long = 120`,相當于半年線 + 偏離度閾值: `SD = 5%`,區間寬度,這個會在后面有詳細解釋 計算均值我們借助了`numpy`的內置移動平均函數:`rolling_mean` ```py window_short = 20 window_long = 120 SD = 0.05 security['short_window'] = np.round(pd.rolling_mean(security['closePrice'], window=window_short), 2) security['long_window'] = np.round(pd.rolling_mean(security['closePrice'], window=window_long), 2) security[['closePrice', 'short_window', 'long_window']].tail() ``` | | closePrice | short_window | long_window | | --- | --- | | tradeDate | | | | | 2015-04-17 | 3.185 | 2.82 | 2.30 | | 2015-04-20 | 3.103 | 2.85 | 2.31 | | 2015-04-21 | 3.141 | 2.87 | 2.33 | | 2015-04-22 | 3.241 | 2.90 | 2.34 | | 2015-04-23 | 3.212 | 2.93 | 2.35 | 仍然地,我們可以把包含收盤價的三條線畫到一張圖上,看看有沒有什么啟發? ```py security[['closePrice', 'short_window', 'long_window']].plot(grid=False, figsize=(12,8)) sns.despine() ``` ![](https://box.kancloud.cn/2016-07-30_579cbb013bf1b.png) ### 2.1 定義信號 > 買入信號: 短期均線高于長期日均線,并且超過 `SD` 個點位; > > 賣出信號: 不滿足買入信號的所有情況; 我們首先計算短期均線與長期均線的差`s-l`,這樣的向量級運算,在`pandas`中可以像普通標量一樣計算: ```py security['s-l'] = security['short_window'] - security['long_window'] security['s-l'].tail() tradeDate 2015-04-17 0.52 2015-04-20 0.54 2015-04-21 0.54 2015-04-22 0.56 2015-04-23 0.58 Name: s-l, dtype: float64 ``` 根據`s-l`的值,我們可以定義信號: + `s?l>SD×long_window`,支持買入,定義`Regime`為`True` + 其他情形下,賣出信號,定義`Regime`為`False` ```py security['Regime'] = np.where(security['s-l'] > security['long_window'] * SD, 1, 0) security['Regime'].value_counts() 0 1394 1 381 dtype: int64 ``` 上面的統計給出了總共有多少次買入信號,多少次賣出信號。 下圖給出了信號的時間分布: ```py security['Regime'].plot(grid=False, lw=1.5, figsize=(12,8)) pylab.ylim((-0.1,1.1)) sns.despine() ``` ![](https://box.kancloud.cn/2016-07-30_579cbb015a874.png) 我們可以在有了信號之后執行買入賣出操作,然后根據操作計算每日的收益。這里注意,我們計算策略收益的時候,使用的是當天的信號乘以次日的收益率。這是因為我們的決定是當天做出的,但是能享受到的收益只可能是第二天的(如果用當天信號乘以當日的收益率,那么這里面就有使用未來數據的問題)。 ```py security['Market'] = np.log(security['closePrice'] / security['closePrice'].shift(1)) security['Strategy'] = security['Regime'].shift(1) * security['Market'] security[['Market', 'Strategy', 'Regime']].tail() ``` | | Market | Strategy | Regime | | --- | --- | | tradeDate | | | | | 2015-04-17 | 0.012638 | 0.012638 | 1 | | 2015-04-20 | -0.026083 | -0.026083 | 1 | | 2015-04-21 | 0.012172 | 0.012172 | 1 | | 2015-04-22 | 0.031341 | 0.031341 | 1 | | 2015-04-23 | -0.008988 | -0.008988 | 1 | 最后我們把每天的收益率求和就得到了最后的累計收益率(這里因為我們使用的是指數收益率,所以將每日收益累加是合理的),這個累加的過程也可以通過`DataFrame`的內置函數`cumsum`輕松完成: ```py security[['Market', 'Strategy']].cumsum().apply(np.exp).plot(grid=False, figsize=(12,8)) sns.despine() ``` ![](https://box.kancloud.cn/2016-07-30_579cbb016ded1.png) ## 3 使用`quartz`實現策略 上面的部分介紹了從數據出發,在量化實驗室內研究策略的流程。實際上我們可以直接用量化實驗室內置的`quartz`框架。`quartz`框架為用戶隱藏了數據獲取、數據清晰以及回測邏輯。用戶可以更加專注于策略邏輯的描述: ```py start = datetime(2008, 1, 1) # 回測起始時間 end = datetime(2015, 4, 23) # 回測結束時間 benchmark = 'SH50' # 策略參考標準 universe = ['510050.XSHG'] # 股票池 capital_base = 100000 # 起始資金 commission = Commission(0.0,0.0) window_short = 20 window_long = 120 longest_history = window_long SD = 0.05 def initialize(account): # 初始化虛擬賬戶狀態 account.fund = universe[0] account.SD = SD account.window_short = window_short account.window_long = window_long def handle_data(account): # 每個交易日的買入賣出指令 hist = account.get_history(longest_history) fund = account.fund short_mean = np.mean(hist[fund]['closePrice'][-account.window_short:]) # 計算短均線值 long_mean = np.mean(hist[fund]['closePrice'][-account.window_long:]) #計算長均線值 # 計算買入賣出信號 flag = True if (short_mean - long_mean) > account.SD * long_mean else False if flag: if account.position.secpos.get(fund, 0) == 0: # 空倉時全倉買入,買入股數為100的整數倍 approximationAmount = int(account.cash / hist[fund]['closePrice'][-1]/100.0) * 100 order(fund, approximationAmount) else: # 賣出時,全倉清空 if account.position.secpos.get(fund, 0) >= 0: order_to(fund, 0) ``` ![](https://box.kancloud.cn/2016-07-30_579cbb0185237.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看