全部版块 我的主页
论坛 金融投资论坛 六区 金融学(理论版) 量化投资
2008 0
2017-03-02
一、从雅虎网站获取数据
# -*- 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软件运行后,得到如下截图
微信截图_20170302122006.png 点击链接,下载数据到桌面上二、将下载的数据放到指定文件夹里,并命名# -*- 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),'%'
运行得到结果

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群