目录
- 一、策略的基础概念
- 二、ma20-5min策略实现
-
- 1 – 新建类AstockTrading并添加构造方法
- 2 – 方法说明
- 3 – 完整源码
一、策略的基础概念
- MA概念:移动平均线,Moving Average,简称MA,MA是用统计分析的方法,将一定时期内的证券价格(指数)加以平均,并把不同时间的平均值连接起来,形成一根MA,用以观察证券价格变动趋势的一种技术指标
- MA查看:招商银行查看 -> 点击指标 -> 搜索ma -> 点击“移动平均线”
- 5 minutes ma20:5分钟,MA20是指取最近100分钟的第5分钟、10分钟、15分钟……100分钟(20个价格)股票的收盘价的平均值
二、ma20-5min策略实现
1 – 新建类AstockTrading并添加构造方法
class AstockTrading(object):
def __init__(self, stock_code):
self.stock_code = stock_code
self._Dt = [] # 交易时间
self._Open = [] # 开盘价
self._High = [] # 最高价
self._Low = [] # 最低价
self._Close = [] # 收盘价
self._Volume = []
self._tick = None # 数据
self._last_bar_start_minute = None # 最后一次更新bar的时间
self._isNewBar = False # 是否有新bar
# 当前订单,dict, 字典
self._current_orders = {
'order1': {
'open_price': 1,
'open_datetime': '2021-10-22 9:00',
'comment': {}
}
}
# 历史订单
self._history_orders = {
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
2 – 方法说明
- get_tick:获取当前的数据
- get_history_data_from_local_machine:加载历史数据
- bar_generator:生成bar
- _buy:买入
- _sell:卖出
- strategy:执行策略
3 – 完整源码
以下代码还未进行回测,仅仅参考思路,需要可运行的请参考后续的文章
import requests
from time import sleep
from datetime import datetime, time
from dateutil import parser
# __init__,构造,初始化,实例化
class AstockTrading(object):
def __init__(self, strategy_name):
self._strategy_name = strategy_name
self._Dt = [] # 交易时间
self._Open = [] # 开盘价
self._High = [] # 最高价
self._Low = [] # 最低价
self._Close = [] # 最新价
self._Volume = []
self._tick = [] # 数据
self._last_bar_start_minute = None # 最后一次更新bar的时间
self._isNewBar = False # 是否有新bar
self._ma20 = None
# 当前订单,dict, 字典
self._current_orders = {}
# 历史订单
self._history_orders = {}
self._order_number = 0
def get_tick(self):
headers = {'Referer': "https://finance.sina.com.cn"}
page = requests.get("https://hq.sinajs.cn/list=sh600519", headers=headers)
stock_info = page.text
mt_info = stock_info.replace("\"", "").split("=")[1].split(",")
# 最新价
last = float(mt_info[1])
trade_datetime = mt_info[30] + ' ' + mt_info[31]
self._tick = (trade_datetime, last)
def get_history_data_from_local_machine(self):
# tushare 数据来源
# self.Open = [1, 2, 3]
# self.High = [2, 3, 4]
pass
# how save and import history data?
# 策略
def bar_generator(self):
# assume we have history data already
# 1、update bars,calculate 5 minutes ma20 , not daily data
# 2、compare last and ma20 -> buy or sell or pass
# assume we have history data,Open,High,Low,Close,Dt
# 这里可以是5minutes、10minutes、15minutes、20minutes、30minutes
if self._tick[0].minute % 5 == 0 and self._tick[0].minute != self._last_bar_start_minute:
self._last_bar_start_minute = self._tick[0].minute
self._Open.insert(0, self._tick[1])
self._High.insert(0, self._tick[1])
self._Low.insert(0, self._tick[1])
self._Close.insert(0, self._tick[1])
self._Dt.insert(0, self._tick[0])
self._isNewBar = True
else:
# update current bar
self._High[0] = max(self._High[0], self._tick[1])
self._Low[0] = max(self._Low[0], self._tick[1])
self._Close[0] = self._tick[1]
self._Dt[0] = self._tick[0]
self._isNewBar = False
def _buy(self, price, volume):
# create an order
self._order_number += 1
key = "order" + str(self._order_number)
self._current_orders[key] = {
"open_datetime": self._Dt[0],
"open_price": price,
"volume": volume # 股数
}
pass
def _sell(self, key, price):
self._current_orders[key]['close_price'] = price
self._current_orders[key]['close_datetime'] = self._Dt[0]
# move order from current orders to history orders
self._history_orders[key] = self._current_orders.pop(key)
def strategy(self):
# last < 0.95 *ma20 ,long position(仓位), last > ma20 *1.05, sell
if self._isNewBar:
sum_ = 0
for item in self._Close[1:21]:
sum_ = sum_ + item
self._ma20 = sum_ / 20
if 0 == len(self._current_orders):
if self._Close[0] < 0.95 * self._ma20:
# 100000/44.28 = 2258 44.28是当前价格,10万指的你拥有的钱
# 2258 -> 2200 shares
volume = int(100000 / self._Close[0] / 100) * 100
self._buy(self._Close[0] + 0.01, volume) # 这里的0.01是为了防止挂单,我们需要即可买入
elif 1 == len(self._current_orders):
if self._Close[0] > self._ma20 * 1.05:
key = self._current_orders.keys()[0]
self._sell(key, self._Close[0] - 0.01)
else: # len() = 2
raise ValueError("we have more then 1 current orders")
# Close[0] in between 0.95*ma20 and 1.05*ma20,do nothing
ma = AstockTrading('600036') # 类实例化
ma.get_history_data_from_local_machine()
# 交易时间是9:30-11:30,13:00-15:00
while time(9, 26) < datetime.now().time() < time(11, 32) \
or time(13) < datetime.now().time() < time(15, 2):
ma.get_tick()
ma.bar_generator()
ma.strategy()
# trade_time = parser.parse(ma._tick[0]).time()
# sleep(3)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121