<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 策略探討(更新):價量結合+動量反轉 > 來源:https://uqer.io/community/share/55b6f4d2f9f06c91fb18c5cd 前篇簡介: + 在前一篇文章中,對策略理念和流程大致走了一遍 + 對quartz中的參數優化過程以及簡單策略分析也做了簡單示例 仍存在的問題: + 前一篇中代碼細節問題修正 + 停牌數據問題以及其他小細節 + 收益波動性太大、熊市不抗跌 下面就結合實際情況,對上述問題進行逐個分析 + 沒有看前篇的,點此鏈接https://uqer.io/community/share/55b1f886f9f06c91f918c5d1 ```py # step1:前篇代碼細節修正 # 如前篇描述,(-inf,negative2,negative1,postive1,positive2,inf)將整個數軸分成了5個區間段,從左到右,每個區間段分別代表(long,short,nothing,long,short)操作 # 而在前篇的代碼中忽略掉了小細節,將修正后的部分代碼簡單展示如下: signal = closeprice[stk][-1]/wp - 1 if stk in account.valid_secpos and (signal > positive2 or negative2 < signal < negative1): selllist.append(stk) elif stk not in account.valid_secpos and (positive2 > signal > positive1 or signal < negative2): buylist.append(stk) ``` step2:數據質量問題再分析 + 首先分析一下數據細節問題,策略中唯一要計算的指標是加權平均價,要用到過去一段時間的收盤價和成交量,倘若過去時間里有停牌呢? + 之前的簡單處理是,若全部停牌會導致wp計算出來為nan,然后把它舍棄掉,但是倘若過去所用的時間段內剛巧只有一天是沒停牌的呢? + 查看DataAPI原始數據發現,停牌時,收盤價是filldown處理的,當日成交量是為0的 + 所以要保證所計算出來的加權平均價wp的相對合理性,必須要保證所計算的過去數據的有效性,這里的處理是:若停牌天數超過window/2時,則不進行任何操作 ? ```py # step2對應的代碼修改部分(非運行代碼,只做展示說明,下同) .... for stk in account.universe: if sum(volumn[stk] > 0) <= window/2: continue .... ``` step3:收益波動性太大 + 如前篇描述,(-inf,negative2,negative1,postive1,positive2,inf)將整個數軸分成了5個區間段,從左到右,每個區間段分別代表(long,short,nothing,long,short)操作 + 結合實際考慮,股市里目前沒有實際的short操作,回測的策略只是LongOnly,對應的short信號只是賣掉持有的股票,所以要結合實際對信號做一些更改 + 整體思路是:買入的信號不變,short的信號是賣掉手中股票的信號,而并不是開空倉的信號,因為即使預測對了下跌也是賺不到錢的 + 改進點是: negative1變為0 ```py # step3:對應要修改的代碼 negative1 = 0 ``` step4:熊市不抗跌 + 遇到熊市時,可以考慮設置止損線,雖然不能做空,但是降低倉位可以逃過一部分損失 + 止損條件有兩點考慮:一是現有組合市值短期虧損比較大就止損;二是大盤過去一段時間里下跌很多,要止損(近似于宏觀擇時操作) + 止損條件1:當滬深300在過去3周累計下跌超過10%時,下一期不持倉 + 止損條件2:當組合凈值在過去3周累計縮水超過10%或者在過去一周累計縮水5%,下一期不持倉 ```py from datetime import datetime, timedelta import numpy as np start = '2006-01-01' # 回測起始時間 # end = '2015-01-01' today = datetime.today() delta = timedelta(days = -1) end = (today+delta).strftime('%Y-%m-%d') benchmark = 'HS300' # 策略參考標準 universe = set_universe('SH50') # 證券池,回測支持股票和基金 capital_base = 10000000 # 起始資金 refresh_rate = 5 # 調倉頻率,即每 refresh_rate 個交易日執行一次 handle_data() 函數 window = 20 # 取過去行情數據 positive2 = 0.1 # 信號突破比例閾值 negative2 = -0.1 positive1 = 0.01 negative1 = 0 stoploss_percent = 0 def initialize(account): # 初始化虛擬賬戶狀態 account.portfoliovalue = [] #記錄組合市值 def handle_data(account): # 每個交易日的買入賣出指令 # 止損判斷 hs300 = account.get_symbol_history('benchmark',window)['closeIndex'] account.portfoliovalue.append(account.referencePortfolioValue) if hs300[-1]/hs300[-16] - 1 < -0.1: # 止損條件1 for stk in account.valid_secpos: order_to(stk,0) return if len(account.portfoliovalue) < 4: # 止損條件2 pass elif account.portfoliovalue[-1]/account.portfoliovalue[-4] - 1 <= -0.1 or account.portfoliovalue[-1]/account.portfoliovalue[-2] - 1 <= -0.05: for stk in account.valid_secpos: order_to(stk,0) return # 取行情 closeprice = account.get_attribute_history('closePrice',window) volumn = account.get_attribute_history('turnoverVol',window) reference_p = account.referencePrice # 參考價 cash = account.cash # 剩余現金 # 計算買入賣出 buylist = [] selllist = [] for stk in account.universe: if sum(volumn[stk] > 0) <= window/2: continue wp = np.dot(closeprice[stk], volumn[stk]/sum(volumn[stk])) # 成交量加權價 signal = closeprice[stk][-1]/wp - 1 if stk in account.valid_secpos and (signal > positive2 or negative2 < signal < negative1): selllist.append(stk) elif positive2 > signal > positive1 or signal < negative2: buylist.append(stk) # 賣出下單 for stk in selllist: order_to(stk,0) cash = cash + account.valid_secpos[stk] * reference_p[stk] # 買單分解為需要新買的+已有持倉的 holds = [stk for stk in account.valid_secpos if stk not in selllist] new_buy = [stk for stk in buylist if stk not in holds] # 買入操作 for stk in new_buy: order(stk,int(cash/len(new_buy)/reference_p[stk])) ``` ![](https://box.kancloud.cn/2016-07-30_579cbdab627fc.jpg) + 可以看到,加入簡單的止損后,策略效果有明顯改善,尤其是在07年~08年熊市階段,躲過了很多下跌 + 同時也看到,在最近的大跌行情中表現一般,主要原因是周度策略,一周換一次倉,周中的大跌是難以避免的,一個好的做法是考慮周中止損,這一點可以自行嘗試 + 除了直接的止損外,還可以考慮加入擇時,比如預測漲就全倉,預測跌就1/3倉位等,上面展示的只是最簡單的想法,更細致的東西還有待去研究
                  <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>

                              哎呀哎呀视频在线观看