前言

按照视频作者sentdex的意思,其实将Machine Learning(机器学习)应用在股票投资上并不难,难就难在对原始数据的获取、清洗和整理。 所以sentdex最开始的视频都是关于数据获取和清洗的教程。

视频

视频出处

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

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

优酷:Scikit Learn Machine Learning for investing Tutorial with Python p. 4

数据下载

下载地址:数据

百 度 云: 地址 密码: yyq8

内容

这个视频教学主要用到雅虎上面的财务数据,例如debt to equity, P/E, P/B等等。假设你下载了上面的数据文件, 你就会看到作者直截了当地将雅虎金融上的全部股票遍历一次,并将其历史数据保存为html形式,需要用到的时候再提取。

首先,我们从最简单的开始。 我们会用到 负债/资产比率(Debt/Equity) 单一个数据,并观察和对比能否只通过 负债/资产比率 就可以决定buy or sell 某一股票.

源代码

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)]   
    #stock_list[1:] -- 主要作用是跳过根目录intraQuarter
    for each_dir in stock_list[1:]:
        #os.listdir(each_dir):列出each_dir下的目录和文件
        each_file = os.listdir(each_dir)
        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())
                print(date_stamp, unix_time)
                
                time.sleep(15)
    
Key_Stats()

最后

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

最近一直在研究machine learning with Scikit-Learn. 但在百度下搜索到的资料无一不关于基础例子:Iris Datasets的Machine Learning。 example的编程思维很简单,代码也很简单易明。 就是因为太过简单了,以至于学完之后不会应用到其他领域。 而且鉴于AlphaGo在围棋界的大获全胜,码农们都纷纷学习tensorflow。 tensorflow我也接触过,但不想还没学会走路就想学跑步。 所以决定重新投向scikit-learn的怀抱。

Scikit-learn For Investing

youtube是一个神奇的地方,你想不到的它都有。 多谢youtube上的一位作者 Sentdex 提供的“Scikit-learn Machine Learning with Python and SKlearn” 教学, 建议能翻墙的和懂英文的都看看。

以下是视频教学的相关描述:

How to use Scikit-learn (sklearn) with the python programming language to do Machine Learning with Support Vector Machines. Covered specifically here, we learn how to use Linear SVC to see if we can determine, based on fundamental information, whether a stock is likely to outperform the market or not.

文章更新编号

鉴于原视频中p1-p3都是关于sklearn的svm和股票专用术语描述,所以此系列的视频从p4开始。

最后

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

内置 zip函数 可以让我们使用 for 循环来并行使用多个序列。在基本运算中, zip会取得一个或多个序列为参数,然后返回元组的列表,将这些序列中的并排的元素配成对。

示例一

L1 = [1,2,3,4]
L2 = [5,6,7,8]

要合并这些列表中的元素,可以使用zip来创建一个元组对的列表。与range一样,zip是一个可迭代对象,因此,必须将其包含在一个list调用中一边一次性显示所有结果。

zip(L1,L2)
list(zip(L1,L2)) !注释掉这一行,运行结果依然如次
for (x,y) in zip(L1,L2):
      print(x,'+',y,'=',x + y)

运行结果为:
1 + 5 = 6
2 + 6 = 8
3 + 7 = 10
4 + 8 = 12

示例二

L1 = [1,2,3,4]
L2 = [5,6,7,8]
L3 = [9,10,11,12]
zip(L1,L2,L3)
list(zip(L1,L2,L3))
for (x,y,z) in zip(L1,L2,L3):
      print(x,'+',y,'+',z,'=',x + y + z)
结果为:
1 + 5 + 9 = 15
2 + 6 + 10 = 18
3 + 7 + 11 = 21
4 + 8 + 12 = 24

严格来讲,zip比这个例子更一般化。可以有接受任何类型的序列(就是任何可迭代的对象,包括文件),可以有两个以上的参数。当参数长度不同时,zip会以最短序列的长度为准来截断所得到的的元组。

在Python 2.X中,相关的内置map函数,用类似方式把序列的元素配对起来,但是如果参数长度不同,则会为较短的序列用None补齐。而python3不再支持该函数。一般来讲,map会带一个函数,以及一个或多个的序列参数,然后用从序列中取出的并行元素调用函数的结果收集起来。

使用zip构造字典,非常方便。

示例

keys = ['spam','eggs','toast']
vals = [1,3,5]
list(zip(keys,vals)) 
D2 = {}
for (k,v) in zip(keys,vals):
      D2[k] = v
print(D2)
运行结果为:{'toast': 5, 'eggs': 3, 'spam': 1}

在python2.2和后续版本中,可以完全跳过for循环,直接把zip过的健/值列表传给内置的dict构造函数,以上划线部分可以换做D3 = dict(zip(keys,vals))。

内置变量名dict其实是python中的类型名称。

最近一直在学sentdex的python教学视频,其中里面提到了format 函数。 当时候我第一次遇到这个函数,我压根不明白{} 和 .format 之间的联系 。后来自己测试了一番,终于明白了个中的奥秘。

for ticker in tickers:
        if not os.path.exists('stock_dfs/{}.csv'.format(ticker)):
            df = web.DataReader(ticker, "yahoo", start, end)
            df.to_csv('stock_dfs/{}.csv'.format(ticker))
        else:
            print('Already have {}'.format(ticker))

定义

花括号声明{}、用于渲染前的参数引用声明, 花括号里可以用数字代表引用参数的序号, 或者变量名直接引用。

例子

我随机的在wikipedia复制黏贴了一段话,然后将这段话以空格分开。 最后的用for 遍历这段话并输出。

我发现了其实{}的作用是显示任意内容i。 但这个过程需要结合.format()来达到这个目的。

text = 'At the time of my writing this, Yahoo did not throttle me at all and I was able to run this all the way through without any '

flow = text.split(' ')

for i in flow:  
    print('this is a SPLIT with text: {}'.format(i))

输出

this is a SPLIT with text: At
this is a SPLIT with text: the
this is a SPLIT with text: time
this is a SPLIT with text: of
this is a SPLIT with text: my
this is a SPLIT with text: writing
this is a SPLIT with text: this,
this is a SPLIT with text: Yahoo
this is a SPLIT with text: did
this is a SPLIT with text: not
this is a SPLIT with text: throttle
this is a SPLIT with text: me
this is a SPLIT with text: at
this is a SPLIT with text: all
this is a SPLIT with text: and
this is a SPLIT with text: I
this is a SPLIT with text: was
this is a SPLIT with text: able
this is a SPLIT with text: to
this is a SPLIT with text: run
this is a SPLIT with text: this
this is a SPLIT with text: all
this is a SPLIT with text: the
this is a SPLIT with text: way
this is a SPLIT with text: through
this is a SPLIT with text: without
this is a SPLIT with text: any

import pandas as pd
import tushare as ts
 
stock_data=ts.get_hist_data('300243')
stock_data.sort(inplace=True)
stock_data['60D']=pd.rolling_mean(stock_data['close'],window=60) 
stock_data[['close','60D']].plot(figsize=(8,4))

显示效果: