1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        B站熱榜視頻,炒股源碼來了!

        共 7906字,需瀏覽 16分鐘

         ·

        2021-09-10 15:12

        視頻中,承諾的量化交易教程,它來了!

        9dcb542ffcb8936d6e6da7a6bcaf8b71.webp

        這期視頻播放近 70 多萬,后來經(jīng)過 B 站編輯老師的建議,我對視頻的部分內(nèi)容進(jìn)行了刪減。

        視頻中,我提到,后續(xù)我會曬實倉情況,這個行為存在政策風(fēng)險。

        其實,很多好心讀者也都提醒過我,這樣不妥,很容易造成粉絲跟盤。

        所以,后面我就不公布自己的實倉情況了,我們只探討量化交易技術(shù)本身。

        希望各位理解。

        同時,我自己改進(jìn)的量化交易算法,里面有一些激進(jìn)的選股策略,會在我人為圈定的 top20 的股池中,投票選擇得分高的幾只股票進(jìn)行買賣。

        這個也存在一個問題:

        假如這篇文章,一萬人閱讀,10% 的人,也就是 1000 人跑了這個算法,并真投了一萬元。

        這也會造成極端情況下,同一時刻,一起交易一千萬的情況。這樣也是不好的。

        所以,今天要說的這個量化交易算法,是我之前測試過的一個基礎(chǔ)版策略,也是別人開源過的。

        原理都弄懂,你也可以自己改進(jìn)策略。

        這個量化交易策略,8 年回測,收益 715.44%,最大回撤 28%。

        a10069f57623c00d8855d2bd5b26ebbe.webp

        OK,進(jìn)入我們今天的正題,量化交易。

        聚寬

        我目前使用的是聚寬平臺,這里也就以它為例進(jìn)行講解。

        https://www.joinquant.com/

        PS:有聚寬工作的朋友嗎?廣告費(fèi)記得結(jié)一下。

        聚寬是一個量化交易平臺,在這個平臺有很多開源的量化交易策略,社區(qū)不錯。

        同時,使用這個平臺,還可以回測我們實現(xiàn)的策略。

        b3e87265501c1cdf11985bee037fe9de.webp

        左邊寫好代碼,選擇時間和金額,就可以使用歷史數(shù)據(jù)進(jìn)行回測。

        因為涉及到編寫代碼,所以你必須具備 Python 編程基礎(chǔ)。

        沒有 Python 基礎(chǔ)的小伙伴,先看我的 Python 入門視頻吧:

        https://www.bilibili.com/video/BV1Sh411a76E/

        一定要先好好學(xué) Python,無論你是不是程序員,都很有用。

        屬于,好學(xué)又實用的編程語言。

        聚寬平臺,有兩個 api,可以使用。

        一個是在聚寬平臺使用的 api:

        https://www.joinquant.com/help/api/help#api:API%E6%96%87%E6%A1%A3

        如果你是在網(wǎng)頁,進(jìn)行回測,那就需要使用這個 api。

        另一個,就是本地化數(shù)據(jù) JQData:

        https://www.joinquant.com/help/api/help#JQData:JQData

        這個 api 是我平時使用的本地化服務(wù)接口,只需要 pip 安裝一下,就可以本地環(huán)境調(diào)用接口,獲取數(shù)據(jù)了。

        如果你有 Python 基礎(chǔ),那我想這兩份 api 使用起來,應(yīng)該很簡單。

        ETF 動量輪動

        今天要講的這個量化交易策略,就是在聚寬社區(qū),其他人開源的量化交易算法,起了個名字,叫 ETF 動量輪動。

        其實,就是一種長期定投 ETF 的策略,定投大法好。

        策略核心有兩塊,選哪個 ETF,以及何時買賣。

        我將這個策略進(jìn)行了重構(gòu),用本地化數(shù)據(jù) JQData 的 api 進(jìn)行了重寫。

        我對每一行代碼,都進(jìn)行了詳細(xì)的注釋,并羅列了每個知識點(diǎn),可以參考的文章。

        直接看代碼吧!

        #-*-?codig:utf-8?-*-
        import?jqdatasdk?as?jq
        from?datetime?import?datetime,?timedelta
        import?time
        import?numpy?as?np
        import?math

        #?https://www.joinquant.com/help/api/help#api:API%E6%96%87%E6%A1%A3
        #?https://www.joinquant.com/help/api/help#JQData:JQData

        #?aa?為你自己的帳號,?bb?為你自己的密碼
        jq.auth('aa','bb')

        #?http://fund.eastmoney.com/ETFN_jzzzl.html
        stock_pool?=?[
        ????'159915.XSHE',?#?易方達(dá)創(chuàng)業(yè)板ETF
        ????'510300.XSHG',?#?華泰柏瑞滬深300ETF
        ????'510500.XSHG',?#?南方中證500ETF
        ]

        #?動量輪動參數(shù)
        stock_num?=?1???????????#?買入評分最高的前 stock_num 只股票
        momentum_day?=?29???????#?最新動量參考最近?momentum_day?的

        ref_stock?=?'000300.XSHG'?#用?ref_stock?做擇時計算的基礎(chǔ)數(shù)據(jù)
        N?=?18?#?計算最新斜率?slope,擬合度?r2?參考最近?N?天
        M?=?600?#?計算最新標(biāo)準(zhǔn)分?zscore,rsrs_score?參考最近?M?天
        score_threshold?=?0.7?#?rsrs?標(biāo)準(zhǔn)分指標(biāo)閾值
        #?ma?擇時參數(shù)
        mean_day?=?20?#?計算結(jié)束?ma?收盤價,參考最近?mean_day
        mean_diff_day?=?3?#?計算初始?ma?收盤價,參考(mean_day?+?mean_diff_day)天前,窗口為?mean_diff_day?的一段時間

        day?=?1

        #?1-1?選股模塊-動量因子輪動?
        #?基于股票年化收益和判定系數(shù)打分,并按照分?jǐn)?shù)從大到小排名
        def?get_rank(stock_pool):
        ????score_list?=?[]
        ????for?stock?in?stock_pool:
        ????????current_dt?=?time.strftime("%Y-%m-%d",?time.localtime())
        ????????current_dt?=?datetime.strptime(current_dt,?'%Y-%m-%d')
        ????????previous_date??=?current_dt?-?timedelta(days?=?day)
        ????????data?=?jq.get_price(stock,?end_date?=?previous_date,?count?=?momentum_day,?frequency='daily',?fields=['close'])
        ????????#?收盤價
        ????????y?=?data['log']?=?np.log(data.close)
        ????????#?分析的數(shù)據(jù)個數(shù)(天)
        ????????x?=?data['num']?=?np.arange(data.log.size)
        ????????#?擬合?1?次多項式
        ????????#?y?=?kx?+?b,?slope?為斜率?k,intercept?為截距?b
        ????????slope,?intercept?=?np.polyfit(x,?y,?1)
        ????????#?(e?^?slope)?^?250?-?1
        ????????annualized_returns?=?math.pow(math.exp(slope),?250)?-?1
        ????????r_squared?=?1?-?(sum((y?-?(slope?*?x?+?intercept))**2)?/?((len(y)?-?1)?*?np.var(y,?ddof=1)))
        ????????score?=?annualized_returns?*?r_squared
        ????????score_list.append(score)
        ????stock_dict?=?dict(zip(stock_pool,?score_list))
        ????sort_list?=?sorted(stock_dict.items(),?key?=?lambda?item:item[1],?reverse?=?True)
        ????print("#"?*?30?+?"候選"?+?"#"?*?30)
        ????for?stock?in?sort_list:
        ????????stock_code?=?stock[0]
        ????????stock_score?=?stock[1]
        ????????security_info?=?jq.get_security_info(stock_code)
        ????????stock_name?=?security_info.display_name
        ????????print('{}({}):{}'.format(stock_name,?stock_code,?stock_score))
        ????print('#'?*?64)
        ????code_list?=?[]
        ????for?i?in?range((len(stock_pool))):
        ????????code_list.append(sort_list[i][0])
        ????rank_stock?=?code_list[0:stock_num]
        ????return?rank_stock

        #?2-1?擇時模塊-計算線性回歸統(tǒng)計值
        #?對輸入的自變量每日最低價?x(series)?和因變量每日最高價?y(series)?建立?OLS?回歸模型,返回元組(截距,斜率,擬合度)
        # R2 統(tǒng)計學(xué)線性回歸決定系數(shù),也叫判定系數(shù),擬合優(yōu)度。
        # R2 范圍?0?~ 1,擬合優(yōu)度越大,自變量對因變量的解釋程度越高,越接近 1 越好。
        #?公式說明:https://blog.csdn.net/snowdroptulip/article/details/79022532
        #???????????https://www.cnblogs.com/aviator999/p/10049646.html
        def?get_ols(x,?y):
        ????slope,?intercept?=?np.polyfit(x,?y,?1)
        ????r2?=?1?-?(sum((y?-?(slope?*?x?+?intercept))**2)?/?((len(y)?-?1)?*?np.var(y,?ddof=1)))
        ????return?(intercept,?slope,?r2)

        #?2-2?擇時模塊-設(shè)定初始斜率序列
        #?通過前?M?日最高最低價的線性回歸計算初始的斜率,返回斜率的列表
        def?initial_slope_series():
        ????current_dt?=?time.strftime("%Y-%m-%d",?time.localtime())
        ????current_dt?=?datetime.strptime(current_dt,?'%Y-%m-%d')
        ????previous_date??=?current_dt?-?timedelta(days?=?day)
        ????data?=?jq.get_price(ref_stock,?end_date?=?previous_date,?count?=?N?+?M,?frequency='daily',?fields=['high',?'low'])
        ????return?[get_ols(data.low[i:i+N],?data.high[i:i+N])[1]?for?i?in?range(M)]

        #?2-3?擇時模塊-計算標(biāo)準(zhǔn)分
        #?通過斜率列表計算并返回截至回測結(jié)束日的最新標(biāo)準(zhǔn)分
        def?get_zscore(slope_series):
        ????mean?=?np.mean(slope_series)
        ????std?=?np.std(slope_series)
        ????return?(slope_series[-1]?-?mean)?/?std

        #?2-4?擇時模塊-計算綜合信號
        #?1.獲得?rsrs?與?MA?信號,rsrs?信號算法參考優(yōu)化說明,MA?信號為一段時間兩個端點(diǎn)的?MA?數(shù)值比較大小
        #?2.信號同時為?True?時返回買入信號,同為?False?時返回賣出信號,其余情況返回持倉不變信號
        #?解釋:
        #?????? MA 信號:MA 指標(biāo)是英文(Moving average)的簡寫,叫移動平均線指標(biāo)。
        #?????? RSRS 擇時信號:
        #???????????????https://www.joinquant.com/view/community/detail/32b60d05f16c7d719d7fb836687504d6?type=1
        def?get_timing_signal(stock):
        ????#?計算?MA?信號
        ????current_dt?=?time.strftime("%Y-%m-%d",?time.localtime())
        ????current_dt?=?datetime.strptime(current_dt,?'%Y-%m-%d')
        ????previous_date??=?current_dt?-?timedelta(days?=?day)????
        ????close_data?=?jq.get_price(ref_stock,?end_date?=?previous_date,?count?=?mean_day?+?mean_diff_day,??frequency?=?'daily',??fields?=?['close'])
        ????#?0?0?0?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1,23?天,要后?20?天
        ????today_MA?=?close_data.close[mean_diff_day:].mean()?
        ????#?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?0?0?0,23?天,要前?20?天
        ????before_MA?=?close_data.close[:-mean_diff_day].mean()
        ????#?計算?rsrs?信號
        ????high_low_data?=?jq.get_price(ref_stock,?end_date?=?previous_date,?count?=?N,??frequency='daily',???fields?=?['high',?'low'])
        ????intercept,?slope,?r2?=?get_ols(high_low_data.low,?high_low_data.high)
        ????slope_series.append(slope)

        ????rsrs_score?=?get_zscore(slope_series[-M:])?*?r2
        ????#?綜合判斷所有信號
        ????if?rsrs_score?>?score_threshold?and?today_MA?>?before_MA:
        ????????return?"BUY"
        ????elif?rsrs_score?<?-score_threshold?and?today_MA?<?before_MA:
        ????????return?"SELL"
        ????else:
        ????????return?"KEEP"

        slope_series?=?initial_slope_series()[:-1]?#?除去回測第一天的?slope?,避免運(yùn)行時重復(fù)加入

        def?get_test():
        ????for?each_day?in?range(1,?100)[::-1]:
        ????????current_dt?=?time.strftime("%Y-%m-%d",?time.localtime())
        ????????current_dt?=?datetime.strptime(current_dt,?'%Y-%m-%d')
        ????????previous_date??=?current_dt?-?timedelta(days?=?each_day?-?1)
        ????????day?=?each_day
        ????????print(each_day,?previous_date)
        ????????check_out_list?=?get_rank(stock_pool)
        ????????for?each_check_out?in?check_out_list:
        ????????????security_info?=?jq.get_security_info(each_check_out)
        ????????????stock_name?=?security_info.display_name
        ????????????stock_code?=?each_check_out
        ????????????print('今日自選股:{}({})'.format(stock_name,?stock_code))
        ????????#獲取綜合擇時信號
        ????????timing_signal?=?get_timing_signal(ref_stock)
        ????????print('今日擇時信號:{}'.format(timing_signal))
        ????????print('*'?*?100)

        if?__name__?==?"__main__":
        ????check_out_list?=?get_rank(stock_pool)
        ????for?each_check_out?in?check_out_list:
        ????????security_info?=?jq.get_security_info(each_check_out)
        ????????stock_name?=?security_info.display_name
        ????????stock_code?=?each_check_out
        ????????print('今日自選股:{}({})'.format(stock_name,?stock_code))
        ????#獲取綜合擇時信號
        ????timing_signal?=?get_timing_signal(ref_stock)
        ????print('今日擇時信號:{}'.format(timing_signal))
        ????print('*'?*?100)

        策略很短,不到 200 行。

        需要注意的是,這個本地化的 api,需要通過官網(wǎng)申請后,才能使用。

        申請地址:

        https://www.joinquant.com/default/index/sdk

        對應(yīng)的,可以直接在聚寬平臺運(yùn)行的代碼,在這里:

        https://github.com/Jack-Cherish/quantitative/blob/main/lesson1/quantitive-etf-jq.py

        輸入代碼,就可以直接運(yùn)行,回測效果了。

        ea8bbbc3eed46a1547258c95bf3d3ed6.webp

        時間有限,這里先寫這么多。

        這個策略,只用了寬基,輪動選擇。

        后續(xù)我會繼續(xù)講解,怎樣將這個策略部署到我們的服務(wù)器上,并定時給我們的手機(jī)發(fā)送郵件,進(jìn)行交易提醒。

        股市有風(fēng)險,入市需謹(jǐn)慎,請謹(jǐn)慎使用~

        有什么問題,歡迎在評論區(qū)里留言。

        958950dd488aae2b26583efc975a920b.webp

        你好,我是公子龍,畢業(yè)于中科院,前大型計算機(jī)競賽冠軍,現(xiàn)算法工程師,拿過九家大廠的 offer 。


        北漂七年,從小白到計算機(jī)競賽冠軍,讀研時通過實習(xí)和比賽收入 50 萬,點(diǎn)擊藍(lán)字查看我的編程之路


        同時,我也是 b 站 up?主:公子龍龍龍,日常分享高質(zhì)量資料,輸出面試、工作經(jīng)驗,歡迎圍觀。


        f21e82f35615f79dfcf507928f44bd26.webp


        瀏覽 83
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            波多野结衣丝袜诱惑 | 国产黄a三级三级三级看三级黑人 | 国产伦精品一区二区三区88AV | 波多野结衣中文字幕av | 激情无码网站 | juliaann双乳喷奶水 | 成人免费无遮挡黄H网站在线观看 | 泷泽萝拉无删减avhd | 男人日女人的视频软件 | 欧美大屌操 |