一、从雅虎网站获取数据
# -*- coding: utf-8 -*-
import os,urllib2,urllib
ticker =
raw_input(
'code:')
#the Ticker Symbol 600487.ss
date1 = (
2012,
1,
1 )
#begining time
date2 = (
2017,
2,
11 )
#ending time 2017年2月10日
print date2[
1]-
1, date2[
2], date2[
0]
d1 = (date1[
1]-
1, date1[
2], date1[
0])
#date1[1]-1=0, date1[2]=1, date1[0]=2012
d2 = (date2[
1]-
1, date2[
2], date2[
0])
#date2[1]-1=10, date1[2]=2, date1[0]=2017
g=
'd'
urlFmt =
'http://table.finance.yahoo.com/table.csv?a=%d&b=%d&c=%d&d=%d&e=%d&f=%d&s=%s&y=0&g=%s&ignore=.csv'
url = urlFmt % (d1[
0], d1[
1], d1[
2], d2[
0], d2[
1], d2[
2], ticker, g)
#the url of historical data
print url
path =
r'C:\Users\yinyao\Desktop\Python code' #Saving path
file_name =
r'\ticker.csv' #file name
dest_dir = os.path.join(path,file_name)
#located file 600487.ss
urllib.urlretrieve(url,dest_dir)
#download the data and put in located file
利用pycharm软件运行后,得到如下截图
点击链接,下载数据到桌面上二、将下载的数据放到指定文件夹里,并命名# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
import csv
# import get_stock_from_yahoo
#运行此程序需要先将雅虎财经上的股票数据下载下来,放入指定的文件夹里,见get_stock_from_yahoo.py
#一、打开csv文件,用的是函数打开,如果不用函数打开,需要重复打开
def open_csv(file,i): #定义打开csv函数
myfile = open(file,'r') #需要打开的文件,例子'd:\stock\\600487.ss.csv'
reader=csv.reader(myfile) #读取csv文件
row = [row for row in reader] #读取csv文件的每一列,并存入一个变量中
return row
file = 'd:\stock\\002271w.csv'
Date=open_csv(file,0)#读取时间
Open=open_csv(file,1)#开盘价
High=open_csv(file,2)
Low=open_csv(file,3)
Close=open_csv(file,4)
Volume=open_csv(file,5)#成交量
Adj_Close=open_csv(file,6)#复权价
#删除停牌数据,这里用成交量为0 时代表停牌
def option(row):
option=[row for i in range(1,len(row)) if not(Volume==str('000'))]#注意成交量为0时的类型,字符串'000"
return option
#读取调整后的列
date = option(Date)
open =option(Open)
high =option(High)
low =option(Low)
close =option(Close)
volume=option(Volume)
adj_close =option(Adj_Close)
#对调整后的数据进行索引
dic={'date':date,'open':open,'high':high,'low':low,'close':close,'adj_close':adj_close}
#打开二维数据
stock_data=pd.DataFrame(dic)
#按照‘date’列队数据进行排序
stock_data.sort_values('date', ascending=True, inplace=True)
#计算'EMA_12','EMA_26','DIF','DEA','MACD'的值
stock_data['EMA_12'] = stock_data['adj_close'].ewm(span=12).mean() # alpha = 2 / (span + 1)
stock_data['EMA_26'] = stock_data['adj_close'].ewm(span=26).mean() # alpha = 2 / (span + 1)
stock_data['DIF'] = stock_data['EMA_12']- stock_data['EMA_26']
stock_data['DEA'] = stock_data['DIF'].ewm(span=9).mean()
stock_data['MACD'] = (stock_data['DIF']-stock_data['DEA'])*2
#数据存储
stock_data.to_csv(str(file)+'_after.csv', index=False)
#打开数据计算策略
stock_data_final = pd.read_csv(str(file)+'_after.csv')
#将二维数据按照列打开,形成列表,定义函数
def macd_option(row):
option=[row for i in range(0,len(row))]
return option
MACD = macd_option(stock_data_final['MACD'])
# DIF = macd_option(stock_data_final['DIF'])#list
DEA = macd_option(stock_data_final['DEA'])
price=macd_option(stock_data_final['adj_close'])
current_price=macd_option(stock_data_final['close'])
time=macd_option(stock_data_final['date'])
#定义初始资金
cash = 100000.00
#依次读取列表中的元素
for i in range(1,len(MACD)):
for j in range(1,len(MACD)):
if j>i: #j>i 去除一些重复值,使之满足条件后从j值开始
crossup =float( MACD)> float( MACD[i-1]) and float( MACD[i-1])< float( MACD[i-2]) #and MACD>0 #DIF上突破
crossdown=float( MACD[j])< float( MACD[j-1]) and float( MACD[j-1])> float( MACD[j-2])#DIF下突破
if crossup and crossdown :#满足DIF上突破和DIF下突破这个区间的情况下
#买入情况需要注意的几个参数
price_buy= float(price)#复权买入价
current_price_buy = float(current_price) #如果满足买入条件,使用当天的收盘价进行买入,真实价格,防止后一天除权除息
amount = cash/current_price_buy-((cash/current_price_buy)%100) #买入时的股数
commission_charge_buy=max((amount*current_price_buy)*0.0003//1,5) #买入的手续费
print commission_charge_buy,amount
real_cash_buy = amount*current_price_buy#真正买入的资金
left_cash_buy=cash-amount*current_price_buy-commission_charge_buy #剩余资金
#这里需要注意的事情是采用的是真实的价格成交,而股价交易时会又除权出息,所以按照资金复权价的计算收益
price_sell = float(price[j]) #如果满足卖出条件,记录下卖出复权价
increase=(price_sell-price_buy)/price_buy #计算涨幅
revence1=increase*real_cash_buy-commission_charge_buy #未卖出时一次获得的收益
flow_cash = real_cash_buy + revence1 #买入资金+未卖出时一次获得的收益
commission_charge_sell=max((flow_cash)*0.0003//1,5) #卖出手续费
tax_cost=(flow_cash)*0.0001//1#印花税
revence=revence1-commission_charge_sell-tax_cost #买卖一次获得的收益
print'i=',i, 'j=',j,'time_buy=',time,'time_sell=',time[j],'MACD_buy=',float(MACD),'MACD_sell=',float( MACD[j]),\
'price_buy=',price_buy,'price_sell=',round(price_sell,3),'cash=',cash,'real_cash_buy=',\
real_cash_buy,'left_cash_buy=',left_cash_buy
i=j
j+=1
cash+=revence
print round(cash,3),'revence=',round(revence,2),'increase涨幅:',round(increase*100,2),'%'
运行得到结果