Scikit Learn 股票投资:p8

前言

本视频主要是关于如何将股票和指数的价格转换为百分比变化, 观察两者之间的联系和相关性,然后可以根据其相关性选出优于大盘的股票。

视频

视频出处

视频系列:Scikit-learn Machine Learning with Python and SKlearn

本视频出处:Scikit Learn Machine Learning for investing Tutorial with Python p. 8

哔哩哔哩:Scikit Learn Machine Learning for investing Tutorial with Python p. 8

数据下载

下载地址:数据

百 度 云: 地址 密码: yyq8

内容

首先在pd.DataFrame后面添加新的列名称,stock_p_changesp500_p_change作为显示价格变化。

df = pd.DataFrame(columns = ['Date',
                             'Unix',
                             'Ticker',
                             'DE Ratio',
                             'Price',
                             'SP500',
                             'stock_p_change',
                             'sp500_p_change',])

然后在df = df.append后面添加 stock_p_change’: stock_p_change , ‘sp500_p_change’: sp500_p_change 相对应的数据用作显示数据。

df = df.append({'Date':date_stamp,
                                    'Unix':unix_time,
                                    'Ticker':ticker,
                                    'Price':stock_price,  
                                    'SP500':sp500_value,
                                    'DE Ratio':value,
                                    'stock_p_change': stock_p_change,
                                    'sp500_p_change': sp500_p_change}, ignore_index=True)

之后,在代码中间添加:

#合并股票代码
ticker_list.append(ticker)

#重置股票的数据,以单只股票重新开始
starting_stock_value = False
starting_sp500_value = False

starting_stock_value = False和starting_sp500_value = False的作用是,每次遍历不同股票的时候我们要计算其价格的百分比变化,但每只股票都是独立的,所以每次计算的时候我们都需要一个新的starting point去区别每一只股票。 这样做就不会出现计算aapl的价格却用了aa的数据。

接下来就是添加计算百分比的代码:

#用于判断starting_stock_value和starting_sp500_value是否为False
if not starting_stock_value:
	starting_stock_value = stock_price
if not starting_sp500_value:
	starting_sp500_value = sp500_value  
#计算价格变化百分比
stock_p_change = (stock_price - starting_stock_value) / starting_stock_value * 100
sp500_p_change = (sp500_value - starting_sp500_value) / starting_sp500_value * 100

源代码


import matplotlib.pyplot as plt
from sklearn import datasets
import pandas as pd
import os
import time
from datetime import datetime

#获取数据的具体路径
path = '../intraQuarter'

#定义一个function,默认值为Total Debt/Equity (mrq),以后可以更改为其他
def Key_Stats(gather="Total Debt/Equity (mrq)"):
    statspath = path+'/_KeyStats'

    #os模块提供的walk方法很强大,能够把给定的目录下的所有目录和文件遍历出来。
    #方法:os.walk(path),遍历path,返回一个对象,他的每个部分都是一个三元组,('目录x',[目录x下的目录list],目录x下面的文件)
    stock_list = [x[0] for x in os.walk(statspath)]

    df = pd.DataFrame(columns = ['Date',
                                 'Unix',
                                 'Ticker',
                                 'DE Ratio',
                                 'stock_p_change',
                                 'Price','SP500',
                                 'sp500_p_change'])

    sp500_df = pd.DataFrame.from_csv('SPY.csv')

    ticker_list = []

    #stock_list[1:] -- 主要作用是跳过根目录intraQuarter
    #25的目的是只遍历25个文件更快运行测试
    for each_dir in stock_list[1:25]:
        #os.listdir(each_dir):列出each_dir下的目录和文件
        each_file = os.listdir(each_dir)
        ticker = each_dir.split("\\")[1]
        ticker_list.append(ticker)

        starting_stock_value = False
        starting_sp500_value = False

        if len(each_file) > 0:
            for file in each_file:
                #将文件名转换为时间序列
                date_stamp = datetime.strptime(file, '%Y%m%d%H%M%S.html')
                #转换为unix_time
                unix_time = time.mktime(date_stamp.timetuple())    
                full_file_path = each_dir+'/'+file
                #读取html文件
                source = open(full_file_path, 'r').read()
                try:
                    #读取html后并以gather + ':</td><td class="yfnc_tabledata1">作为split,提取第一位元素,然后将后面</td>作为结束
                    value = float(source.split(gather + ':</td><td class="yfnc_tabledata1">')[1].split('</td>')[0])

                    try:
                        sp500_date = datetime.fromtimestamp(unix_time).strftime('%Y/%m/%d')
                        row = sp500_df[(sp500_df.index ==sp500_date)]
                        sp500_value = float(row['Adj Close'])
                    except:
                        sp500_date = datetime.fromtimestamp(unix_time-259200).strftime('%Y/%m/%d')
                        row = sp500_df[(sp500_df.index ==sp500_date)]
                        sp500_value = float(row['Adj Close'])

                    stock_price =  float(source.split('<#/small><#big><#b>')[1].split('<#/b><#/big>')[0])   
#                    print('stock_price:', stock_price, 'ticker:', ticker)  

                    if not starting_stock_value:
                        starting_stock_value = stock_price
                    if not starting_sp500_value:
                        starting_sp500_value = sp500_value                        
                    stock_p_change = (stock_price - starting_stock_value) / starting_stock_value * 100
                    sp500_p_change = (sp500_value - starting_sp500_value) / starting_sp500_value * 100



                    #将数据叠加并保存在字典里面
                    df = df.append({'Date':date_stamp,
                                    'Unix':unix_time,
                                    'Ticker':ticker,
                                    'Price':stock_price,
                                    'stock_p_change': stock_p_change,
                                    'SP500':sp500_value,
                                    'DE Ratio':value,
                                    'sp500_p_change': sp500_p_change}, ignore_index=True)
                except Exception as e:
                    pass

    #将gather="Total Debt/Equity (mrq)" 中的多余符号去掉,作为文件名          
    save = gather.replace(' ','').replace('(','').replace(')','').replace('/','')+ ('.csv')
    print(save)
    df.to_csv(save)

Key_Stats()

最后

虽然分c君_BingWong只是作为一名搬运工,连码农都称不上。 但制作代码中的注释、翻译和搬运都花了很多时间,请各位大侠高抬贵手,在转载时请注明出处。

阅读量: | 柯西君_BingWong | 2017-08-31