<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 5.5 鐘擺理論 · 鐘擺理論的簡單實現——完美躲過股災和精準抄底 今天給大家簡單介紹一種穩健的投資體系——鐘擺理論的量化模型實現。這里要感謝@進化論一平 的雪球分享:http://xueqiu.com/8510627167/29759691 其中的核心思想是: (1)從買入操作來看:通過找到有效價格區間,要求在價格低估時買入,但這同時又要滿足另一個條件,那就是趨勢必須向上。二者缺一不可。 (2)從賣出操作來看:必須順勢而為,在價格超過有效價格區間以后,如果趨勢不變,不要急于賣出,直到趨勢改變,價格高估再賣出。二者同樣缺一不可。 那么核心問題就是兩個: (1)如何找到有效的價格區間?也就是,如何給出個股的估值?(2)怎樣判斷趨勢? 為了盡量追求簡單,避免太復雜的優化。我這里直接給出兩個問題的簡單判定方法。 (1)根據格雷厄姆的成長價值公式進行估值,并且根據A股的實際情況或者市場情緒給予一定溢價或者折價。價值=當期(正常)利潤×(8.5 + 兩倍的預期年增長率),其中的當期利潤使用每股收益EPS進行衡量,預期年增長率使用EGRO/5表示,其中EGRO的計算方法為5年收益關于時間(年)進行線性回歸的回歸系數/5年收益均值的絕對值 (2)判斷趨勢有兩種途徑結合,一種是趨勢已經向上,比較簡單判斷方法是五日線在十日線之上(這種判斷方法犯錯的幾率較大,讀者可以自行改進),另外一種是趨勢由下向上逆轉,即出現明顯的底部形態。關于后者,我給出的判斷標準為:股價相對于近期高點大幅下跌超過downPercent(例如30%),并且收盤價在五日線十日線之下,并且收紅或者收星,跌幅小于7% 接下來就是具體實現了。 ```py def preceding_date(date): cal = DataAPI.TradeCalGet(exchangeCD=u"XSHG",beginDate='20110101',endDate=date,field=['calendarDate','isOpen'],pandas="1") cal = cal[cal['isOpen']==1] date = cal['calendarDate'].values[-2].replace('-','') return date def duotou_5_10(date, stockList, precedingDate=True): if precedingDate: date = preceding_date(date) duotou = {} if stockList is None or len(stockList) == 0: return duotou kLine = DataAPI.MktStockFactorsOneDayGet(tradeDate=date,secID=stockList,field=['secID','MA5','MA10'],pandas="1") kLine = kLine.dropna() for stock, ma5, ma10 in zip(kLine['secID'].values, kLine['MA5'].values, kLine['MA10'].values): if ma5 > ma10: duotou[stock] = True else: duotou[stock] = False return duotou def spreadRateByIntrinsicValue(account, overflow=0.0, precedingDate=True): stock_list = account.universe current_date = account.current_date date = current_date.strftime('%Y%m%d') if precedingDate: date = preceding_date(date) eq_EPS_EGRO = DataAPI.MktStockFactorsOneDayGet(tradeDate=date,secID=stock_list,field=['secID','EPS','EGRO'],pandas="1") eq_EPS_EGRO['Value'] = eq_EPS_EGRO['EPS']*(8.5+2*eq_EPS_EGRO['EGRO']/5) eq_EPS_EGRO = eq_EPS_EGRO.dropna() spread_rate = [] for stock, intrinsic_value in zip(eq_EPS_EGRO['secID'].values, eq_EPS_EGRO['Value'].values): intrinsic_value = intrinsic_value*(1+overflow) reference_price = account.referencePrice[stock] if reference_price > 0 and reference_price < intrinsic_value: spread_rate.append((stock, (intrinsic_value-reference_price)/reference_price)) return sorted(spread_rate, key=lambda k: k[-1], reverse=True) ''' 判斷是否為底部形態,判斷標準為股價相對于近期高點大幅下跌超過downPercent,并且收盤價在五日線十日線之下,并且收紅或者收星,跌幅小于7% ''' def isButtom(date, stockList, precedingDate=True, downPercent=0.3): cal = DataAPI.TradeCalGet(exchangeCD=u"XSHG",beginDate='20110101',endDate=date,field=u"prevTradeDate",pandas="1") daysAhead = cal['prevTradeDate'].values[-20].replace('-','') if precedingDate: date = cal['prevTradeDate'].values[-1].replace('-','') rs = {} if stockList is None or len(stockList) == 0: return rs dayInfo = DataAPI.MktEqudAdjGet(secID=stockList, beginDate=daysAhead, endDate=date ,field=['secID', 'openPrice', 'closePrice', 'preClosePrice'],pandas="1") dayInfo.dropna() for stock in stockList: stockDayInfo = dayInfo[dayInfo['secID']==stock] closePrices = stockDayInfo['closePrice'].values ma5 = np.mean(closePrices[-5:]) ma10 = np.mean(closePrices[-10:]) closePrice = closePrices[-1] maxClosePrice = np.max(closePrices) openPrice = stockDayInfo['openPrice'].values[-1] preClosePrice = stockDayInfo['preClosePrice'].values[-1] if (maxClosePrice-closePrice)/maxClosePrice > downPercent and closePrice < ma5 and ma5 < ma10 and (closePrice > openPrice or abs(closePrice-openPrice)/openPrice < 0.02) and abs(closePrice-preClosePrice)/preClosePrice<0.07: rs[stock] = True else: rs[stock] = False return rs ``` ```py import numpy as np start = '2013-01-01' # 回測起始時間 end = '2015-10-01' # 回測結束時間 benchmark = 'HS300' # 策略參考標準 commission = Commission(buycost=0.0008, sellcost=0.0018) # 傭金萬八 universe = set_universe('CYB',date=end) # Very Important Here!! 選股很重要!不要玩大爛臭!估值再低也別玩! capital_base = 1000000 # 起始資金 freq = 'd' # 策略類型,'d'表示日間策略使用日線回測,'m'表示日內策略使用分鐘線回測 refresh_rate = 1 # 調倉頻率,表示執行handle_data的時間間隔,若freq = 'd'時間間隔的單位為交易日,若freq = 'm'時間間隔為分鐘 max_percent_of_a_stock = 1.0 # 單支股的最大倉位 def initialize(account): # 初始化虛擬賬戶狀態 pass def handle_data(account): # 每個交易日的買入賣出指令 global max_percent_of_a_stock buylist = [] selist = [] current_date = account.current_date current_date = current_date.strftime('%Y%m%d') overflow = 0.15 # 根據情況給予一定的溢價(例如0.1)或者折價(例如-0.1),也可以根據市場風險程度進行動態調節(此處讀者可以自行發揮) spread_rate = dict(spreadRateByIntrinsicValue(account, overflow=overflow, precedingDate=True)) referencePortfolioValue = account.referencePortfolioValue # 獲取用來計算多頭形態的股票列表 stock_set_for_duotou = [] stock_set_for_duotou.extend(account.avail_secpos.keys()) stock_set_for_duotou.extend(spread_rate.keys()) stock_set_for_duotou = list(set(stock_set_for_duotou)) duotou_5_10_Map = duotou_5_10(current_date, stock_set_for_duotou, precedingDate=True) isButtom_Map = isButtom(current_date, stock_set_for_duotou, precedingDate=True, downPercent=0.3) for stock in account.avail_secpos.keys(): if stock not in spread_rate and not duotou_5_10_Map.get(stock, False): selist.append(stock) for stock in selist: sell_value = account.referencePrice[stock]*account.valid_secpos[stock] order_to(stock, 0) for stock in spread_rate.keys(): if stock not in account.valid_secpos: buylist.append(stock) for stock in buylist: # 滿足以下條件之一買入:(1)5日線在10日線之上;(2)出現底部特征 if duotou_5_10_Map.get(stock, False) or isButtom_Map.get(stock, False): buy_value = min(referencePortfolioValue*max_percent_of_a_stock, account.cash/len(buylist)) if buy_value/referencePortfolioValue >= 0.0001: order_pct(stock, buy_value/referencePortfolioValue) ``` ![](https://box.kancloud.cn/2016-07-30_579cbdac5fc2c.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>

                              哎呀哎呀视频在线观看