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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 學習筆記:可模擬(小市值+便宜 的修改版) > 來源:https://uqer.io/community/share/566e867d228e5b7b41cfaf01 ```py #小市值,低股價可模擬策略 import numpy as np from heapq import nlargest, nsmallest from CAL.PyCAL import * import operator start = '2015-01-01' end = '2015-11-25' benchmark = 'HS300' # 策略參考標準 #以滬深300、中證500、創業板的并集為股票池(中間存在一定交叉,因此需要去掉重復項) universe = list(set(set_universe('HS300')+set_universe('ZZ500')+set_universe('CYB'))) capital_base = 10000 stk_num = 10 # 持倉股票數量 refresh_rate = 1 def initialize(account): pass def handle_data(account): cal = Calendar('China.SSE') # ----------------- 清洗universe -------------------------------- date = account.current_date #類型為datetime Date.fromDateTime(datetime) 將datetime轉為Date,反過來 Date.toDateTime()將Date轉為datetime yesterday = cal.advanceDate(date, '-1B', BizDayConvention.Following) yesterday = datetime(yesterday.year(), yesterday.month(), yesterday.dayOfMonth()).strftime('%Y%m%d') fivedays = cal.advanceDate(date, '-5B', BizDayConvention.Following) fivedays = datetime(fivedays.year(), fivedays.month(), fivedays.dayOfMonth()).strftime('%Y%m%d') # 選出可用的300只市值最小的股票(如過用 universe = StockScreener(Factor('LCAP').nsmall(300))則不能進行模擬) # MktStockFactorsOneDayGet函數支持的股票池長度有限,所以分兩次合成Dataframe LCAP = DataAPI.MktStockFactorsOneDayGet(tradeDate=yesterday,secID=account.universe[0:len(account.universe)/2],field=['LCAP','secID']) LCAP = LCAP.append(DataAPI.MktStockFactorsOneDayGet(tradeDate=yesterday,secID=account.universe[len(account.universe)/2:],field=['LCAP','secID'])) LCAP = LCAP.sort_index(by = 'LCAP') #這里我們將股票池轉移到自己定義的my_universe中,不能修改account.universe,因為一旦修改則會導致模擬無法正常進行 my_universe =[i for i in LCAP['secID']][0:300] # 去除ST股 try: STlist = DataAPI.SecSTGet(secID=my_universe, beginDate=yesterday, endDate=yesterday, field=['secID']).tolist() my_universe = [s for s in my_universe if s not in STlist] except: pass # 去除流動性差的股票 tv = account.get_attribute_history('turnoverValue', 20) mtv = {sec: sum(tvs)/20. for sec,tvs in tv.items()} my_universe = [s for s in my_universe if mtv.get(s, 0) >= 10000000] # 去除新上市或復牌的股票 opn = account.get_attribute_history('openPrice', 1) my_universe = [s for s in my_universe if not (np.isnan(opn.get(s, 0)[0]) or opn.get(s, 0)[0] == 0)] # 去除弱勢股票 hist_prices = account.get_attribute_history('closePrice', 5) hist_returns = {sec: hist_prices[sec][-1]/hist_prices[sec][0] for sec in hist_prices.keys()} my_universe = [s for s in my_universe if hist_returns.get(s, 0) > 0.96] #選出價格最小的stk_num*2只股票 bucket = {} for stk in my_universe: bucket[stk] = account.referencePrice[stk] '''這里我們其實取了股價最低的 stk_num*2 只,原因在于:如果取stk_num只, 那么一旦遇到漲停停牌等買不進的情況,就跪了;所以我們拿stk_num*2 數量的股票, 但是卻將倉位分成stk_num份,買進可以交易的前stk_num只股票''' buy_list = nsmallest(stk_num*2, bucket, key=bucket.get) # ----------------- 調倉邏輯 -------------------------------- clo = account.get_attribute_history('closePrice', 5) target_increase1 = sum(clo[stk][-1] for stk in buy_list)/sum(clo[stk][-2] for stk in buy_list) target_increase2 = sum(clo[stk][-2] for stk in buy_list)/sum(clo[stk][-3] for stk in buy_list) target_increase5 = sum(clo[stk][-1] for stk in buy_list)/sum(clo[stk][0] for stk in buy_list) dapan = DataAPI.MktIdxdGet(ticker=u"000300",beginDate=fivedays,endDate=yesterday,field=['closeIndex'],pandas="1") dapan_increase = dapan['closeIndex'][4] / dapan['closeIndex'][0] #止損邏輯,主要根據:最近兩天的合計漲跌幅、上一天與五天前的合計漲跌幅、大盤的5天漲跌幅來作為限制條件 #滿足條件則買入股票 if dapan_increase >= 0.963 and target_increase1 >= 0.963 and target_increase2 >= 0.963 and target_increase5 >= 0.963: # 目前持倉中不在buy_list中的股票,清倉 for stk in account.valid_secpos: if stk not in buy_list: order_to(stk, 0) money = account.referencePortfolioValue / stk_num for stk in buy_list: #不夠一手最少買一手 order_to(stk, max(int(money / account.referencePrice[stk] / 100),1) * 100) #不滿止損條件則清倉 else: for stk in account.valid_secpos: order_to(stk,0) return ``` ![](https://box.kancloud.cn/2016-07-30_579cbdb09419b.jpg) 本文主要是為了分享學習心得,希望能對和我一樣的新人有所幫助。 寫本文的動機主要是: 一、自己也是近期在優礦上開始模擬研究策略,覺得優礦提供的接口非常全面,并且注釋詳盡,讓我這個新手對如何用python編寫策略很快有了一個直觀的認識(當然并不深入,但這已經非常好了),在量化這個本身就比較高門檻的領域,優礦能讓新人有這種感覺和體驗是十分難得和至關重要的,尤其在學習過程中,這是必不可少的一部分。 二、“為策略寫代碼注釋是一個不錯的學習方式”,這是一位朋友和我推薦的方法,這里也用自己的親身體驗和大家分享一下這個方法(大神請忽略我哈),確實對剛開是學習有很大幫助。 社區中有一篇“小市值+便宜就是Alpha”的策略,但是因為接口的原因不能模擬,剛好就以此為例:自己在給策略添加注釋的同時,也將這個策略進行了一下修改,最終可以實現模擬運行,并可以考慮根據每天的交易信號實盤跟單。 本人是新人菜鳥,不足之處請大家多多見諒,多多批評指正,謝謝。
                  <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>

                              哎呀哎呀视频在线观看