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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 【小散學量化】-2-動量模型的簡單實踐 > 來源:https://uqer.io/community/share/5673a22b228e5b8d5bf017ba 本帖將對之前提到的動量模型進行回測,順便科普一下動量模型中用到的數學工具,包括以下內容: + 1、線性回歸 + 2、動量模型回測 + 3、小散的思考 ## 1.線性回歸 線性回歸是利用稱為線性回歸方程的最小平方函數對一個或多個自變量和因變量之間關系進行建模的一種回歸分析。 對于自變量X和因變量Y,線性回歸方法用Y=α+βX 的形式來解釋X,Y之間的關系。例如,小散想知道上證50指數與上證指數之間的變化,該怎么辦呢? 首先,定義一個函數來執行線性回歸操作,并返回回歸結果。 ```py import numpy as np from statsmodels import regression import statsmodels.api as sm import matplotlib.pyplot as plt import math def linreg(X,Y): # Running the linear regression X = sm.add_constant(X) model = regression.linear_model.OLS(Y, X).fit() a = model.params[0] b = model.params[1] X = X[:, 1] # Return summary of the regression and plot results X2 = np.linspace(X.min(), X.max(), 100) Y_hat = X2 * b + a plt.scatter(X, Y, alpha=0.3) # Plot the raw data plt.plot(X2, Y_hat, 'r', alpha=0.9); # Add the regression line, colored in red plt.xlabel('X Value') plt.ylabel('Y Value') return model.summary() ``` 接著,應用上面定義的函數,以2015年的數據為例,驗證上證指數(000001)和上證50指數(000016)之間的關系。 ```py data1=DataAPI.MktIdxdGet(ticker='000016',beginDate='20150101',endDate='20151201') asset=data1['closeIndex'] data2=DataAPI.MktIdxdGet(ticker='000001',beginDate='20150101',endDate='20151201') benchmark=data2['closeIndex'] r_a = asset.pct_change()[1:] r_b = benchmark.pct_change()[1:] linreg(r_b.values, r_a.values) OLS Regression Results Dep. Variable: y R-squared: 0.823 Model: OLS Adj. R-squared: 0.823 Method: Least Squares F-statistic: 1021. Date: Fri, 18 Dec 2015 Prob (F-statistic): 2.11e-84 Time: 13:40:10 Log-Likelihood: 685.41 No. Observations: 221 AIC: -1367. Df Residuals: 219 BIC: -1360. Df Model: 1 Covariance Type: nonrobust coef std err t P>|t| [95.0% Conf. Int.] const -0.0006 0.001 -0.877 0.381 -0.002 0.001 x1 0.9317 0.029 31.952 0.000 0.874 0.989 Omnibus: 43.308 Durbin-Watson: 1.857 Prob(Omnibus): 0.000 Jarque-Bera (JB): 85.122 Skew: 0.968 Prob(JB): 3.28e-19 Kurtosis: 5.344 Cond. No. 39.6 ``` ![](https://box.kancloud.cn/2016-07-30_579cbb052269a.png) 小散并不知道OLS結果怎么看,只知道這里的R-sq用來解釋線性關系的可靠性,0.823表示自變量可以解釋82.3%的因變量變化。小散是一個好奇心很強的人,這個82.3%到底是大還是小呢? 這里使用隨機生成X,Y來觀察一下。 ```py X = np.random.rand(100) Y = np.random.rand(100) linreg(X, Y) OLS Regression Results Dep. Variable: y R-squared: 0.001 Model: OLS Adj. R-squared: -0.010 Method: Least Squares F-statistic: 0.06682 Date: Fri, 18 Dec 2015 Prob (F-statistic): 0.797 Time: 13:40:15 Log-Likelihood: -15.737 No. Observations: 100 AIC: 35.47 Df Residuals: 98 BIC: 40.68 Df Model: 1 Covariance Type: nonrobust coef std err t P>|t| [95.0% Conf. Int.] const 0.5214 0.056 9.245 0.000 0.410 0.633 x1 0.0253 0.098 0.258 0.797 -0.169 0.219 Omnibus: 22.647 Durbin-Watson: 2.366 Prob(Omnibus): 0.000 Jarque-Bera (JB): 5.557 Skew: -0.164 Prob(JB): 0.0621 Kurtosis: 1.893 Cond. No. 4.32 ``` ![](https://box.kancloud.cn/2016-07-30_579cbb05392a4.png) ## 2 動量模型回測 針對小伙伴之前提出的回測效果問題,小散選擇了上證50指數作為參考,50ETF作為投資標的,上證指數(000001)作為動量模型的擇時工具進行了回測。 首先,定義動量信號函數,函數返回值為回歸模型的Y值,同期上證指數值及標準差。 ```py from statsmodels import regression import statsmodels.api as sm import scipy.stats as stats import scipy.spatial.distance as distance import matplotlib.pyplot as plt import pandas as pd import numpy as np from CAL.PyCAL import * from datetime import datetime, timedelta import numpy as np cal = Calendar('China.SSE') def signal_gzs_calc(today,before): start= cal.advanceDate(today, Period('-30B')) start=start.toDateTime() end = cal.advanceDate(today, before) end=end.toDateTime() asset=DataAPI.MktIdxdGet(ticker='000001',beginDate=start,endDate=end,field=['tradeDate','closeIndex'],pandas="1").set_index('tradeDate')['closeIndex'] # 對收盤價數據進行直線擬合 X = np.arange(len(asset)) x = sm.add_constant(X) model = regression.linear_model.OLS(asset, x).fit() # 使用OLS計算y=ax+b對應的a和b a = model.params[0] b = model.params[1] Y_fit = X * b + a return Y_fit[-1],asset[-1],np.std(asset - Y_fit) ``` ```py start = '2013-01-01' # 回測起始時間 today = datetime.today() delta = timedelta(days = -1) end = (today+delta).strftime('%Y-%m-%d') benchmark = 'SH50' # 策略參考標準 universe = ['510050.XSHG'] # 股票池 # 策略參考標準 refresh_rate = 1 # 調倉頻率,即每 refresh_rate 個交易日執行一次 handle_data() 函數 def initialize(account): # 初始化虛擬賬戶狀態 pass def handle_data(account): # 每個交易日的買入賣出指令 today=account.current_date a_1,b_1,c_1=signal_gzs_calc(today,Period('-2B')) a_2,b_2,c_2=signal_gzs_calc(today,Period('-1B')) for stk in account.universe: if (a_1-b_1)< -c_1 and (a_2-b_2)> -c_2 and not stk in account.valid_secpos: order(stk, 200000) if (a_1-b_1)<c_1 and (a_2-b_2)>c_2 and stk in account.valid_secpos: order(stk, -200000) ``` ![](https://box.kancloud.cn/2016-07-30_579cbb05504ea.jpg) ## 3、小散的思考 從回測效果來看,本模型在捕捉上升趨勢和下降趨勢時均有延遲,可以通過修改period來調整(初步設定為30)。 單純依靠反轉信號作為賣出信號帶來的回撤較大,可以考慮增加止損條件(無止損設定)。 3年回測期內,共發出買賣信號11次,最近一次空倉信號發出在11月19日,產生的信號較少,可以考慮修改兩個if條件增加信號量(小散設定為單位標準差)。 策略收益主要是靠空倉避難得到的,小伙伴可以將這個模型推廣應用到多個個股,看看有沒有挖掘價值。 參考文獻: 1、量化分析師日記,新手必看。 2、zilong.li https://uqer.io/community/share/561e3a65f9f06c4ca82fb5ec 用5日均線和10日均線進行判斷--改進版。 本次【小散學量化】到此結束, 韭菜的觀點僅供參考,切記切記~
                  <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>

                              哎呀哎呀视频在线观看