码迷,mamicode.com
首页 > 其他好文 > 详细

第25月第7天 聚宽 svm

时间:2018-10-07 22:31:21      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:append   rev   context   set   repr   ota   value   .com   targe   

1.

# 克隆自聚宽文章:https://www.joinquant.com/post/2709
# 标题:基于SVM的机器学习策略
# 作者:走得很慢的海龟

import math
import numpy as np
#from sklearn import preprocessing, cross_validation, svm
from sklearn import preprocessing, svm
import matplotlib.pyplot as plt
from matplotlib import style
import sklearn
import time
from datetime import datetime
import cPickle as pickle

def initialize(context):
    g.train=True
    
# year_date is for get_fundamentals
def train_data(year_date, index_date):
    Valuation=[]
    price=[]
    status=[]
    SZ1=get_index_stocks(‘399008.XSHE‘, date=index_date)
    SZ2=get_index_stocks(‘399012.XSHE‘, date=index_date)
    SH=get_index_stocks(‘399905.XSHE‘, date=index_date)
    tem_index=SZ1+SZ2+SH
    unix_30d=60*60*24*30
    unix_weekend=60*60*24*3
    
    q=query(
    income.code, income.pubDate, income.total_operating_revenue,
    income.total_operating_cost, income.administration_expense,
    income.operating_profit, income.non_operating_revenue,
    income.total_profit, income.net_profit, income.basic_eps,
    income.diluted_eps, income.total_composite_income
    ).filter(
    valuation.code.in_(tem_index))
    
    incm = get_fundamentals(q, statDate=year_date)
    date=incm[‘pubDate‘]
    index=incm[‘code‘]

    q=query(
    indicator
    ).filter(
    valuation.code.in_(index))
    indictor=get_fundamentals(q, statDate=year_date)
    del(indictor[‘code‘], indictor[‘statDate‘], indictor[‘pubDate‘])

    for each in range(0,len(date)):
        q=query(
        valuation.pe_ratio, valuation.pb_ratio, valuation.circulating_market_cap
        ).filter(
        valuation.code==(index[each]))
        each_valuation=get_fundamentals(q, date=date[each])
        
        date_stamp = datetime.strptime(date[each], ‘%Y-%m-%d‘)
        unix=time.mktime(date_stamp.timetuple())
        unix_30_late=unix+unix_30d
        
        Valuation.append(each_valuation.iloc[0].tolist())
        
        p1=get_price(index[each], start_date=date[each], 
        end_date=date[each], frequency=‘daily‘, fields=‘close‘)
            
        if not p1.empty:
            pass
        else:
            p1_weekend=datetime.fromtimestamp(unix-unix_weekend).strftime(‘%Y-%m-%d‘)
            p1=get_price(index[each], start_date=p1_weekend, 
            end_date=p1_weekend, frequency=‘daily‘, fields=‘close‘)
            
        p1_30d=datetime.fromtimestamp(unix_30_late).strftime(‘%Y-%m-%d‘)
        p2=get_price(index[each], start_date=p1_30d, 
        end_date=p1_30d, frequency=‘daily‘, fields=‘close‘)
        
        if not p2.empty:
            pass
        else:
            date_stamp2 = datetime.strptime(p1_30d, ‘%Y-%m-%d‘)
            unix2=time.mktime(date_stamp2.timetuple())
            unix2_weekend=unix2-unix_weekend
            p2_weekend=datetime.fromtimestamp(unix2_weekend).strftime(‘%Y-%m-%d‘)
            p2=get_price(index[each], start_date=p2_weekend, 
            end_date=p2_weekend, frequency=‘daily‘, fields=‘close‘)

        dif =  p2.values / p1.values

        if dif > 1.1:
            s=1
        else:
            s=0
        status.append(s)
        
        price.append(p1.iloc[0].tolist())
            
    Valuation=pd.DataFrame(Valuation, columns=[‘pe‘,‘pb‘,‘cir_mkt_cap‘])
    price=pd.DataFrame(price, columns=[‘price‘])
    status=pd.DataFrame(status, columns=[‘status‘])
    df=pd.concat([incm,Valuation,price,indictor,status], axis=1)
    
    del(df[‘pubDate‘], df[‘statDate.1‘], df[‘code‘])
    #y=df[‘status‘].values.tolist()
    #df=np.random.permutation(df)
    #del(df[‘status‘], df[‘code‘])
    #X=np.array(df.replace(‘NaN‘, 9999).values.tolist())
    #X=preprocessing.scale(X)
    return df

def fundamental(index):
    Valuation=[]
    price=[]
    status=[]
    
    q=query(
    income.total_operating_revenue,
    income.total_operating_cost, income.administration_expense,
    income.operating_profit, income.non_operating_revenue,
    income.total_profit, income.net_profit, income.basic_eps,
    income.diluted_eps, income.total_composite_income
    ).filter(
    valuation.code.in_(index))
    incm = get_fundamentals(q)
    
    q=query(
    valuation.pe_ratio, valuation.pb_ratio, valuation.circulating_market_cap
    ).filter(
    valuation.code.in_(index))
    Valuation=get_fundamentals(q)#.values.tolist()
    
    q=query(
    indicator
    ).filter(
    valuation.code.in_(index))
    indictor=get_fundamentals(q)#.values.tolist()
    index2=indictor[‘code‘]
    del(indictor[‘code‘], indictor[‘statDate‘], indictor[‘pubDate‘], indictor[‘day‘])
    
    for each in index2:
        p=attribute_history(each, 1, unit=‘1d‘, fields=[‘close‘], skip_paused=True)
        price.append(p.iloc[0].tolist())
        
    price=pd.DataFrame(price, columns=[‘price‘])
    df=pd.concat([incm,Valuation,price,indictor], axis=1)
    X=np.array(df.replace(‘NaN‘, 9999).values.tolist())

    X=preprocessing.scale(X)
    return X, index2

def handle_data(context, data):
    if g.train:
        index_date=str(‘2014-03-01‘)
        df1=train_data(str(‘2014q1‘),index_date)
        df2=train_data(str(‘2014q2‘),index_date)
        df3=train_data(str(‘2014q3‘),index_date)
        df4=train_data(str(‘2014q4‘),index_date)
        df=pd.concat([df1,df2,df3,df4], axis=0)
        df.iloc[np.random.permutation(len(df))]
        y=df[‘status‘].values.tolist()
        del(df[‘status‘])
        log.info("<===== shape of training dataset @ %s", str(df.shape))
        X=np.array(df.replace(‘NaN‘, 9999).values.tolist())

        X=preprocessing.scale(X)

        clf = svm.SVC(kernel=str("linear"), C=1.0)
        clf.fit(X, y)
        
        filename = "temp.pkl"
        pickle_file = open(filename, ‘wb‘)
        pickle.dump(clf, pickle_file)
        pickle_file.close()
        g.train=False
    
    filename = "temp.pkl"
    pickle_file = open(filename, ‘rb‘)
    clf = pickle.load(pickle_file)
    
    year=context.current_dt.year
    month=context.current_dt.month
    day=context.current_dt.day
    index_date=str(year)+‘-‘+str(month)+‘-‘+str(day)

    SZ1=get_index_stocks(‘399008.XSHE‘, date=index_date)
    SZ2=get_index_stocks(‘399012.XSHE‘, date=index_date)
    SH=get_index_stocks(‘399905.XSHE‘, date=index_date)
    index=SZ1+SZ2+SH
    
    X, index2=fundamental(index)

    for each in range(0, len(index2)):
        if clf.predict(X[each].reshape(1,X.shape[1]))[0] == 1 and index2[each] not in context.portfolio.positions.keys():
            log.info("===================Buying:", index2[each])
            order_target_value(index2[each], context.portfolio.cash/5)
        if clf.predict(X[each].reshape(1,X.shape[1]))[0] == 0 and index2[each] in context.portfolio.positions.keys():
            log.info("<<<<<<<<<<<<<<<<<<Holding:", context.portfolio.positions.keys())
            log.info("-------------------selling:", index2[each])
            order_target(index2[each], 0)
        
# 止损

    if context.portfolio.positions:
        for stock in context.portfolio.positions.keys():
            cur_price = data[stock].close
            position=context.portfolio.positions[stock]
            if cur_price > position.avg_cost * (1 + 0.5) or cur_price < position.avg_cost * (1 - 0.2):
                order_target(stock, 0)
                log.info("<<<<<<<<<<<", stock, "%s lose:", 1-cur_price/position.avg_cost)






    

  https://www.joinquant.com/

https://zhuanlan.zhihu.com/p/24649311

 

第25月第7天 聚宽 svm

标签:append   rev   context   set   repr   ota   value   .com   targe   

原文地址:https://www.cnblogs.com/javastart/p/9751775.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!