700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Python量化交易策略--双均线策略及代码

Python量化交易策略--双均线策略及代码

时间:2024-01-16 06:18:14

相关推荐

Python量化交易策略--双均线策略及代码

双均线策略是比较经典的策略,股票的价格均线是投资参考的重要指标。均线有快线和慢线之分,当快线向上穿过慢线则是金叉,一般执行买入操作,当快线向下穿过慢线时则形成死叉,一般执行卖出操作。基于这个基本思路,出于兴趣爱好,便使用python复现了这个量化策略。代码封装如下。

在运行这个代码块时,请先运行以下代码:

pip install pandas

pip install numpy

pip install matplotlib

pip install tqdm

pip install qstock

在电脑上安装了这些库之后就可以运行下面的封装代码了,具体讲解在代码块下面。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom tqdm import tqdmimport qstock as qsclass Dual_moving_average_stra():'''code --> '000001' strstart_time --> '' strwindow0 --> 5 intwindow1 --> 10 intverbose --> bool default=Trueplot --> bool default=Trueinit_money = 10000 一万块本金 看末期能有多少收益'''def __init__(self, code, start_time, window0, window1, verbose=True, plot=True):self.code = codeself.start_time = start_timeself.window0 = window0self.window1 = window1self.verbose = verboseself.plot = plotdef get_data(self):#print(self.code, self.start_time)df = qs.get_data(self.code, start=self.start_time, end=None, freq=101, fqt=1)df['MA_' + str(self.window0)] = df.rolling(self.window0, min_periods=1).mean()['close'] df['MA_' + str(self.window1)] = df.rolling(self.window1, min_periods=1).mean()['close'] df['gold'] = np.nandf.gold = df['MA_' + str(self.window0)] > df['MA_' + str(self.window1)]signal = pd.DataFrame()signal = df.gold.apply(lambda x:1 if x==True else 0)df['gold_death_cha'] = signal - signal.shift(1).fillna(0)return dfdef strategy(self):init_money = 10000quant = 0df = self.get_data()signal = df.gold_death_chaprice_list = df.openmoney_list = []for i in tqdm(range(df.shape[0])):if i+1 == df.shape[0]: # 因为是次日买卖 所以得提前一天结束代码breakprice = price_list.iloc[i+1]if signal.iloc[i] == 1: # 金叉全仓买入quant += int(init_money / (price * 100))init_money -= quant * price * 100if self.verbose == True:print('此次购买数量:', quant)print('证券价格:', price)print('本金还剩:',init_money)print('金叉买入执行完毕----------------------------------')if signal.iloc[i] == -1:init_money += quant * price * 100quant = 0 # 清仓money_list.append(init_money)if self.verbose == True:print('清仓:', quant)print('证券价格:', price)print('本金还剩:',init_money)print('死叉卖出执行完毕----------------------------------')if self.plot == True:plt.figure(figsize=(20,20))plt.subplot(2,1,1)plt.grid()plt.plot(df.index, df.close, label='close', linewidth=3)plt.plot(df.index, df['MA_' + str(self.window0)], c='red', label=('MA_' + str(self.window0)), linewidth=3)plt.plot(df.index, df['MA_' + str(self.window1)], c='grey', label=('MA_' + str(self.window1)), linewidth=3)plt.xticks(rotation=45)plt.legend(fontsize=20)plt.subplot(2,1,2)plt.grid()plt.plot(range(len(money_list)), money_list, linewidth=3, label='money')plt.xticks(rotation=45)plt.legend(fontsize=20)plt.show()

这是一个金叉死叉的策略,在股价出现死叉时则全仓卖出,在股价出现金叉时则全仓买入,然后给予10000元的本金,查看最后一期能剩余多少本金。

首先实例化我们的对象:

model = Dual_moving_average_stra('600460', '0101', 5, 20)

第一个参数是股票代码,第二个参数是提取数据的开始时间,例子中是从开始的。5表示计算股票的5日均线,20表示计算股票的20日均线。然后就完成了模型的实例化。

model.strategy()

然后再运行这个代码就可以查看策略的效果了。

此次购买数量: 6证券价格: 16.52本金还剩: 88.0金叉买入执行完毕----------------------------------清仓: 0证券价格: 13.63本金还剩: 8266.0死叉卖出执行完毕----------------------------------此次购买数量: 4证券价格: 18.67本金还剩: 797.9999999999991金叉买入执行完毕----------------------------------清仓: 0证券价格: 17.74本金还剩: 7893.999999999998死叉卖出执行完毕----------------------------------此次购买数量: 5证券价格: 14.7本金还剩: 543.9999999999982金叉买入执行完毕----------------------------------清仓: 0证券价格: 14.26本金还剩: 7673.999999999998死叉卖出执行完毕----------------------------------此次购买数量: 5证券价格: 14.67本金还剩: 338.9999999999991金叉买入执行完毕----------------------------------清仓: 0证券价格: 17.23本金还剩: 8954.0死叉卖出执行完毕----------------------------------此次购买数量: 5证券价格: 16.63本金还剩: 639.0金叉买入执行完毕----------------------------------清仓: 0证券价格: 16.28本金还剩: 8779.0死叉卖出执行完毕----------------------------------此次购买数量: 5证券价格: 15.78本金还剩: 889.0000000000009金叉买入执行完毕----------------------------------清仓: 0证券价格: 25.62本金还剩: 13699.0死叉卖出执行完毕----------------------------------此次购买数量: 5证券价格: 27.09本金还剩: 154.00000000000182金叉买入执行完毕----------------------------------清仓: 0证券价格: 25.66本金还剩: 12984.000000000004死叉卖出执行完毕----------------------------------此次购买数量: 4证券价格: 26.12本金还剩: 2536.0000000000036金叉买入执行完毕----------------------------------清仓: 0证券价格: 24.28本金还剩: 12248.000000000004死叉卖出执行完毕----------------------------------此次购买数量: 4证券价格: 30.48本金还剩: 56.00000000000364金叉买入执行完毕----------------------------------清仓: 0证券价格: 57.4本金还剩: 23016.000000000004死叉卖出执行完毕----------------------------------此次购买数量: 3证券价格: 63.35本金还剩: 4011.0000000000036金叉买入执行完毕----------------------------------清仓: 0证券价格: 61.9本金还剩: 22581.000000000004死叉卖出执行完毕----------------------------------此次购买数量: 3证券价格: 57.57本金还剩: 5310.000000000004金叉买入执行完毕----------------------------------清仓: 0证券价格: 53.4本金还剩: 21330.0死叉卖出执行完毕----------------------------------此次购买数量: 3证券价格: 61.11本金还剩: 2997.0金叉买入执行完毕----------------------------------清仓: 0证券价格: 54.7本金还剩: 19407.000000000004死叉卖出执行完毕----------------------------------此次购买数量: 3证券价格: 63.39本金还剩: 390.00000000000364金叉买入执行完毕----------------------------------清仓: 0证券价格: 65.1本金还剩: 19920.000000000004死叉卖出执行完毕----------------------------------此次购买数量: 3证券价格: 61.64本金还剩: 1428.0000000000036金叉买入执行完毕----------------------------------清仓: 0证券价格: 59.26本金还剩: 19206.000000000004死叉卖出执行完毕----------------------------------此次购买数量: 3证券价格: 51.92本金还剩: 3630.0000000000036金叉买入执行完毕----------------------------------清仓: 0证券价格: 50.55本金还剩: 18795.0死叉卖出执行完毕----------------------------------此次购买数量: 3证券价格: 55.29本金还剩: 2208.0金叉买入执行完毕----------------------------------清仓: 0证券价格: 54.35本金还剩: 18513.0死叉卖出执行完毕----------------------------------此次购买数量: 4证券价格: 42.49本金还剩: 1517.0金叉买入执行完毕----------------------------------清仓: 0证券价格: 45.58本金还剩: 19749.0死叉卖出执行完毕----------------------------------此次购买数量: 4证券价格: 46.08本金还剩: 1317.0金叉买入执行完毕----------------------------------清仓: 0证券价格: 45.45本金还剩: 19497.0死叉卖出执行完毕----------------------------------此次购买数量: 3证券价格: 50.79本金还剩: 4260.0金叉买入执行完毕----------------------------------清仓: 0证券价格: 46.77本金还剩: 18291.0。。。

模型可以打印每次买入和卖出的日志,模型中的参数 verbose 和plot是默认打开的,可以看需求关闭。同时Plot参数提供了可视化,上方的图表示股价图,下方图则是本金变化图形。

从图形可以看出600460的股价从的低点到的高年翻了将近6倍,而均线策略最高只取得了两倍的收益。

我们可以继续换一组参数,用5日线和10日线来操作。

model = Dual_moving_average_stra('600460', '0101', 5, 10)model.strategy()

可以看出来效果会比5日线和20日线的组合好一点。个人感觉这个策略比较依赖标的。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。