Delete stock_date_from_tushare.py

This commit is contained in:
guanjihuan 2023-09-05 12:16:22 +08:00
parent e6bca4a3a0
commit 9b913e4cf5

View File

@ -1,106 +0,0 @@
"""
This code is supported by the website: https://www.guanjihuan.com
The newest version of this code is on the web page: https://www.guanjihuan.com/archives/706
"""
import numpy as np
import time
import matplotlib.pyplot as plt
import tushare as ts
def main():
start_clock = time.perf_counter()
pro = ts.pro_api('到官网上注册寻找Token填在这里!')
print('\n我的策略:见好就收,遇低抄底。\n'
' 【卖出】买入后涨了5%就卖出\n'
' 【买入】卖出后跌了5%就买入\n'
'注:第一天必须买进,最后一天前必须卖出(为了与不操作的做对比)\n')
number = 1
for i in range(number):
data = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date') # 所有股票列表
# print(data.columns) # 查看该数据的表头
# print(data) # 3688多行的股票数据
i = 1 # 查看第二行数据“万科A”股
ts_code = data.values[i, 0] # 股票代码
stock = data.values[i, 2] # 股票名称
industry = data.values[i, 4] # 属于哪个行业
start_date = '20110101' # 开始时间
end_date = '20191027' # 结束时间
df = pro.daily(ts_code=ts_code, start_date=start_date, end_date=end_date) # 查看该股票的日线数据
# print(df.columns) # 查看该数据的表头
# print(df) # 查看该股票的日线数据
close = np.array(list(reversed(df.values[:, 5]))) # 提取出收盘价,并按时间顺序排列,从过去到现在
pct_chg = np.array(list(reversed(df.values[:, 8]))) # 提取出涨跌幅,并按时间顺序排列,从过去到现在
# print(df.columns[5], '=', close, '\n') # 查看收盘价
# print(df.columns[8], '=', pct_chg, '\n') # 查看涨跌幅
profit, profit_no_operation, times, invest_money, buy_time_all, sell_time_all = back_test(close.shape[0], close, pct_chg)
# 调用回测函数,返回了“利润,未操作的利润, 按该策略操作了几次, 总投资金额, 按该策略买的时间, 按该策略卖的时间”的值
print('\n------股票:', stock, ts_code, industry, '[买入市值=%7.2f' % invest_money, ']------')
print('回测时间段:', start_date, '-', end_date)
print('操作后利润= %6.2f' % profit, ' 买入(卖出)次数=', times, ' ')
print('不操作利润= %6.2f' % profit_no_operation, '(第一天买入,最后一天卖出,中间未操作)')
end_clock = time.perf_counter()
print('CPU执行时间=', end_clock - start_clock, 's')
plt.figure(1)
plt.title('Stock Code: '+ts_code+' (red point: buy, green point: sell)')
plt.grid()
plt.plot(range(close.shape[0]), close, '-')
for i in buy_time_all:
plt.plot(i, close[int(i)], 'or', markersize=13) # 红色是买进的点
for i in sell_time_all:
plt.plot(i, close[int(i)], 'dg', markersize=13) # 绿色是卖出的点
plt.show()
def back_test(days, close, pct_chg, money_in=10000): # 定义该策略的回测效果(按旧数据检查该策略是否有效)
money_in_amount = int(money_in/close[0]) # 投资金额换算成股票股数
invest_money = close[0]*money_in_amount # 实际买了股票的金额
profit_no_operation = (close[close.shape[0]-1]-close[0])*money_in_amount # 不操作的利润
position = -1 # 买入还是卖出的状态,默认卖出
total_profit = 0
times = 0
current_buy_pct = -999
current_sell_pct = 999
buy_time_all = np.array([])
sell_time_all = np.array([])
for i in range(days): # 总天数
if i == 0: # 第一天,满仓买买买!为了和不操作的对比,第一天就要买入。
buy_time = i # 买入时间
buy_time_all = np.append(buy_time_all, [buy_time], axis=0) # 买入时间存档
position = 1 # 标记为买入状态
print('------------------第', buy_time, '天买进-------------')
else:
profit = 0
if position == 1: # 买入状态
current_buy_pct = (close[i]-close[buy_time])/close[buy_time]*100 # 买入后的涨跌情况
# print('当前买进后的涨跌情况:第', i, '天=', current_buy_pct)
if position == 0: # 卖出状态
current_sell_pct = (close[i]-close[sell_time])/close[sell_time]*100 # 卖出后的涨跌情况
if current_sell_pct < -5 and position == 0: # 卖出状态且卖出后跌了有3%,这时候买入
buy_time = i # 买入时间
buy_time_all = np.append(buy_time_all, [buy_time], axis=0) # 买入时间存档
print('------------------第', buy_time, '天买进-------------')
position = 1 # 标记为买入状态
continue
if current_buy_pct > 5 and position == 1: # 买入状态且买入后涨了有3%,这时候卖出
sell_time = i # 卖出时间
sell_time_all = np.append(sell_time_all, [sell_time], axis=0) # 卖出时间存档
print('----------第', sell_time, '天卖出,持有天数:', sell_time-buy_time, '--------------\n')
position = 0 # 标记为卖出状态
profit = close[sell_time]-close[buy_time] # 赚取利润
times = times + 1 # 买入卖出次数加1
total_profit = total_profit + profit*money_in_amount # 计算总利润
if position == 1: # 最后一天如果是买入状态,则卖出
profit = close[i]-close[buy_time] # 赚取利润
total_profit = total_profit + profit # 计算总利润
times = times + 1 # 买入卖出次数加1
print('--------------第', i, '天(最后一天)卖出,持有天数:', sell_time-buy_time, '--------------\n')
sell_time_all = np.append(sell_time_all, [i], axis=0) # 卖出时间存档
return total_profit, profit_no_operation, times, invest_money, buy_time_all, sell_time_all
if __name__ == '__main__':
main()