聲明:股市有風險,投資需謹慎!本人沒有系統學過金融知識,對股票有敬畏之心沒有踏入其大門,今天用另外一種方法模擬炒股,后面的模擬的實戰全部用同樣的數據,最后比較哪種方法賺的錢多。
量化交易,也被稱為算法交易,是一種使用數學模型和計算機算法來分析市場數據、識別交易機會并自動執行交易的交易方式。這種交易方法依賴于統計學、數學和計算機科學,以減少人為情緒和主觀判斷的影響,提高交易效率和精確度。下面是量化交易的一些關鍵點:
-
數據驅動:量化交易依賴于大量的歷史和實時市場數據,包括價格、成交量、財務報告等。
-
模型構建:交易者使用統計和機器學習技術來構建預測模型,這些模型可以識別市場趨勢、價格模式或異常事件。
-
策略開發:基于模型的預測,開發交易策略,這些策略可以是趨勢跟蹤、均值回歸、套利等。
-
自動化執行:一旦策略確定,交易可以完全自動化,由計算機程序執行,無需人工干預。
-
風險管理:量化交易還包括風險管理算法,以確保交易在可接受的風險水平內進行。
-
高頻交易(HFT):一種特殊的量化交易,特點是交易頻率極高,可能在幾毫秒內完成數百甚至數千筆交易。
-
成本和效率:由于減少了交易中的人工環節,量化交易可以降低交易成本并提高執行速度。
-
監管合規:量化交易需要遵守金融市場的監管規定,包括交易規則和數據保護法規。
優勢: 量化交易的優勢在于其能夠快速處理大量數據,發現人類難以察覺的模式和機會。
挑戰: 模型可能過于依賴歷史數據而無法準確預測未來市場變化,或者在市場極端波動時可能失效。
import tushare as ts
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams ['font.sans-serif'] ='SimHei' #顯示中文
plt.rcParams ['axes.unicode_minus']=False #顯示負號
zgpa = pd.read_csv('history_k_data.csv')
zgpa = zgpa.set_index('date')
zgpa.head()
導入之前獲取的數據:
典型的“美國線”數據,open代表當日開盤價格,high代表當日最高價格,low代表當日最低價格,close代表當日收盤價格。我們還需要增加幾個維度來分析,為了不影響原表,我們構建一個新表。
新建一個表單,命名為strategy(策略),計算交易的信號和下單數量:
#序號保持和原始數據一致
strategy = pd.DataFrame(index = zgpa.index)
#添加一個signal字段,用來存儲交易信號
strategy['signal'] = 0
#將5日均價保存到avg_5這個字段
strategy['avg_5'] = zgpa['close'].rolling(5).mean()
#同樣,將10日均價保存到avg_10
strategy['avg_10'] = zgpa['close'].rolling(10).mean()
#當5日均價大于10日均價時,標記為1
#反之標記為0
strategy['signal'] = np.where(strategy['avg_5']>strategy['avg_10'], 1,0)
#根據交易信號的變化下單,當交易信號從0變成1時買入
#交易信號從1變成0時賣出
#交易信號不變時不下單
strategy['order'] = strategy['signal'].diff()
#查看數據表后10行
strategy.tail(10)
先介紹今天的移動平均線追蹤策略:在這種策略中,一般采用5天均值和10天均值,如果5日均線上穿突破了10日均線,說明股價在最近的漲勢很猛,買入信號。若下穿了10日均線,說明最近的跌幅較大,應該賣出。
表格情況:
signal列用于存儲交易信號0變成1是買入,1變成0時賣出。
avg_5列采用窗口移動計算5日均值。
avg_10列采用窗口移動計算10日均值。
order列表示交易信號變時下單。
窗口移動計算如上圖如示,只不過上圖是計算7列,我只計算5列和10列。
數據可視化:
#創建尺寸為10*5的畫布
plt.figure(figsize=(10,5))
#使用實線繪制股價
plt.plot(zgpa['close'],lw=2,label='price')
#使用虛線繪制5日均線
plt.plot(strategy['avg_5'],lw=2,ls='--',label='avg5')
#使用-.風格繪制10日均線
plt.plot(strategy['avg_10'],lw=2,ls='-.',label='avg10')
#將買入信號用正三角進行標示
plt.scatter(strategy.loc[strategy.order==1].index,zgpa['close'][strategy.order==1],marker = '^', s=80,color='r',label='Buy')
#將賣出信號用倒三角進行標示
plt.scatter(strategy.loc[strategy.order==-1].index,zgpa['close'][strategy.order==-1],marker = 'v', s=80,color='g',label='Sell')
#添加圖注
plt.legend()
plt.xticks([0,12,24,36,48,60,72,84,96,108])
#添加網格以便于觀察
plt.grid()
#顯示圖像
plt.show()
上圖買入信號用正三角進行標注,賣出信號用倒三角進行標注。
模擬實戰炒股
依舊是20000元的本金,不交手續費。
initial_cash = 20000
#新建一個數據表positions,序號保持和strategy數據表一致
#用0將空值進行替換
positions = pd.DataFrame(index = strategy.index).fillna(0)
#因為A股買賣都是最低100股
#因此設置stock字段為交易信號的100倍
positions['stock'] = strategy['signal'] * 100
#創建投資組合數據表,用持倉的股票數量乘股價得出持倉的股票市值
portfolio = pd.DataFrame(index = strategy.index)
portfolio['stock value'] = positions.multiply(zgpa['close'], axis=0)
#同樣倉位的變化就是下單的數量
#用初始資金減去下單金額的總和就是剩余的資金
portfolio['cash'] = initial_cash - positions['stock'].diff().multiply(zgpa['close'],axis=0).cumsum()
#剩余的資金+持倉股票市值即為總資產
portfolio['total'] = portfolio['cash'] + portfolio['stock value']
#檢查一下后10行
portfolio.tail(20)
創建投資組合數據表,序號和strategy表一致:
stock value代表用持倉的股票數量乘股價得出持倉的股票市值。
cash代表用初始資金減去下單金額的總和就是剩余的資金。
total剩余的資金+持倉股票市值即為總資產。
我們查看最后20行數據,總資產為20502元,比原始資金20000元賺了502元。
數據可視化:
#創建10*5的畫布
plt.figure(figsize=(10,5))
#繪制總資產曲線
plt.plot(portfolio['total'], lw=2, label='總資產')
#繪制持倉股票市值曲線
plt.plot(portfolio['stock value'],lw=2,ls='--', label='交易現金流')
#添加圖注
plt.legend()
#添加網格
plt.grid()
plt.xticks([0,12,24,36,48,60,72,84,96,108])
#展示圖像
plt.show()
下期我們會帶來更多的量化交易策略。
不轉發,你至少要點個贊,收藏一下吧!