- 标的选择
- 数据抓取
- 网格策略
- 变量描述
- 开始测算
- 结果分析
标的选择使用python+mongodb实现网格交易的思路:
网格,顾名思义,就是低买高卖,实现方案是用python,对某只股票的历史数据:
- 从x天开始算(当天就买入)
- 设定一个预期卖出价格,比如,比上次买入价格盈利5%,则卖出
- 设定一个预期买入价格,比如,比上次买入价格下跌5%,再次买入
由于还需要考虑其他问题,比如:
- 买入的股数,必须是100的整数倍
- 当天买入的份额,当天是不能卖的
- 如果股价一飞冲天,会不会卖飞?为了解决这个问题,我们使用一个数值:“累计买入次数”,买入+1,卖出-1,只需要观察数值的大小,就知道最大会卖飞多少,那么对应的,考虑为其建底仓。
- 股价会不会一直下跌?理论上是会的,我们还是使用“累计买入次数”这个变量,来看极限情况下,最多买入多少次(考虑了卖出-1)
这个是很多的,比如我常看的是下面这几个,比较稳健:
数据抓取抓取历史数据,有很多的方案,比如
- Tushare:https://www.tushare.pro/
- 万得api
- 爬虫(我用过搜狐证券:https://q.stock.sohu.com/cn/512010/lshq.shtml)
方案跟最开始的描述一致,代码中用到的一些变量
self.collection_detail_name = '策略2-网格-明细'+security
self.collection_summary_name = '策略2-网格-汇总'+security
super().__init__()
#################### 计算数据 ########################
self.symbol = security
self.collection_name = security
self.mongo_util = MongoUtil()
self.start_date = start_date
################## 策略过程数据 #######################
self.last_buy_price = 0.000
# 预期买入价格
self.expect_buy_price = 0.000
# 预期卖出价格(根据最近一次买入价格计算) self.last_buy_price*(1+self.expect_percent)
self.expect_sell_price = 0.000
# 最多加仓多少次
self.buy_count = 0
self.sell_count = 0
# 最大浮亏金额
self.lose_total_money = 0.000
# 最大浮亏比例。 比如4.323%,这里就是4.323,不需要%。由于收益率是最终数据,此数据记录中间过程
self.lose_percent = 0.000
# 持有时间(从买到卖总天数,非交易天数,是自然日)
self.hold_days = 0
##################### 持仓情况 ########################
# cost: 成本价; capital:本金;shares:持有份额;benefit:收益;benefit_rate:收益率(不包含%)
# transactions: 交易信息 {'date': '', 'money': 0.000, 'shares':0, 'direction': '买入或卖出'}
self.hold_meta = {'cost': 0.000, 'capital': 0.000, 'shares': 0, 'benefit': 0.000, 'benefit_rate': 0.000,
'transactions': []}
##################### 达标目标 ########################
# 预期达标比例,例如盈利10%,就是0.1
self.expect_percent = 0.05
# 每次买入金额(这个还需要根据实际买入份额计算100整数倍)
self.per_buy_capital = 10000
开始测算
计算的时候,只需要如下:
# security是股票代码,date是希望从这一天开始测算,理论上随便选取哪天都可以,这样的话,可以策略在高点回落的极端场景,比如2018年以及之后的走势
strategy_meta = {"security": "SH601939", 'date': '2018-01-02'}
this = StrategyGrid(security=strategy_meta['security'], start_date=strategy_meta['date'])
# 删除mongodb中的旧的测算数据
this.delete_collection()
# 开始测算
this.run()
结果分析
这个是重头戏,先贴上来测算的结果(如有不对,麻烦指出)
标题头部:
_id:mongodb的唯一键
Benefit:利润,赚的钱
Benefit_rate:利润率
Buy_count: 前文解释过,是统计的历史"买入-卖出"次数
Capital:本金
cost:成本
date:交易日期(买入或卖出日期)
direction:交易方向(买入或卖出)
money:买入或卖出金额
price:买入或卖出价格
security:股票代码
Shares: 当前持仓数量
Start_date:测算的开始日期
-
从2018-01-02开始,总共交易了多少次?买入和卖出各多少?
共79次,买入40次,卖出39次
-
buy_count最大和最小多少?
buy_count代表的是最多买入多少笔(最多加仓次数),最多卖出多少笔(卖飞),还是比较重要的
-
最大:5
-
最小:-3
后续还会增加matplotlib进行可视化显示,比较好分析数据。
-



