読者です 読者をやめる 読者になる 読者になる

tataboxの備忘録

データ解析、画像解析、化学分析などなど

Pythonで株・為替・先物解析 その1

Pythonで株・為替・先物解析の解析をしてみる。
そのままmatplotlibで描画すると土日祝日が空欄になるため、軸を別設定した。

import jsm
import datetime
import pandas as pd
import matplotlib.dates as mdate
import matplotlib.finance
import pylab as plt
import numpy as np
import sqlite3
import pandas.io.sql as psql

##################
#set stock number
##################
stock_name = 8411

#SQLlite
con = sqlite3.connect("data.db")
c = con.cursor()
try:
    c.execute("""create table all_sort(name integer ,date integer ,open integer ,high integer ,low integer ,close integer ,volume integer);""")
except:
    sql = 'select name,date from all_sort'
    a = c.execute(sql)
    for i, j in a:
        print i,j

#JSMによる日足習得
d = datetime.datetime.today()
q = jsm.Quotes()

start_date = datetime.date(2015, 1, 1)

yesterday = datetime.date.today() - datetime.timedelta(1)
end_date = yesterday

this_year = q.get_historical_prices(stock_name, jsm.DAILY, start_date, end_date)

#SQLに格納後Pandasへ移す
quotes = []
days=[]

colums_sql= u"insert into all_sort values(?,?,?,?,?,?,?)"
for i,each_day in enumerate(this_year):
    day =mdate.date2num(each_day.date)
    days.append(tuple([day]))
    quotes.append([i,each_day.open,each_day.close,each_day.high,each_day.low])
    for_sql = [stock_name,each_day.date,each_day.open,each_day.close,each_day.high,each_day.low,each_day.volume]
    c.execute(colums_sql,for_sql)

sql = 'select * from all_sort'
df = psql.read_sql(sql,con)

df2 = df[df['name'] == stock_name]
df2['date'] = df2['date'].apply(pd.to_datetime)

ascend_df = df2.sort_index(by='date',ascending=True)

#con.commit()


############################
#plot
############################

# SMA EMA
sma5 = pd.rolling_mean(df['close'], window=5)
sma5 = sma5.dropna()

ewma = pd.stats.moments.ewma
ewma5 = ewma(df['close'], span=5)

ewma25 = ewma(df['close'], span=25)
#ewma25 = ewma25.dropna()

#ロウソク足で描画
fig = plt.figure()
fig.subplots_adjust(bottom=0.2)
ax = fig.add_subplot(111)
ax.set_xticks(range(0,len(quotes),5))
ax.set_xticklabels([mdate.num2date(days[index][0]).strftime('%y %b %d') for index in ax.get_xticks()]) 

matplotlib.finance.candlestick(ax, quotes,colorup='red',colordown='blue')
ax.xaxis_date()
ax.autoscale_view()
plt.plot(sma5,label="SMA5")
plt.plot(ewma5,label="EMA5")
plt.plot(ewma25,label="EMA25")
plt.setp( plt.gca().get_xticklabels(),rotation=90, horizontalalignment='left')
plt.legend(loc="best")
ax.invert_xaxis()
plt.show()

f:id:tatabox2000:20150531224918p:plain 後日修正予定。

次回はコマ足(平均足)を検討する予定

参考

How do I plot only weekdays using Python's matplotlib candlestick? – | Mauricio

pandas - ローソク足チャートと移動平均線のプロット - Qiita

VBAでソート

とりあえず書いてみた。

以下のようなデータがあるとして

pos    cur     lots        price  
Buy     USD     10,000,000   120.5  
Buy     USD     10,000,000   119.5  
Buy     EUR     1,000,000    132.5  
Buy     EUR     1,000,000    130.5  
Sell    USD     10,000,000   121.5  
Buy     USD     10,000,000   118.5  
Sell    USD     10,000,000   122.5  

posやcur、up or down指定で並べ替え後、行頭に移動

pos    cur     lots        price  
Buy     USD     10,000,000   120.5  
Buy     USD     10,000,000   119.5  
Buy     USD     10,000,000   118.5  
Sell    USD     10,000,000   121.5  
Sell    USD     10,000,000   122.5  
Buy     EUR     1,000,000    132.5  
Buy     EUR     1,000,000    130.5  

VBAのコード

Sub sort_cur_pos()
    Dim first_row As Long
    Dim last_row As Long
    Dim row_counts As Long
    Dim cur As String
    Dim pos As String
    Dim up_or_down As String
    
    'ソートする項目と方法を指定
    cur = "USD"
    pos = "Sell"
    up_or_down = "up"
    
    '全体選択
    cells(1, 1).Select
    Selection.CurrentRegion.Select
    
    '行数のカウント
    all_row_end = ActiveWindow.RangeSelection.End(xlDown).Row
    
    '全体を選択してプレソート
    cells_area = ActiveWindow.RangeSelection.Address
    Worksheets("Sheet1").Range(cells_area) _
             .Sort Key1:=cells(1, 2), order1:=xlDescending, _
             Key2:=cells(1, 1), order2:=xlAscending
    
    '指定項目の範囲を調査して格納
    For i = 1 To all_row_end Step 1
        If cells(i, 2) = cur Then
            If cells(i, 1) = pos Then
                If first_row = 0 Then
                    first_row = i
                    last_row = i
                Else
                    last_row = i
                End If
            End If
        End If
    Next
    
    '指定項目を指定方向にソート
    If up_or_down = "up" Then
        Worksheets("Sheet1").Range(cells(first_row, 1), cells(last_row, 4)) _
             .Sort Key1:=cells(first_row, 4), order1:=xlAscending
    End If
    If up_or_down = "down" Then
        Worksheets("Sheet1").Range(cells(first_row, 1), cells(last_row, 4)) _
             .Sort Key1:=cells(first_row, 4), order1:=xlDescending
    End If
    
    '指定項目の位置を切り出して先頭に挿入
    Rows(first_row & ":" & last_row).Cut
    Rows("1:1").Insert Shift:=xlShiftDown
    
    '指定項目の範囲を選択
    row_counts = last_row - first_row + 1
    Range(cells(1, 1), cells(row_counts, 4)).Select
    
End Sub

リストを昇順、降順にする関数がないため、今回のように1)ワークシート内に記入した内容でソートする、
以外だと、2)自分でソートを実装する、3).netのArraylistを利用する事になる。

PyQt(PySide)とOpenCVで画像処理その7(日本語処理)

OSを判定して日本語対応させる。 os.nameがntならcp932、それ以外ならutf-8エンコードする。

import os
import PySide
from PySide import QtCore,QtGui
import cv2
#OSチェック
def os_check():
  #windows
    if os.name is 'nt':
        code = 'cp932'
        return code
  #Unix、Mac
    if os.name is not 'nt':
        code = 'utf-8'
        return code

def open_file(code):
    filename = QtGui.QFileDialog.getOpenFileName(filter="Image Files (*.png *.bmp *jpg)")
  #日本語をエンコードして文字化け回避
    filename = filename[0].encode(code)
        im = cv2.imread(filename)
    cv2.imshow("",im)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    code = os_check()
    open_file(code)

PyQt(PySide)とOpenCVで画像処理その6(サブウィンドウ)

久しぶりの更新。以下の続き
PyQt(PySide)とOpenCVで画像処理その5(イベントフィルター) - tataboxの備忘録

PyQt(PySide)でサブウィンドウを呼び出したり、ウィジットを追加してみる。

1.QtDesigner で下のように作る

Main window (ファイル名:main.ui objectname: main)

f:id:tatabox2000:20150301223801p:plain

Widget (ファイル名:widget.ui objectname:widget)

f:id:tatabox2000:20150301215956p:plain

Dialog (ファイル名:dialog.ui objectname:dialog)

f:id:tatabox2000:20150301215949p:plain

2.フォルダに移動し、コマンドライン上でpythonのコードに変換

pyside-uic -o main.py main.ui
pyside-uic -o widget.py widget.ui
pyside-uic -o dialog.py dialog.ui

3.同一フォルダに以下の内容で作成し、実行

import PySide
from PySide import QtCore,QtGui
import sys

from main import Ui_main
from dialog import Ui_dialog
from widget import Ui_widget

class Main(QtGui.QMainWindow,Ui_main):
 def __init__(self, parent = None):
        super(Main, self).__init__(parent)
        self.ui = Ui_main()
    self.setupUi(self)
    self.button.clicked.connect(self.pushButton)

    QtCore.QObject.connect(self.actionLoad_Dialog, QtCore.SIGNAL("triggered()"), self.pushMenu)


 def pushButton(self):
     self.widget = Widget(self)
     self.widget.show()
 def pushMenu(self):
     self.dialog = Dialog(self)
     self.dialog.show()

class Dialog(QtGui.QDialog,Ui_dialog):
 def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        self.setupUi(self)

class Widget(QtGui.QWidget,Ui_widget):
 def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.setupUi(self)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    dmw = Main()
    dmw.show()
    sys.exit(app.exec_())
menu 中のload Dialogを押す

f:id:tatabox2000:20150301224228p:plain

load widgetボタンを押す

f:id:tatabox2000:20150301224409p:plain

Widgetは内部、Dialogは別窓で表示される。

参考

python - How to create new PyQt4 windows from an existing window? - Stack Overflow

python+Opencvによる画像処理10(線や文字の書き込み)

画像にスケールを書き込む必要があり、線や文字の書き込み法を調べたのでメモ。

(1) 線の書き込み
cv2.line(image,(start_x,start_y),(end_x,end_y),color,thickness)
(2)文字の書き込み
cv2.putText(image,text,(start_x,start_y),font, font size,color)

フォントの種類(これのみ、日本語は多分不可)

FONT_HERSHEY_COMPLEX
FONT_HERSHEY_COMPLEX_SMALL
FONT_HERSHEY_DUPLEX
FONT_HERSHEY_PLAIN
FONT_HERSHEY_SCRIPT_COMPLEX
FONT_HERSHEY_SCRIPT_SIMPLEX
FONT_HERSHEY_SIMPLEX
FONT_HERSHEY_TRIPLEX
FONT_ITALIC
実行結果

f:id:tatabox2000:20141006011119p:plain

参考

Drawing Functions in OpenCV — OpenCV 3.0.0-dev documentation

PyQt(PySide)とOpenCVで画像処理その5(イベントフィルター)

前回の続きということで、マウス操作にてカーソル位置の取得を行う。 PyQt(PySide)とOpenCVで画像処理その4(右クリックメニュー) - tataboxの備忘録

イベントフィルターを使用する。 前回のコードに下記を追加

 def __init__(self, parent = None):
 
・
・
・
 
#ここから
        #イベントフィルターの追加
    self.pic_View.installEventFilter(self)


 #イベントフィルター時に実施する関数
 def eventFilter(self, source, event):
    #画像表示部の情報をマウスボタンを押す際に取得
       if (event.type() == QtCore.QEvent.MouseButtonPress and source is self.pic_View):
    #右クリックはコンテキストメニュー用に例外処理
        if event.button() == QtCore.Qt.RightButton:
            pass
        else:
     #マウス位置の取得
            pos = event.pos()
     #メッセージボックスで表示
            msgbox = QtGui.QMessageBox(self)
            msgbox.setText('mouse position: (%d, %d)' % (pos.x(), pos.y()))
     #メッセージボックスの表示
            ret = msgbox.exec_()
   #戻り値が必要
    return QtGui.QWidget.eventFilter(self, source, event)

左orホイールクリックで、メッセージボックスにカーソルの座標が表示される

f:id:tatabox2000:20140916193929j:plain

ホイールに拡大縮小、左クリックに元倍率、右クリックにコンテキストメニューを割り振る予定。

参考

python - PyQt: how to handle event without inheritance - Stack Overflow

PyQt(PySide)とOpenCVで画像処理その4(右クリックメニュー)

前回の続き。コンテキストメニュー(右クリックメニュー)の追加方法について。

PyQt(PySide)で画像処理その3(OpenCVとの連携) - tataboxの備忘録

main_setup.pyに下記を追記

 def __init__(self, parent = None):
 
・
・
・
 
#ここから
        pic_view = self.pic_View
    #コンテキストメニューの表示
        pic_view.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
    #コンテキストメニューを定義する関数との接続
        pic_view.customContextMenuRequested.connect(self.contextMenue)

 def contextMenue(self,event):
    #メニュー(Qメニュー)
        menu = QtGui.QMenu()
    #項目名と実行する関数の設定
    menu.addAction('canny',self.make_canny)
    menu.addAction('test1',self.make_canny)
    menu.addAction('test2',self.make_canny)

    #マウス位置に出現
        menu.exec_(QtGui.QCursor.pos())

右クリックでメニューが追加表示される。

f:id:tatabox2000:20140916184209j:plain