平民版均线量化交易模型
前言
2021年轉瞬即逝,回顧一下在螞蟻上定投的基金,在金融危機風雨欲來的2022年,分享一個懶人版的理財策略,愿大家新年里能財源廣進,元旦快樂。
基金定投
我的策略非常簡單,每月無腦小額定投,等"全民炒股"這種話題上新聞,擇時清倉。一般2-3年有一個操作點,每次操作窗口期幾個月,錯過就從頭再來。賣出點不影響買入操作,循環往復。
為什么選擇基金
每月一次或幾次交易,不影響本職工作,繁復的工作交給機器來做。
基金可以規避單一股票的對應行業或公司的黑天鵝事件。比如樂視的"下周回國",或是“雙減"對整個教育行業的沖擊。
相對股票來說,基金更“永續”,更少的停牌,ST或是增發干擾。
在瞬息萬變的股票市場,政策的影響度,輿情的提取手段尚不成熟,基金對于普通人來說可以大幅度簡化投資模型。
為什么選擇指數基金
公募基金的基金經理有"業績原罪",即不惜一切代價追求高利潤率,因為這樣才能讓排名靠前,才能讓投資者"看到"。這種激勵機制下,交易員更偏向冒險的投資風格,賭贏手續費賺的盆滿缽滿,賭輸不過是換個基金代號從頭再來。
基金經理策略會與我們的自主策略混淆,無法歸因,無法回測和改進策略,指數基金則減少了“個人”風險的集中度。
為什么選擇定投策略
定投不擇時,相對模型簡化了一個變量。
小額定期交易可以更好的小步試錯,累積時序數據。
A股的“「熊長牛短」"特征,意味著間隔平均的投資點大概率會落于熊市的低位,降低成本。
關于高頻交易
對于普通投資者來說,高頻交易策略的手續費偏高,非金融專業的知識儲備不足。
A股的T+1也相對限制了個股上交易操作(若資金量大可以做T改善這個問題,但也面臨資金沖擊現象)。
基金作為一攬子股票的ETF,則不太適合頻繁交易,有能力的可以選擇高增長行業的龍頭股來做高頻。
弊端
投資周期非常長,一般按年計;
收益率一般(年化8%左右),遠比不上專業投資人,更不能和幣圈相提并論;
資金流動性不好,長時間的熊市屬于常態,賣出的窗口期很短;
投資風格非常保守,更偏向于理財,而非投資。
優點
完全屬于被動投資,平時幾乎不需要操心;
沒有追漲殺跌,沒有人性考驗,可以天天睡得安穩;
熊市"播種"救企業于危難,牛市"分紅"共享盛世繁華,政治正確,妥妥的正能量。
量化交易平臺
普通的定投或是簡單的智能定投策略,在支付寶上已經能很方便的操作了。作為碼農,我們肯定希望更自主可控些,這里有更多的量化交易平臺可供選擇:
開源 vnpy https://github.com/vnpy/vnpy
聚寬 https://www.joinquant.com/
米筐 https://www.ricequant.com/
優礦 https://uqer.datayes.com/
大多以 Python 為開發語言,對于習慣拿機器學習做數據分析的朋友非常友好,這里以聚寬為例。官網注冊個賬號,新建 Notebook 就能在線運行了,離線版本需要額外申請免費6個月試用。詳細可以參考一下 API 文檔。
https://www.joinquant.com/help/api/help#api:API文檔初始化
選擇滬深300為基線,每月定投1萬元,每次至少定投10個月才贖回,目標收益率為 20%。
# 導入函數庫 from jqdata import *# 初始化函數,設定基準等等 def initialize(context):# 設定滬深300作為基準set_benchmark('000300.XSHG')# 開啟動態復權模式(真實價格)set_option('use_real_price', True)# 輸出內容到日志 log.info()log.info('初始函數開始運行且全局只運行一次')# 過濾掉order系列API產生的比error級別低的log# log.set_level('order', 'error')### 股票相關設定 #### 股票類每筆交易時的手續費是:買入時傭金萬分之三,賣出時傭金萬分之三加千分之一印花稅, 每筆交易傭金最低扣5塊錢set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')# 要操作的基金:(g.為全局變量)g.security = '510300.XSHG'# 預期目標g.goal = 1.2# 均值窗口期g.during = 500# 定投基本值g.base_order_value = 10000# 賣出鎖定周期g.sell_period = 10g.sell_timestamp = context.current_dtrun_monthly(market_open, monthday=1, reference_security='000300.XSHG')均線策略
在每月無腦定投中,稍微加點策略:
高位少買
# 高位買入 def high_buy(security, base_order_value, cash, ratio):# 默認扣款率pay_ratio = 1if ratio < 0.15:pay_ratio = 0.9elif ratio < 0.50:pay_ratio = 0.8elif ratio < 1:pay_ratio = 0.7else:pay_ratio = 0.6# 需買入的金額order_value_cash = base_order_value*pay_ratiolog.info("%s: %f, cash: %d, ratio: %f"%(security, pay_ratio, cash, ratio))if cash < order_value_cash:log.info("現金 %d 不足, 買入失敗 %s: %d " % (cash, security, order_value_cash))return Falselog.info("高位買入 %s: %d" % (security, order_value_cash))order_value(security, order_value_cash)return True低位多買
# 低位買入 def low_buy(security, base_order_value, cash, ratio):# 默認扣款率pay_ratio = 1# 近10天的最高價和最低價value_range = get_bars(security, count=10, unit='1d', fields=['high','low'])max_value = max(value_range['high'])min_value = min(value_range['low'])if (max_value - min_value)/max_value > 0.05:# 大幅度震蕩,持續下跌通道中if ratio < 0.05:pay_ratio = 0.6elif ratio < 0.10:pay_ratio = 0.7elif ratio < 0.20:pay_ratio = 0.8elif ratio < 0.30:pay_ratio = 0.9elif ratio < 0.40:pay_ratio = 1else:pay_ratio = 1.1else:# 小幅度震蕩,形成底部加大購買量if ratio < 0.5:pay_ratio = 1.6elif ratio < 0.10:pay_ratio = 1.7elif ratio < 0.20:pay_ratio = 1.8elif ratio < 0.30:pay_ratio = 1.9elif ratio < 0.40:pay_ratio = 2else:pay_ratio = 2.1 # 需買入的金額order_value_cash = base_order_value*pay_ratioif cash < order_value_cash:log.info("現金 %d 不足, 買入失敗 %s: %d " % (cash, security, order_value_cash))return Falselog.info("低位買入 %s: %d" % (security, order_value_cash))order_value(security, order_value_cash)return True預期止盈
這里為了回測方便,沒法"聽新聞"判斷了,先以滿足預期目標收益來止盈。
# 賣出 def sell(security, current_price, MA, sell_timestamp):log.info("sell: %f, MA: %f" %(current_price, MA))if current_price/MA < g.goal:return Falseif (sell_timestamp - g.sell_timestamp).days/30 < g.sell_period:return False# 賣出所有股票,使這只股票的最終持有量為0log.info("%s, %s, %d" % (sell_timestamp, g.sell_timestamp, (sell_timestamp - g.sell_timestamp).days))log.info("達到預期目標, 賣出 %s" % (security))order_target(security, 0)# 更新賣出時間戳g.sell_timestamp = sell_timestampreturn True運行策略
萬事俱備,我們將上述函數都組合到一起,跑一下看看效果。
## 開盤時運行函數 def market_open(context):log.info('函數運行時間(market_open):'+str(context.current_dt.time()))security = g.security# 平均值窗口期during = g.during# 獲取股票的收盤價close_data = get_bars(security, count=during, unit='1d', fields=['close'])# 取得過去500天的平均價格MA = close_data['close'].mean()# 取得上一時間點價格current_price = close_data['close'][-1]# 取得當前的現金cash = context.portfolio.available_cash# 定投金額base_order_value = g.base_order_valueif (current_price > MA):# 高位賣出sell(security, current_price, MA, context.current_dt)# 高位少買 high_buy(security, base_order_value, cash, (current_price-MA)/MA)else:# 低位多買low_buy(security, base_order_value, cash, (MA-current_price)/MA)#得到本次所有成交記錄trades = get_trades()for _trade in trades.values():log.info('成交記錄:'+str(_trade))log.info('本輪結束')log.info('##############################################################')選擇2015年到2021年來做回測,貌似看起來還不錯,買入點很多,除了零星幾次資金量用完,幾乎每月都有交易;賣出點才4次,這一方面受限于“賣出鎖定周期”,另一方面也體現A股長期熊市的現象。
年化收益 9.85%,這里小額定投的建倉周期比較長,所以相對資金利用率不夠高,這里的倉位可以簡單理解為最大投資規模。實際操作中,大家可以把固定收入作為資金投入,大額資金可以用作其他投資,擴大收益率。
再多選幾個長周期,比如2017年至今,或是2019年至今,比不上牛市收益,但可以逃過股市熔斷大跳水,大多時候收益率能保持穩定正值。
持倉分析實盤交易
直接對接證券機構
模擬交易,手動操作
模擬交易
由于我們買入賣出操作不多,可以將制定好的策略,用模擬交易的方式將買入賣出信號通過微信消息來發送,再根據實際情況進行基金操作。
# 給微信發送消息(添加模擬交易,并綁定微信生效) send_message("買入 %s: %d" % (security, order_value_cash))總結
看到這里,相信搞深度學習的朋友肯定想拿手上一堆時序模型躍躍欲試了。先小潑盆冷水,就自我體驗和身邊做量化交易朋友的教訓來看,單一模型在A股上基本沒戲。
原因主要有以下幾點:
時序模型基于歷史趨勢可再現,歷史不會簡單重復,只會換種形勢卷土重來。
眾多的量化機構讓原有的“低風險策略點”稍縱即逝,寄生策略泛濫。
A股是強政策市,金融因素占比偏小。
散戶比例很高,市場情緒化影響偏大。
另外,以上這些僅作為技術分享和個人經驗之談,不作為投資建議。更多的交易策略,等金融專業人士亂入指點。還有NLP輿情分析關鍵字拉漲停的更多騷操作,評論區打開腦洞吧。
論一個韭菜的自我修養,俠之大者,為國接盤。
哎,2021年說好的每周一更呢,感覺欠了很多的債。有鴻蒙系列的,樹莓派系列的,OCR系列的,知識圖譜系列的,手稿太多,沒有心境慢慢整理,希望來年能補全。
總結
以上是生活随笔為你收集整理的平民版均线量化交易模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作数栈的字节码指令执行分析
- 下一篇: Django create_user w