
学习python股票量化编程,从最简单的买入卖出开始,也许是最好的选择,因为无论学什么,我们都应该从易到难。
所谓简单买入卖出,就是选定某一支自己熟悉的股票,当低于某价位时就买入,高于某价位就卖出。不管时间长短,不管资金效率如何,就只看一点,程序是否按此策略执行了,毕竟我的目的只是为了学习编写python量化程序。
因为第一次用backtrader写了双均线策略,已经明白了写策略的四个步骤:1、导入数据。2、构建策略。3、回测。4、输出结果,用图表显示。所以这一次,就先把双均线的代码全复制粘贴过来,然后就修改构建策略里的语句,其他的都没变,省时省力。完整代码如下:
# 本代码仅为学习练习用,不具备任何实战价值
import akshare as ak
import backtrader as bt
import pandas as pd
# 获取股票数据
df = ak.stock_zh_a_hist('600863', start_date='20200101',end_date='20240308')
df['datetime'] = pd.to_datetime(df['日期'])
# 转换为 Backtrader 数据格式
data = bt.feeds.PandasData(dataname=df, datetime='datetime', open='开盘', high='最高', low='最低', close='收盘', volume='成交量')
print(df.head())
# 构建定价买入卖出策略
class MyStrategy(bt.Strategy):
params = (
# 滑点比例
('slippage', 0.01),
)
def next(self):
# 价格低于2.5元,资金大于97500买入
if data.close[0] < 2.5:
# 计算买入股票后的资金余额
post_buy_cash = self.broker.getvalue() - data.close[0] * self.position.size * (1 + self.params.slippage)
# 如果资金余额大于 97500,买入股票
if post_buy_cash > 97500:
self.buy(size=39000)
# 打印入价格、数量、时间
print('买入价格: %.2f, 数量: %.2f, 时间: %s' % (
self.data.close[0], self.data.volume[0], self.data.datetime.date()))
# 价格高于5元,持股数量等于39000卖出
if data.close[0] > 4.5 and self.position.size == 39000:
self.sell(size=39000)
# 打印出价格、数量、时间
print('卖出价格: %.2f, 数量: %.2f, 时间: %s' % (
self.data.close[0], self.data.volume[0], self.data.datetime.date()))
# 构建回测引擎
cerebro = bt.Cerebro()
# 加入策略
cerebro.addstrategy(MyStrategy)
# 加载数据
cerebro.adddata(data)
# 设置初始资金
cerebro.broker.setcash(100000.0)
# 设置佣金
cerebro.broker.setcommission(commission=0.001)
# 运行回测
cerebro.run()
# 输出结果
print('最终市值: %.2f' % cerebro.broker.getvalue())
# 绘制图表
cerebro.plot()
刚写本策略时也遇到了问题,原来设定是达到买入价是就全仓买入,但是程序却在低于买入价下不停地买,没钱也买入,这完全不现实,故在买入前加了一个计算资金余额的条件:
post_buy_cash = self.broker.getvalue() – data.close[0] * self.position.size * (1 + self.params.slippage)
if post_buy_cash > 97500:
self.buy(size=39000)
总算禁止了程序傻瓜般的疯狂买入。


这策略完全没有实用价值,要想等到买入价,那是千年等一回,好在它按策略设定去运行了,学习的目的达到了。
我觉得双均线策略比这个要更复杂一点,多了一步均线的计算,作为第二个学习的策略更合适一些,只是很多教学量化的书本和视频都是以双均线做第一个例子来讲解,我也就用双均线开了个头。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/73470
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!